drm/amdgpu: SRIOV flr_work should take write_lock

[Why]
If flr_work takes read_lock, then other threads who takes
read_lock can access hardware when host is doing vf flr.

[How]
flr_work should take write_lock to avoid this case.

Signed-off-by: Jingwen Chen <Jingwen.Chen2@amd.com>
Reviewed-by: Monk Liu <monk.liu@amd.com>
Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
This commit is contained in:
Jingwen Chen 2021-07-01 10:19:17 +08:00 committed by Alex Deucher
parent c0838d3a93
commit b5840166dc
2 changed files with 4 additions and 4 deletions

View File

@ -252,7 +252,7 @@ static void xgpu_ai_mailbox_flr_work(struct work_struct *work)
* otherwise the mailbox msg will be ruined/reseted by * otherwise the mailbox msg will be ruined/reseted by
* the VF FLR. * the VF FLR.
*/ */
if (!down_read_trylock(&adev->reset_sem)) if (!down_write_trylock(&adev->reset_sem))
return; return;
amdgpu_virt_fini_data_exchange(adev); amdgpu_virt_fini_data_exchange(adev);
@ -268,7 +268,7 @@ static void xgpu_ai_mailbox_flr_work(struct work_struct *work)
flr_done: flr_done:
atomic_set(&adev->in_gpu_reset, 0); atomic_set(&adev->in_gpu_reset, 0);
up_read(&adev->reset_sem); up_write(&adev->reset_sem);
/* Trigger recovery for world switch failure if no TDR */ /* Trigger recovery for world switch failure if no TDR */
if (amdgpu_device_should_recover_gpu(adev) if (amdgpu_device_should_recover_gpu(adev)

View File

@ -273,7 +273,7 @@ static void xgpu_nv_mailbox_flr_work(struct work_struct *work)
* otherwise the mailbox msg will be ruined/reseted by * otherwise the mailbox msg will be ruined/reseted by
* the VF FLR. * the VF FLR.
*/ */
if (!down_read_trylock(&adev->reset_sem)) if (!down_write_trylock(&adev->reset_sem))
return; return;
amdgpu_virt_fini_data_exchange(adev); amdgpu_virt_fini_data_exchange(adev);
@ -289,7 +289,7 @@ static void xgpu_nv_mailbox_flr_work(struct work_struct *work)
flr_done: flr_done:
atomic_set(&adev->in_gpu_reset, 0); atomic_set(&adev->in_gpu_reset, 0);
up_read(&adev->reset_sem); up_write(&adev->reset_sem);
/* Trigger recovery for world switch failure if no TDR */ /* Trigger recovery for world switch failure if no TDR */
if (amdgpu_device_should_recover_gpu(adev) if (amdgpu_device_should_recover_gpu(adev)