Changelog: https://cdn.kernel.org/pub/linux/kernel/v6.x/ChangeLog-6.12.35 Remove upstreamed patches: bcm27xx/patches-6.12/950-0961-media-imx335-Use-correct-register-width-for-HNUM.patch [1] bcm27xx/patches-6.12/950-1003-drivers-media-i2c-imx335-Fix-frame-size-enumeration.patch [2] gemini/patches-6.12/0001-net-ethernet-cortina-Use-TOE-TSO-on-all-TCP.patch [3] generic/backport-6.12/300-v6.16-mips-Add-std-flag-specified.patch [4] mvebu/patches-6.12/0004-v6.16-pinctrl-armada-37xx-propagate-error-from-armada_37xx.patch [5] mvebu/patches-6.12/0005-v6.16-pinctrl-armada-37xx-propagate-error-from-armada_37xx.patch [6] mvebu/patches-6.12/0006-v6.16-pinctrl-armada-37xx-propagate-error-from-armada_37xx.patch [7] mvebu/patches-6.12/0007-v6.16-pinctrl-armada-37xx-propagate-error-from-armada_37xx.patch [8] Manually rebased patches: bcm27xx/patches-6.12/950-0392-fbdev-Allow-client-to-request-a-particular-dev-fbN-n.patch [9] All other patches are automatically refreshed. [1] https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git/commit/?h=v6.12.35&id=b93864e0865f235a791e69dc9ef4f896e559ef77 [2] https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git/commit/?h=v6.12.35&id=1f78790d988c9d55cf8d4b4d511d4b3e38ecb81d [3] https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git/commit/?h=v6.12.35&id=2bd434bb0eeb680c2b3dd6c68ca319b30cb8d47f [4] https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git/commit/?h=v6.12.35&id=6dbda47fe8bd6aa978c150bc9d321a286d2cc3f4 [5] https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git/commit/?h=v6.12.35&id=2cd2022c38fa26257cc6eec100ae122de9c1541c [6] https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git/commit/?h=v6.12.35&id=133f17922b3dbae44fe583fb898b92b03558a657 [7] https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git/commit/?h=v6.12.35&id=aefe45843ea667366e35df4fcfef5ff9051a86c9 [8] https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git/commit/?h=v6.12.35&id=461d5a73ae45fbe6c300a6e64600f9792684eb52 [9] https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git/commit/?h=v6.12.35&id=3f2098f4fba7718eb2501207ca6e99d22427f25a Signed-off-by: Shiji Yang <yangshiji66@outlook.com> Link: https://github.com/openwrt/openwrt/pull/19249 Signed-off-by: Hauke Mehrtens <hauke@hauke-m.de>
85 lines
2.8 KiB
Diff
85 lines
2.8 KiB
Diff
From 23f61178926efa5b4b75c91a45fd315217bcb6c6 Mon Sep 17 00:00:00 2001
|
|
From: =?UTF-8?q?Ma=C3=ADra=20Canal?= <mcanal@igalia.com>
|
|
Date: Tue, 11 Mar 2025 15:13:44 -0300
|
|
Subject: [PATCH] drm/v3d: Set job pointer to NULL when the job's fence has an
|
|
error
|
|
MIME-Version: 1.0
|
|
Content-Type: text/plain; charset=UTF-8
|
|
Content-Transfer-Encoding: 8bit
|
|
|
|
Similar to commit e4b5ccd392b9 ("drm/v3d: Ensure job pointer is set to
|
|
NULL after job completion"), ensure the job pointer is set to `NULL` when
|
|
a job's fence has an error. Failing to do so can trigger kernel warnings
|
|
in specific scenarios, such as:
|
|
|
|
1. v3d_csd_job_run() assigns `v3d->csd_job = job`
|
|
2. CSD job exceeds hang limit, causing a timeout → v3d_gpu_reset_for_timeout()
|
|
3. GPU reset
|
|
4. drm_sched_resubmit_jobs() sets the job's fence to `-ECANCELED`.
|
|
5. v3d_csd_job_run() detects the fence error and returns NULL, not
|
|
submitting the job to the GPU
|
|
6. User-space runs `modprobe -r v3d`
|
|
7. v3d_gem_destroy()
|
|
|
|
v3d_gem_destroy() triggers a warning indicating that the CSD job never
|
|
ended, as we didn't set `v3d->csd_job` to NULL after the timeout. The same
|
|
can also happen to BIN, RENDER, and TFU jobs.
|
|
|
|
Reviewed-by: Iago Toral Quiroga <itoral@igalia.com>
|
|
Signed-off-by: Maíra Canal <mcanal@igalia.com>
|
|
---
|
|
drivers/gpu/drm/v3d/v3d_sched.c | 18 ++++++++++++++----
|
|
1 file changed, 14 insertions(+), 4 deletions(-)
|
|
|
|
--- a/drivers/gpu/drm/v3d/v3d_sched.c
|
|
+++ b/drivers/gpu/drm/v3d/v3d_sched.c
|
|
@@ -230,8 +230,12 @@ static struct dma_fence *v3d_bin_job_run
|
|
struct dma_fence *fence;
|
|
unsigned long irqflags;
|
|
|
|
- if (unlikely(job->base.base.s_fence->finished.error))
|
|
+ if (unlikely(job->base.base.s_fence->finished.error)) {
|
|
+ spin_lock_irqsave(&v3d->job_lock, irqflags);
|
|
+ v3d->bin_job = NULL;
|
|
+ spin_unlock_irqrestore(&v3d->job_lock, irqflags);
|
|
return NULL;
|
|
+ }
|
|
|
|
/* Lock required around bin_job update vs
|
|
* v3d_overflow_mem_work().
|
|
@@ -285,8 +289,10 @@ static struct dma_fence *v3d_render_job_
|
|
struct drm_device *dev = &v3d->drm;
|
|
struct dma_fence *fence;
|
|
|
|
- if (unlikely(job->base.base.s_fence->finished.error))
|
|
+ if (unlikely(job->base.base.s_fence->finished.error)) {
|
|
+ v3d->render_job = NULL;
|
|
return NULL;
|
|
+ }
|
|
|
|
v3d->render_job = job;
|
|
|
|
@@ -331,8 +337,10 @@ v3d_tfu_job_run(struct drm_sched_job *sc
|
|
struct drm_device *dev = &v3d->drm;
|
|
struct dma_fence *fence;
|
|
|
|
- if (unlikely(job->base.base.s_fence->finished.error))
|
|
+ if (unlikely(job->base.base.s_fence->finished.error)) {
|
|
+ v3d->tfu_job = NULL;
|
|
return NULL;
|
|
+ }
|
|
|
|
v3d->tfu_job = job;
|
|
|
|
@@ -377,8 +385,10 @@ v3d_csd_job_run(struct drm_sched_job *sc
|
|
struct dma_fence *fence;
|
|
int i, csd_cfg0_reg;
|
|
|
|
- if (unlikely(job->base.base.s_fence->finished.error))
|
|
+ if (unlikely(job->base.base.s_fence->finished.error)) {
|
|
+ v3d->csd_job = NULL;
|
|
return NULL;
|
|
+ }
|
|
|
|
v3d->csd_job = job;
|
|
|