]> git.ipfire.org Git - thirdparty/linux.git/commitdiff
drm/v3d: Fix vaddr leak when indirect CSD has zeroed workgroups
authorMaíra Canal <mcanal@igalia.com>
Tue, 2 Jun 2026 17:50:14 +0000 (14:50 -0300)
committerMaíra Canal <mcanal@igalia.com>
Wed, 3 Jun 2026 11:19:51 +0000 (08:19 -0300)
v3d_rewrite_csd_job_wg_counts_from_indirect() maps both the indirect
buffer and the workgroup buffer and is expected to release them before
returning. When any of the workgroup counts read from the buffer is zero,
the function bailed out early and skipped the cleanup, leaking the vaddr
mappings of both BOs.

Jump to the cleanup path instead of returning directly, so the mappings
are always dropped.

Cc: stable@vger.kernel.org
Fixes: 18b8413b25b7 ("drm/v3d: Create a CPU job extension for a indirect CSD job")
Suggested-by: Jose Maria Casanova Crespo <jmcasanova@igalia.com>
Reviewed-by: Iago Toral Quiroga <itoral@igalia.com>
Link: https://patch.msgid.link/20260602-v3d-fix-indirect-csd-v4-1-654309e32bc0@igalia.com
Signed-off-by: Maíra Canal <mcanal@igalia.com>
drivers/gpu/drm/v3d/v3d_sched.c

index 94bf628dc91cc69776513abca8fd110ec586d961..47f83936cd7362bba3883a9ea3401eba473eb951 100644 (file)
@@ -403,7 +403,7 @@ v3d_rewrite_csd_job_wg_counts_from_indirect(struct v3d_cpu_job *job)
        wg_counts = (uint32_t *)(bo->vaddr + indirect_csd->offset);
 
        if (wg_counts[0] == 0 || wg_counts[1] == 0 || wg_counts[2] == 0)
-               return;
+               goto unmap_bo;
 
        args->cfg[0] = wg_counts[0] << V3D_CSD_CFG012_WG_COUNT_SHIFT;
        args->cfg[1] = wg_counts[1] << V3D_CSD_CFG012_WG_COUNT_SHIFT;
@@ -428,6 +428,7 @@ v3d_rewrite_csd_job_wg_counts_from_indirect(struct v3d_cpu_job *job)
                }
        }
 
+unmap_bo:
        v3d_put_bo_vaddr(indirect);
        v3d_put_bo_vaddr(bo);
 }