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: add userq object va track helpers

Add the userq object virtual address list_add() helpers
for tracking the userq obj va address usage.

Signed-off-by: Prike Liang <Prike.Liang@amd.com>
Reviewed-by: Alex Deucher <alexander.deucher@amd.com>
Signed-off-by: Alex Deucher <alexander.deucher@amd.com>

authored by

Prike Liang and committed by
Alex Deucher
5cfa33fa 1bea57ea

+52 -21
+1
drivers/gpu/drm/amd/amdgpu/amdgpu_object.h
··· 96 96 * if non-zero, cannot unmap from GPU because user queues may still access it 97 97 */ 98 98 unsigned int queue_refcount; 99 + atomic_t userq_va_mapped; 99 100 }; 100 101 101 102 struct amdgpu_bo {
+33 -11
drivers/gpu/drm/amd/amdgpu/amdgpu_userq.c
··· 44 44 return userq_ip_mask; 45 45 } 46 46 47 - int amdgpu_userq_input_va_validate(struct amdgpu_vm *vm, u64 addr, 48 - u64 expected_size) 47 + static int amdgpu_userq_buffer_va_list_add(struct amdgpu_usermode_queue *queue, 48 + struct amdgpu_bo_va_mapping *va_map, u64 addr) 49 + { 50 + struct amdgpu_userq_va_cursor *va_cursor; 51 + struct userq_va_list; 52 + 53 + va_cursor = kzalloc(sizeof(*va_cursor), GFP_KERNEL); 54 + if (!va_cursor) 55 + return -ENOMEM; 56 + 57 + INIT_LIST_HEAD(&va_cursor->list); 58 + va_cursor->gpu_addr = addr; 59 + atomic_set(&va_map->bo_va->userq_va_mapped, 1); 60 + list_add(&va_cursor->list, &queue->userq_va_list); 61 + 62 + return 0; 63 + } 64 + 65 + int amdgpu_userq_input_va_validate(struct amdgpu_usermode_queue *queue, 66 + u64 addr, u64 expected_size) 49 67 { 50 68 struct amdgpu_bo_va_mapping *va_map; 69 + struct amdgpu_vm *vm = queue->vm; 51 70 u64 user_addr; 52 71 u64 size; 53 72 int r = 0; ··· 86 67 /* Only validate the userq whether resident in the VM mapping range */ 87 68 if (user_addr >= va_map->start && 88 69 va_map->last - user_addr + 1 >= size) { 70 + amdgpu_userq_buffer_va_list_add(queue, va_map, user_addr); 89 71 amdgpu_bo_unreserve(vm->root.bo); 90 72 return 0; 91 73 } ··· 205 185 uq_funcs->mqd_destroy(uq_mgr, queue); 206 186 amdgpu_userq_fence_driver_free(queue); 207 187 idr_remove(&uq_mgr->userq_idr, queue_id); 188 + list_del(&queue->userq_va_list); 208 189 kfree(queue); 209 190 } 210 191 ··· 526 505 goto unlock; 527 506 } 528 507 529 - /* Validate the userq virtual address.*/ 530 - if (amdgpu_userq_input_va_validate(&fpriv->vm, args->in.queue_va, args->in.queue_size) || 531 - amdgpu_userq_input_va_validate(&fpriv->vm, args->in.rptr_va, AMDGPU_GPU_PAGE_SIZE) || 532 - amdgpu_userq_input_va_validate(&fpriv->vm, args->in.wptr_va, AMDGPU_GPU_PAGE_SIZE)) { 533 - r = -EINVAL; 534 - kfree(queue); 535 - goto unlock; 536 - } 508 + INIT_LIST_HEAD(&queue->userq_va_list); 537 509 queue->doorbell_handle = args->in.doorbell_handle; 538 510 queue->queue_type = args->in.ip_type; 539 511 queue->vm = &fpriv->vm; ··· 536 522 db_info.doorbell_handle = queue->doorbell_handle; 537 523 db_info.db_obj = &queue->db_obj; 538 524 db_info.doorbell_offset = args->in.doorbell_offset; 525 + 526 + /* Validate the userq virtual address.*/ 527 + if (amdgpu_userq_input_va_validate(queue, args->in.queue_va, args->in.queue_size) || 528 + amdgpu_userq_input_va_validate(queue, args->in.rptr_va, AMDGPU_GPU_PAGE_SIZE) || 529 + amdgpu_userq_input_va_validate(queue, args->in.wptr_va, AMDGPU_GPU_PAGE_SIZE)) { 530 + r = -EINVAL; 531 + kfree(queue); 532 + goto unlock; 533 + } 539 534 540 535 /* Convert relative doorbell offset into absolute doorbell index */ 541 536 index = amdgpu_userq_get_doorbell_index(uq_mgr, &db_info, filp); ··· 570 547 kfree(queue); 571 548 goto unlock; 572 549 } 573 - 574 550 575 551 qid = idr_alloc(&uq_mgr->userq_idr, queue, 1, AMDGPU_MAX_USERQ_COUNT, GFP_KERNEL); 576 552 if (qid < 0) {
+9 -3
drivers/gpu/drm/amd/amdgpu/amdgpu_userq.h
··· 48 48 struct amdgpu_bo *obj; 49 49 }; 50 50 51 + struct amdgpu_userq_va_cursor { 52 + u64 gpu_addr; 53 + struct list_head list; 54 + }; 55 + 51 56 struct amdgpu_usermode_queue { 52 57 int queue_type; 53 58 enum amdgpu_userq_state state; ··· 72 67 u32 xcp_id; 73 68 int priority; 74 69 struct dentry *debugfs_queue; 70 + 71 + struct list_head userq_va_list; 75 72 }; 76 73 77 74 struct amdgpu_userq_funcs { ··· 144 137 u32 idx); 145 138 int amdgpu_userq_start_sched_for_enforce_isolation(struct amdgpu_device *adev, 146 139 u32 idx); 147 - 148 - int amdgpu_userq_input_va_validate(struct amdgpu_vm *vm, u64 addr, 149 - u64 expected_size); 140 + int amdgpu_userq_input_va_validate(struct amdgpu_usermode_queue *queue, 141 + u64 addr, u64 expected_size); 150 142 #endif
+9 -7
drivers/gpu/drm/amd/amdgpu/mes_userqueue.c
··· 298 298 goto free_mqd; 299 299 } 300 300 301 - if (amdgpu_userq_input_va_validate(queue->vm, compute_mqd->eop_va, 302 - max_t(u32, PAGE_SIZE, AMDGPU_GPU_PAGE_SIZE))) 301 + r = amdgpu_userq_input_va_validate(queue, compute_mqd->eop_va, 302 + max_t(u32, PAGE_SIZE, AMDGPU_GPU_PAGE_SIZE)); 303 + if (r) 303 304 goto free_mqd; 304 305 305 306 userq_props->eop_gpu_addr = compute_mqd->eop_va; ··· 331 330 userq_props->tmz_queue = 332 331 mqd_user->flags & AMDGPU_USERQ_CREATE_FLAGS_QUEUE_SECURE; 333 332 334 - if (amdgpu_userq_input_va_validate(queue->vm, mqd_gfx_v11->shadow_va, 335 - shadow_info.shadow_size)) 333 + r = amdgpu_userq_input_va_validate(queue, mqd_gfx_v11->shadow_va, 334 + shadow_info.shadow_size); 335 + if (r) 336 336 goto free_mqd; 337 337 338 338 kfree(mqd_gfx_v11); ··· 352 350 r = -ENOMEM; 353 351 goto free_mqd; 354 352 } 355 - 356 - if (amdgpu_userq_input_va_validate(queue->vm, mqd_sdma_v11->csa_va, 357 - shadow_info.csa_size)) 353 + r = amdgpu_userq_input_va_validate(queue, mqd_sdma_v11->csa_va, 354 + shadow_info.csa_size); 355 + if (r) 358 356 goto free_mqd; 359 357 360 358 userq_props->csa_addr = mqd_sdma_v11->csa_va;