From: sashiko-bot@kernel.org
To: "Maíra Canal" <mcanal@igalia.com>
Cc: robh@kernel.org, conor+dt@kernel.org, devicetree@vger.kernel.org,
dri-devel@lists.freedesktop.org
Subject: Re: [PATCH v2 3/4] drm/vc4: Use the reset controller to recover from a GPU hang
Date: Tue, 15 Sep 2026 21:04:44 +0000 [thread overview]
Message-ID: <20260915210445.42B2C1F000FF@smtp.kernel.org> (raw)
In-Reply-To: <20260915-vc4-reset-control-v2-3-cb3a25b07822@igalia.com>
Thank you for your contribution! Sashiko AI review found 2 potential issue(s) to consider:
- [High] drm/vc4: UAF in vc4_job_done_work() due to missing hardware reset
- [Medium] drm/vc4: component re-bind fails due to devm_reset_control in bind
--
commit 8ebe4ef2282246bb3aa856ccf103a302ccfae13f
Author: Maíra Canal <mcanal@igalia.com>
drm/vc4: Use the reset controller to recover from a GPU hang
This patch switches the GPU recovery mechanism from a runtime PM power cycle
to using a dedicated V3D reset line. It also leaves the runtime PM wrapper
functions as simple passthroughs and makes the reset line optional for older
device trees.
> diff --git a/drivers/gpu/drm/vc4/vc4_gem.c b/drivers/gpu/drm/vc4/vc4_gem.c
> index e231c906709c1..3212b91676201 100644
> --- a/drivers/gpu/drm/vc4/vc4_gem.c
> +++ b/drivers/gpu/drm/vc4/vc4_gem.c
[ ... ]
> @@ -292,19 +292,22 @@ vc4_save_hang_state(struct drm_device *dev)
> static void
> vc4_reset(struct drm_device *dev)
> {
> - struct vc4_dev *vc4 = to_vc4_dev(dev);
> + struct vc4_v3d *v3d = to_vc4_dev(dev)->v3d;
> + int ret;
>
> - DRM_INFO("Resetting GPU.\n");
> + vc4_irq_disable(dev);
>
> - mutex_lock(&vc4->power_lock);
> - if (vc4->power_refcount) {
> - /* Power the device off and back on the by dropping the
> - * reference on runtime PM.
> - */
> - pm_runtime_put_sync_suspend(&vc4->v3d->pdev->dev);
> - pm_runtime_get_sync(&vc4->v3d->pdev->dev);
> + if (v3d->reset) {
> + drm_info(dev, "Resetting GPU.\n");
> +
> + ret = reset_control_reset(v3d->reset);
> + if (ret)
> + drm_err(dev, "Failed to reset the GPU: %d\n", ret);
> +
> + vc4_v3d_init_hw(dev);
> + } else {
> + drm_info_once(dev, "No reset line; GPU state is not reset.\n");
> }
> - mutex_unlock(&vc4->power_lock);
>
> vc4_irq_reset(dev);
[Severity: High]
Does this create a use-after-free on older device trees where v3d->reset is
NULL?
By removing the runtime PM suspend/resume cycle, the hardware is no longer
reset on older platforms. However, the driver continues to unconditionally
call vc4_irq_reset() which cancels jobs and finishes render jobs:
vc4_irq_reset()
vc4_cancel_bin_job(dev)
vc4_irq_finish_render_job(dev)
These routines signal the job fences and schedule vc4_job_done_work, which
frees the GEM memory. If the GPU hardware is still executing because the
reset was skipped, won't it asynchronously access this freed memory when it
eventually makes progress?
[ ... ]
> diff --git a/drivers/gpu/drm/vc4/vc4_v3d.c b/drivers/gpu/drm/vc4/vc4_v3d.c
> index a86739873e05b..b40d98c9d1d28 100644
> --- a/drivers/gpu/drm/vc4/vc4_v3d.c
> +++ b/drivers/gpu/drm/vc4/vc4_v3d.c
[ ... ]
> @@ -447,6 +427,14 @@ static int vc4_v3d_bind(struct device *dev, struct device *master, void *data)
> if (IS_ERR(v3d->clk))
> return dev_err_probe(dev, PTR_ERR(v3d->clk), "Failed to get V3D clock\n");
>
> + v3d->reset = devm_reset_control_get_optional_exclusive(dev, NULL);
> + if (IS_ERR(v3d->reset))
> + return dev_err_probe(dev, PTR_ERR(v3d->reset),
> + "Failed to get reset control\n");
> +
> + if (!v3d->reset)
> + drm_warn(drm, "No V3D reset line in the device tree");
> +
> ret = platform_get_irq(pdev, 0);
[Severity: Medium]
Will this cause component re-bind operations to fail?
Since devm allocations are tied to the device's initial probe lifecycle rather
than the component bind/unbind lifecycle, the exclusive reset control is not
released when the component is unbound.
If the DRM master device is unbound and then rebound, wouldn't a subsequent
bind attempt fail with -EBUSY because the leaked initial allocation still
holds the exclusive lock on the reset line?
--
Sashiko AI review · https://sashiko.dev/#/patchset/20260915-vc4-reset-control-v2-0-cb3a25b07822@igalia.com?part=3
next prev parent reply other threads:[~2026-09-15 21:04 UTC|newest]
Thread overview: 9+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-09-15 20:51 [PATCH v2 0/4] drm/vc4: Reset the V3D block through the reset controller Maíra Canal
2026-09-15 20:51 ` [PATCH v2 1/4] drm/vc4: Drop the undocumented brcm,vc4-v3d compatible Maíra Canal
2026-09-15 20:51 ` [PATCH v2 2/4] dt-bindings: display: bcm2835-v3d: Add an optional reset line Maíra Canal
2026-09-18 8:55 ` Krzysztof Kozlowski
2026-09-15 20:51 ` [PATCH v2 3/4] drm/vc4: Use the reset controller to recover from a GPU hang Maíra Canal
2026-09-15 21:04 ` sashiko-bot [this message]
2026-09-15 20:51 ` [PATCH v2 4/4] ARM: dts: bcm2835: Add the V3D reset line Maíra Canal
2026-09-15 21:03 ` sashiko-bot
2026-09-18 18:55 ` [PATCH v2 0/4] drm/vc4: Reset the V3D block through the reset controller Maíra Canal
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20260915210445.42B2C1F000FF@smtp.kernel.org \
--to=sashiko-bot@kernel.org \
--cc=conor+dt@kernel.org \
--cc=devicetree@vger.kernel.org \
--cc=dri-devel@lists.freedesktop.org \
--cc=mcanal@igalia.com \
--cc=robh@kernel.org \
--cc=sashiko-reviews@lists.linux.dev \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox