Skip to content

Commit d13e959

Browse files
committed
drm/amdgpu/userq: move waiting for last fence before umap
Need to wait for the last fence before unmapping. This also fixes a memory leak in amdgpu_userqueue_cleanup() when the fence isn't signalled. Fixes: b0db33c ("drm/amdgpu/userq: rework front end call sequence") Reviewed-by: Prike Liang <Prike.Liang@amd.com> Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
1 parent 36b0bc1 commit d13e959

File tree

1 file changed

+15
-9
lines changed

1 file changed

+15
-9
lines changed

drivers/gpu/drm/amd/amdgpu/amdgpu_userqueue.c

Lines changed: 15 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -84,23 +84,27 @@ amdgpu_userqueue_map_helper(struct amdgpu_userq_mgr *uq_mgr,
8484
}
8585

8686
static void
87-
amdgpu_userqueue_cleanup(struct amdgpu_userq_mgr *uq_mgr,
88-
struct amdgpu_usermode_queue *queue,
89-
int queue_id)
87+
amdgpu_userqueue_wait_for_last_fence(struct amdgpu_userq_mgr *uq_mgr,
88+
struct amdgpu_usermode_queue *queue)
9089
{
9190
struct amdgpu_device *adev = uq_mgr->adev;
92-
const struct amdgpu_userq_funcs *uq_funcs = adev->userq_funcs[queue->queue_type];
9391
struct dma_fence *f = queue->last_fence;
9492
int ret;
9593

9694
if (f && !dma_fence_is_signaled(f)) {
9795
ret = dma_fence_wait_timeout(f, true, msecs_to_jiffies(100));
98-
if (ret <= 0) {
99-
DRM_ERROR("Timed out waiting for fence=%llu:%llu\n",
100-
f->context, f->seqno);
101-
return;
102-
}
96+
if (ret <= 0)
97+
dev_err(adev->dev, "Timed out waiting for fence f=%p\n", f);
10398
}
99+
}
100+
101+
static void
102+
amdgpu_userqueue_cleanup(struct amdgpu_userq_mgr *uq_mgr,
103+
struct amdgpu_usermode_queue *queue,
104+
int queue_id)
105+
{
106+
struct amdgpu_device *adev = uq_mgr->adev;
107+
const struct amdgpu_userq_funcs *uq_funcs = adev->userq_funcs[queue->queue_type];
104108

105109
uq_funcs->mqd_destroy(uq_mgr, queue);
106110
amdgpu_userq_fence_driver_free(queue);
@@ -305,6 +309,7 @@ amdgpu_userqueue_destroy(struct drm_file *filp, int queue_id)
305309
mutex_unlock(&uq_mgr->userq_mutex);
306310
return -EINVAL;
307311
}
312+
amdgpu_userqueue_wait_for_last_fence(uq_mgr, queue);
308313
r = amdgpu_userqueue_unmap_helper(uq_mgr, queue);
309314
amdgpu_bo_unpin(queue->db_obj.obj);
310315
amdgpu_bo_unref(&queue->db_obj.obj);
@@ -780,6 +785,7 @@ void amdgpu_userq_mgr_fini(struct amdgpu_userq_mgr *userq_mgr)
780785

781786
mutex_lock(&userq_mgr->userq_mutex);
782787
idr_for_each_entry(&userq_mgr->userq_idr, queue, queue_id) {
788+
amdgpu_userqueue_wait_for_last_fence(userq_mgr, queue);
783789
amdgpu_userqueue_unmap_helper(userq_mgr, queue);
784790
amdgpu_userqueue_cleanup(userq_mgr, queue, queue_id);
785791
}

0 commit comments

Comments
 (0)