Skip to content

Commit f45f73c

Browse files
larunbestevenprice-arm
authored andcommitted
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>
1 parent 616c5b6 commit f45f73c

4 files changed

Lines changed: 17 additions & 6 deletions

File tree

drivers/gpu/drm/panfrost/panfrost_job.c

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -217,7 +217,11 @@ static int panfrost_job_hw_submit(struct panfrost_job *job, int js)
217217
goto err_hwsubmit;
218218
}
219219

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;
221225

222226
panfrost_devfreq_record_busy(&pfdev->pfdevfreq);
223227

drivers/gpu/drm/panfrost/panfrost_mmu.c

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -258,7 +258,7 @@ static int panfrost_mmu_cfg_init(struct panfrost_mmu *mmu,
258258
}
259259
}
260260

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)
262262
{
263263
int as;
264264

@@ -300,7 +300,10 @@ u32 panfrost_mmu_as_get(struct panfrost_device *pfdev, struct panfrost_mmu *mmu)
300300
if (!atomic_read(&lru_mmu->as_count))
301301
break;
302302
}
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+
}
304307

305308
list_del_init(&lru_mmu->list);
306309
as = lru_mmu->as;

drivers/gpu/drm/panfrost/panfrost_mmu.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@ void panfrost_mmu_fini(struct panfrost_device *pfdev);
1616
void panfrost_mmu_reset(struct panfrost_device *pfdev);
1717
void panfrost_mmu_suspend_irq(struct panfrost_device *pfdev);
1818

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);
2020
void panfrost_mmu_as_put(struct panfrost_device *pfdev, struct panfrost_mmu *mmu);
2121

2222
struct panfrost_mmu *panfrost_mmu_ctx_get(struct panfrost_mmu *mmu);

drivers/gpu/drm/panfrost/panfrost_perfcnt.c

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -130,9 +130,11 @@ static int panfrost_perfcnt_enable_locked(struct panfrost_device *pfdev,
130130
goto err_vunmap;
131131
}
132132

133-
perfcnt->user = user;
133+
ret = panfrost_mmu_as_get(pfdev, perfcnt->mapping->mmu);
134+
if (ret < 0)
135+
goto err_vunmap;
134136

135-
as = panfrost_mmu_as_get(pfdev, perfcnt->mapping->mmu);
137+
as = ret;
136138
cfg = GPU_PERFCNT_CFG_AS(as) |
137139
GPU_PERFCNT_CFG_MODE(GPU_PERFCNT_CFG_MODE_MANUAL);
138140

@@ -164,6 +166,8 @@ static int panfrost_perfcnt_enable_locked(struct panfrost_device *pfdev,
164166
/* The BO ref is retained by the mapping. */
165167
drm_gem_object_put(&bo->base);
166168

169+
perfcnt->user = user;
170+
167171
return 0;
168172

169173
err_vunmap:

0 commit comments

Comments
 (0)