Skip to content

Commit 48c33af

Browse files
prliangpubalexdeucher
authored andcommitted
drm/amdgpu: make userq fence_drv drop explicit in queue destroy
amdgpu_userq_fence_driver_free() is now responsible only for releasing per-queue ancillary state (last_fence, fence_drv_xa) and no longer touches the ownership reference, making each function's contract clear. v2: Get the userq fence driver from amdgpu_userq_fence_driver_alloc() directly and dropping the userq fence driver reference after removing userq_doorbell_xa entry.(Christian) Signed-off-by: Prike Liang <Prike.Liang@amd.com> Reviewed-by: Christian König <christian.koenig@amd.com> Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
1 parent 34f31fe commit 48c33af

3 files changed

Lines changed: 12 additions & 7 deletions

File tree

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

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -449,9 +449,10 @@ static void amdgpu_userq_cleanup(struct amdgpu_usermode_queue *queue)
449449
/* Drop the userq reference. */
450450
amdgpu_userq_buffer_vas_list_cleanup(adev, queue);
451451
uq_funcs->mqd_destroy(queue);
452-
amdgpu_userq_fence_driver_free(queue);
453452
/* Use interrupt-safe locking since IRQ handlers may access these XArrays */
454453
xa_erase_irq(&adev->userq_doorbell_xa, queue->doorbell_index);
454+
amdgpu_userq_fence_driver_free(queue);
455+
queue->fence_drv = NULL;
455456
queue->userq_mgr = NULL;
456457
list_del(&queue->userq_va_list);
457458
kfree(queue);
@@ -790,7 +791,7 @@ amdgpu_userq_create(struct drm_file *filp, union drm_amdgpu_userq *args)
790791

791792
queue->doorbell_index = index;
792793
xa_init_flags(&queue->fence_drv_xa, XA_FLAGS_ALLOC);
793-
r = amdgpu_userq_fence_driver_alloc(adev, queue);
794+
r = amdgpu_userq_fence_driver_alloc(adev, &queue->fence_drv);
794795
if (r) {
795796
drm_file_err(uq_mgr->file, "Failed to alloc fence driver\n");
796797
goto free_queue;

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

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -78,11 +78,15 @@ amdgpu_userq_fence_write(struct amdgpu_userq_fence_driver *fence_drv,
7878
}
7979

8080
int amdgpu_userq_fence_driver_alloc(struct amdgpu_device *adev,
81-
struct amdgpu_usermode_queue *userq)
81+
struct amdgpu_userq_fence_driver **fence_drv_req)
8282
{
8383
struct amdgpu_userq_fence_driver *fence_drv;
8484
int r;
8585

86+
if (!fence_drv_req)
87+
return -EINVAL;
88+
*fence_drv_req = NULL;
89+
8690
fence_drv = kzalloc_obj(*fence_drv);
8791
if (!fence_drv)
8892
return -ENOMEM;
@@ -103,7 +107,7 @@ int amdgpu_userq_fence_driver_alloc(struct amdgpu_device *adev,
103107
fence_drv->context = dma_fence_context_alloc(1);
104108
get_task_comm(fence_drv->timeline_name, current);
105109

106-
userq->fence_drv = fence_drv;
110+
*fence_drv_req = fence_drv;
107111

108112
return 0;
109113

@@ -134,10 +138,10 @@ void
134138
amdgpu_userq_fence_driver_free(struct amdgpu_usermode_queue *userq)
135139
{
136140
dma_fence_put(userq->last_fence);
137-
141+
userq->last_fence = NULL;
138142
amdgpu_userq_walk_and_drop_fence_drv(&userq->fence_drv_xa);
139143
xa_destroy(&userq->fence_drv_xa);
140-
/* Drop the fence_drv reference held by user queue */
144+
/* Drop the queue's ownership reference to fence_drv explicitly */
141145
amdgpu_userq_fence_driver_put(userq->fence_drv);
142146
}
143147

drivers/gpu/drm/amd/amdgpu/amdgpu_userq_fence.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -64,7 +64,7 @@ void amdgpu_userq_fence_slab_fini(void);
6464
void amdgpu_userq_fence_driver_get(struct amdgpu_userq_fence_driver *fence_drv);
6565
void amdgpu_userq_fence_driver_put(struct amdgpu_userq_fence_driver *fence_drv);
6666
int amdgpu_userq_fence_driver_alloc(struct amdgpu_device *adev,
67-
struct amdgpu_usermode_queue *userq);
67+
struct amdgpu_userq_fence_driver **fence_drv_req);
6868
void amdgpu_userq_fence_driver_free(struct amdgpu_usermode_queue *userq);
6969
void amdgpu_userq_fence_driver_process(struct amdgpu_userq_fence_driver *fence_drv);
7070
void amdgpu_userq_fence_driver_force_completion(struct amdgpu_usermode_queue *userq);

0 commit comments

Comments
 (0)