Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

drm/panfrost: Handle error when allocating AS number

If we reach the beginning of the LRU AS list, then return an error.

Reviewed-by: Steven Price <steven.price@arm.com>
Reviewed-by: Boris Brezillon <boris.brezillon@collabora.com>
Reviewed-by: AngeloGioacchino Del Regno <angelogioacchino.delregno@collabora.com>
Signed-off-by: Adrián Larumbe <adrian.larumbe@collabora.com>
Link: https://lore.kernel.org/r/20251019145225.3621989-5-adrian.larumbe@collabora.com
Signed-off-by: Steven Price <steven.price@arm.com>

authored by

Adrián Larumbe and committed by
Steven Price
f45f73c6 616c5b6f

+17 -6
+5 -1
drivers/gpu/drm/panfrost/panfrost_job.c
··· 217 217 goto err_hwsubmit; 218 218 } 219 219 220 - cfg = panfrost_mmu_as_get(pfdev, job->mmu); 220 + ret = panfrost_mmu_as_get(pfdev, job->mmu); 221 + if (ret < 0) 222 + goto err_hwsubmit; 223 + 224 + cfg = ret; 221 225 222 226 panfrost_devfreq_record_busy(&pfdev->pfdevfreq); 223 227
+5 -2
drivers/gpu/drm/panfrost/panfrost_mmu.c
··· 258 258 } 259 259 } 260 260 261 - u32 panfrost_mmu_as_get(struct panfrost_device *pfdev, struct panfrost_mmu *mmu) 261 + int panfrost_mmu_as_get(struct panfrost_device *pfdev, struct panfrost_mmu *mmu) 262 262 { 263 263 int as; 264 264 ··· 300 300 if (!atomic_read(&lru_mmu->as_count)) 301 301 break; 302 302 } 303 - WARN_ON(&lru_mmu->list == &pfdev->as_lru_list); 303 + if (WARN_ON(&lru_mmu->list == &pfdev->as_lru_list)) { 304 + as = -EBUSY; 305 + goto out; 306 + } 304 307 305 308 list_del_init(&lru_mmu->list); 306 309 as = lru_mmu->as;
+1 -1
drivers/gpu/drm/panfrost/panfrost_mmu.h
··· 16 16 void panfrost_mmu_reset(struct panfrost_device *pfdev); 17 17 void panfrost_mmu_suspend_irq(struct panfrost_device *pfdev); 18 18 19 - u32 panfrost_mmu_as_get(struct panfrost_device *pfdev, struct panfrost_mmu *mmu); 19 + int panfrost_mmu_as_get(struct panfrost_device *pfdev, struct panfrost_mmu *mmu); 20 20 void panfrost_mmu_as_put(struct panfrost_device *pfdev, struct panfrost_mmu *mmu); 21 21 22 22 struct panfrost_mmu *panfrost_mmu_ctx_get(struct panfrost_mmu *mmu);
+6 -2
drivers/gpu/drm/panfrost/panfrost_perfcnt.c
··· 130 130 goto err_vunmap; 131 131 } 132 132 133 - perfcnt->user = user; 133 + ret = panfrost_mmu_as_get(pfdev, perfcnt->mapping->mmu); 134 + if (ret < 0) 135 + goto err_vunmap; 134 136 135 - as = panfrost_mmu_as_get(pfdev, perfcnt->mapping->mmu); 137 + as = ret; 136 138 cfg = GPU_PERFCNT_CFG_AS(as) | 137 139 GPU_PERFCNT_CFG_MODE(GPU_PERFCNT_CFG_MODE_MANUAL); 138 140 ··· 165 163 166 164 /* The BO ref is retained by the mapping. */ 167 165 drm_gem_object_put(&bo->base); 166 + 167 + perfcnt->user = user; 168 168 169 169 return 0; 170 170