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: create_mqd does not need userq_mutex

Reshuffle the code to run create_mqd outside the mutex.
code here is mostly setting up software structure init
before actually registering the userqueue in the xa and
to the driver.

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
469e6fea 51358444

+8 -10
+8 -10
drivers/gpu/drm/amd/amdgpu/amdgpu_userq.c
··· 793 793 goto clean_mapping; 794 794 } 795 795 796 - amdgpu_userq_ensure_ev_fence(&fpriv->userq_mgr, &fpriv->evf_mgr); 797 - 798 796 r = uq_funcs->mqd_create(queue, &args->in); 799 797 if (r) { 800 798 drm_file_err(uq_mgr->file, "Failed to create Queue\n"); 801 799 goto clean_fence_driver; 802 800 } 801 + 802 + amdgpu_userq_ensure_ev_fence(&fpriv->userq_mgr, &fpriv->evf_mgr); 803 803 804 804 /* don't map the queue if scheduling is halted */ 805 805 if (adev->userq_halt_for_enforce_isolation && ··· 812 812 r = amdgpu_userq_map_helper(queue); 813 813 if (r) { 814 814 drm_file_err(uq_mgr->file, "Failed to map Queue\n"); 815 - down_read(&adev->reset_domain->sem); 816 815 goto clean_mqd; 817 816 } 818 817 } ··· 827 828 if (r) { 828 829 if (!skip_map_queue) 829 830 amdgpu_userq_unmap_helper(queue); 830 - 831 831 r = -ENOMEM; 832 - goto clean_mqd; 832 + goto clean_reset_domain; 833 833 } 834 834 835 835 r = xa_err(xa_store_irq(&adev->userq_doorbell_xa, index, queue, GFP_KERNEL)); ··· 836 838 xa_erase(&uq_mgr->userq_xa, qid); 837 839 if (!skip_map_queue) 838 840 amdgpu_userq_unmap_helper(queue); 839 - 840 - goto clean_mqd; 841 + goto clean_reset_domain; 841 842 } 842 843 up_read(&adev->reset_domain->sem); 843 844 ··· 848 851 mutex_unlock(&uq_mgr->userq_mutex); 849 852 return 0; 850 853 851 - clean_mqd: 852 - uq_funcs->mqd_destroy(queue); 854 + clean_reset_domain: 853 855 up_read(&adev->reset_domain->sem); 856 + clean_mqd: 857 + mutex_unlock(&uq_mgr->userq_mutex); 858 + uq_funcs->mqd_destroy(queue); 854 859 clean_fence_driver: 855 860 amdgpu_userq_fence_driver_free(queue); 856 - mutex_unlock(&uq_mgr->userq_mutex); 857 861 clean_mapping: 858 862 amdgpu_userq_buffer_vas_list_cleanup(adev, queue); 859 863 kfree(queue);