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/userq: hold root bo lock in caller of input_va_validate

Caller should hold the reservation lock for root.bo in func
amdgpu_userq_input_va_validate.

Signed-off-by: Sunil Khatri <sunil.khatri@amd.com>
Reviewed-by: Christian König <christian.koenig@amd.com>
Signed-off-by: Alex Deucher <alexander.deucher@amd.com>

authored by

Sunil Khatri and committed by
Alex Deucher
85653fe2 168178b0

+34 -8
+11 -6
drivers/gpu/drm/amd/amdgpu/amdgpu_userq.c
··· 239 239 u64 size; 240 240 int r = 0; 241 241 242 + /* Caller must hold vm->root.bo reservation */ 243 + dma_resv_assert_held(queue->vm->root.bo->tbo.base.resv); 244 + 242 245 user_addr = (addr & AMDGPU_GMC_HOLE_MASK) >> AMDGPU_GPU_PAGE_SHIFT; 243 246 size = expected_size >> AMDGPU_GPU_PAGE_SHIFT; 244 - 245 - r = amdgpu_bo_reserve(vm->root.bo, false); 246 - if (r) 247 - return r; 248 247 249 248 va_map = amdgpu_vm_bo_lookup_mapping(vm, user_addr); 250 249 if (!va_map) { ··· 254 255 if (user_addr >= va_map->start && 255 256 va_map->last - user_addr + 1 >= size) { 256 257 amdgpu_userq_buffer_va_list_add(queue, va_map, user_addr); 257 - amdgpu_bo_unreserve(vm->root.bo); 258 258 return 0; 259 259 } 260 260 261 261 r = -EINVAL; 262 262 out_err: 263 - amdgpu_bo_unreserve(vm->root.bo); 264 263 return r; 265 264 } 266 265 ··· 770 773 db_info.doorbell_offset = args->in.doorbell_offset; 771 774 772 775 queue->userq_mgr = uq_mgr; 776 + 773 777 /* Validate the userq virtual address.*/ 778 + r = amdgpu_bo_reserve(fpriv->vm.root.bo, false); 779 + if (r) 780 + goto free_queue; 781 + 774 782 if (amdgpu_userq_input_va_validate(adev, queue, args->in.queue_va, args->in.queue_size) || 775 783 amdgpu_userq_input_va_validate(adev, queue, args->in.rptr_va, AMDGPU_GPU_PAGE_SIZE) || 776 784 amdgpu_userq_input_va_validate(adev, queue, args->in.wptr_va, AMDGPU_GPU_PAGE_SIZE)) { 777 785 r = -EINVAL; 786 + amdgpu_bo_unreserve(fpriv->vm.root.bo); 778 787 goto clean_mapping; 779 788 } 789 + amdgpu_bo_unreserve(fpriv->vm.root.bo); 780 790 781 791 /* Convert relative doorbell offset into absolute doorbell index */ 782 792 index = amdgpu_userq_get_doorbell_index(uq_mgr, &db_info, filp); ··· 867 863 amdgpu_bo_reserve(fpriv->vm.root.bo, true); 868 864 amdgpu_userq_buffer_vas_list_cleanup(adev, queue); 869 865 amdgpu_bo_unreserve(fpriv->vm.root.bo); 866 + free_queue: 870 867 kfree(queue); 871 868 return r; 872 869 }
+23 -2
drivers/gpu/drm/amd/amdgpu/mes_userqueue.c
··· 322 322 goto free_mqd; 323 323 } 324 324 325 + r = amdgpu_bo_reserve(queue->vm->root.bo, false); 326 + if (r) { 327 + kfree(compute_mqd); 328 + goto free_mqd; 329 + } 325 330 r = amdgpu_userq_input_va_validate(adev, queue, compute_mqd->eop_va, 326 331 2048); 332 + amdgpu_bo_unreserve(queue->vm->root.bo); 327 333 if (r) { 328 334 kfree(compute_mqd); 329 335 goto free_mqd; ··· 371 365 userq_props->tmz_queue = 372 366 mqd_user->flags & AMDGPU_USERQ_CREATE_FLAGS_QUEUE_SECURE; 373 367 374 - r = amdgpu_userq_input_va_validate(adev, queue, mqd_gfx_v11->shadow_va, 375 - shadow_info.shadow_size); 368 + r = amdgpu_bo_reserve(queue->vm->root.bo, false); 376 369 if (r) { 377 370 kfree(mqd_gfx_v11); 378 371 goto free_mqd; 379 372 } 373 + r = amdgpu_userq_input_va_validate(adev, queue, mqd_gfx_v11->shadow_va, 374 + shadow_info.shadow_size); 375 + if (r) { 376 + amdgpu_bo_unreserve(queue->vm->root.bo); 377 + kfree(mqd_gfx_v11); 378 + goto free_mqd; 379 + } 380 + 380 381 r = amdgpu_userq_input_va_validate(adev, queue, mqd_gfx_v11->csa_va, 381 382 shadow_info.csa_size); 383 + amdgpu_bo_unreserve(queue->vm->root.bo); 382 384 if (r) { 383 385 kfree(mqd_gfx_v11); 384 386 goto free_mqd; ··· 408 394 r = -ENOMEM; 409 395 goto free_mqd; 410 396 } 397 + 398 + r = amdgpu_bo_reserve(queue->vm->root.bo, false); 399 + if (r) { 400 + kfree(mqd_sdma_v11); 401 + goto free_mqd; 402 + } 411 403 r = amdgpu_userq_input_va_validate(adev, queue, mqd_sdma_v11->csa_va, 412 404 32); 405 + amdgpu_bo_unreserve(queue->vm->root.bo); 413 406 if (r) { 414 407 kfree(mqd_sdma_v11); 415 408 goto free_mqd;