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

Configure Feed

Select the types of activity you want to include in your feed.

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>

authored by

Prike Liang and committed by
Alex Deucher
48c33af0 34f31fe4

+12 -7
+3 -2
drivers/gpu/drm/amd/amdgpu/amdgpu_userq.c
··· 449 449 /* Drop the userq reference. */ 450 450 amdgpu_userq_buffer_vas_list_cleanup(adev, queue); 451 451 uq_funcs->mqd_destroy(queue); 452 - amdgpu_userq_fence_driver_free(queue); 453 452 /* Use interrupt-safe locking since IRQ handlers may access these XArrays */ 454 453 xa_erase_irq(&adev->userq_doorbell_xa, queue->doorbell_index); 454 + amdgpu_userq_fence_driver_free(queue); 455 + queue->fence_drv = NULL; 455 456 queue->userq_mgr = NULL; 456 457 list_del(&queue->userq_va_list); 457 458 kfree(queue); ··· 791 790 792 791 queue->doorbell_index = index; 793 792 xa_init_flags(&queue->fence_drv_xa, XA_FLAGS_ALLOC); 794 - r = amdgpu_userq_fence_driver_alloc(adev, queue); 793 + r = amdgpu_userq_fence_driver_alloc(adev, &queue->fence_drv); 795 794 if (r) { 796 795 drm_file_err(uq_mgr->file, "Failed to alloc fence driver\n"); 797 796 goto free_queue;
+8 -4
drivers/gpu/drm/amd/amdgpu/amdgpu_userq_fence.c
··· 78 78 } 79 79 80 80 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) 82 82 { 83 83 struct amdgpu_userq_fence_driver *fence_drv; 84 84 int r; 85 + 86 + if (!fence_drv_req) 87 + return -EINVAL; 88 + *fence_drv_req = NULL; 85 89 86 90 fence_drv = kzalloc_obj(*fence_drv); 87 91 if (!fence_drv) ··· 107 103 fence_drv->context = dma_fence_context_alloc(1); 108 104 get_task_comm(fence_drv->timeline_name, current); 109 105 110 - userq->fence_drv = fence_drv; 106 + *fence_drv_req = fence_drv; 111 107 112 108 return 0; 113 109 ··· 138 134 amdgpu_userq_fence_driver_free(struct amdgpu_usermode_queue *userq) 139 135 { 140 136 dma_fence_put(userq->last_fence); 141 - 137 + userq->last_fence = NULL; 142 138 amdgpu_userq_walk_and_drop_fence_drv(&userq->fence_drv_xa); 143 139 xa_destroy(&userq->fence_drv_xa); 144 - /* Drop the fence_drv reference held by user queue */ 140 + /* Drop the queue's ownership reference to fence_drv explicitly */ 145 141 amdgpu_userq_fence_driver_put(userq->fence_drv); 146 142 } 147 143
+1 -1
drivers/gpu/drm/amd/amdgpu/amdgpu_userq_fence.h
··· 64 64 void amdgpu_userq_fence_driver_get(struct amdgpu_userq_fence_driver *fence_drv); 65 65 void amdgpu_userq_fence_driver_put(struct amdgpu_userq_fence_driver *fence_drv); 66 66 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); 68 68 void amdgpu_userq_fence_driver_free(struct amdgpu_usermode_queue *userq); 69 69 void amdgpu_userq_fence_driver_process(struct amdgpu_userq_fence_driver *fence_drv); 70 70 void amdgpu_userq_fence_driver_force_completion(struct amdgpu_usermode_queue *userq);