summaryrefslogtreecommitdiff
path: root/drivers/gpu/drm/msm
diff options
context:
space:
mode:
authorWentao Liang <vulab@iscas.ac.cn>2026-09-16 17:55:48 +0000
committerRob Clark <robin.clark@oss.qualcomm.com>2026-09-27 08:18:22 -0700
commit81878aa1a2f551f51a3d3aef2a9509503ec34d8b (patch)
tree57072b2440c59b112bcac6ffb7ab92d4ca7195b2 /drivers/gpu/drm/msm
parentdbec5e6191bee37117382e4e7b7220167f1f3f18 (diff)
downloadlinux-next-81878aa1a2f551f51a3d3aef2a9509503ec34d8b.tar.gz
linux-next-81878aa1a2f551f51a3d3aef2a9509503ec34d8b.zip
drm/msm: Fix vm_bo use-after-free in with_vm_locks()
The unwind loop drops the vm_bo reference taken while locking before advancing to the next entry. drm_gpuvm_bo_put() may drop the last reference, removing and freeing the vm_bo, after which the plain list iterator dereferences freed memory to advance. Use the safe iterator, which saves the next entry before the body runs. Fixes: fe4952b5f27cca5d ("drm/msm: Convert vm locking") Cc: stable@vger.kernel.org Signed-off-by: Wentao Liang <vulab@iscas.ac.cn> Patchwork: https://patchwork.freedesktop.org/patch/754331/ Message-ID: <20260916175548.2089821-1-vulab@iscas.ac.cn> Signed-off-by: Rob Clark <robin.clark@oss.qualcomm.com>
Diffstat (limited to 'drivers/gpu/drm/msm')
-rw-r--r--drivers/gpu/drm/msm/msm_gem_shrinker.c3
1 files changed, 2 insertions, 1 deletions
diff --git a/drivers/gpu/drm/msm/msm_gem_shrinker.c b/drivers/gpu/drm/msm/msm_gem_shrinker.c
index 9d2788f79ace..a626fbb869db 100644
--- a/drivers/gpu/drm/msm/msm_gem_shrinker.c
+++ b/drivers/gpu/drm/msm/msm_gem_shrinker.c
@@ -51,6 +51,7 @@ with_vm_locks(void (*fn)(struct drm_gem_object *obj),
* success paths
*/
struct drm_gpuvm_bo *vm_bo, *last_locked = NULL;
+ struct drm_gpuvm_bo *next;
bool locked = true;
drm_gem_for_each_gpuvm_bo (vm_bo, obj) {
@@ -82,7 +83,7 @@ with_vm_locks(void (*fn)(struct drm_gem_object *obj),
out_unlock:
if (last_locked) {
- drm_gem_for_each_gpuvm_bo (vm_bo, obj) {
+ drm_gem_for_each_gpuvm_bo_safe(vm_bo, next, obj) {
struct dma_resv *resv = drm_gpuvm_resv(vm_bo->vm);
if (resv == obj->resv)