drm/amdgpu/sriov Stop data exchange for wholegpu reset
authorJack Zhang <Jack.Zhang1@amd.com>
Thu, 7 Jan 2021 10:38:29 +0000 (18:38 +0800)
committerAlex Deucher <alexander.deucher@amd.com>
Thu, 14 Jan 2021 04:47:39 +0000 (23:47 -0500)
[Why]
When host trigger a whole gpu reset, guest will keep
waiting till host finish reset. But there's a work
queue in guest exchanging data between vf&pf which need
to access frame buffer. During whole gpu reset, frame
buffer is not accessable, and this causes the call trace.

[How]
After vf get reset notification from pf, stop data exchange.

Signed-off-by: Jingwen Chen <Jingwen.Chen2@amd.com>
Signed-off-by: Jack Zhang <Jack.Zhang1@amd.com>
Reviewed-by: Monk Liu <monk.liu@amd.com>
Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
drivers/gpu/drm/amd/amdgpu/amdgpu_virt.c
drivers/gpu/drm/amd/amdgpu/mxgpu_ai.c
drivers/gpu/drm/amd/amdgpu/mxgpu_nv.c

index 2d51b76..e223fca 100644 (file)
@@ -573,6 +573,7 @@ void amdgpu_virt_fini_data_exchange(struct amdgpu_device *adev)
                DRM_INFO("clean up the vf2pf work item\n");
                flush_delayed_work(&adev->virt.vf2pf_work);
                cancel_delayed_work_sync(&adev->virt.vf2pf_work);
+               adev->virt.vf2pf_update_interval_ms = 0;
        }
 }
 
index 7767ccc..3ee4815 100644 (file)
@@ -255,6 +255,7 @@ static void xgpu_ai_mailbox_flr_work(struct work_struct *work)
        if (!down_read_trylock(&adev->reset_sem))
                return;
 
+       amdgpu_virt_fini_data_exchange(adev);
        atomic_set(&adev->in_gpu_reset, 1);
 
        do {
index dd5c1e6..48e588d 100644 (file)
@@ -276,6 +276,7 @@ static void xgpu_nv_mailbox_flr_work(struct work_struct *work)
        if (!down_read_trylock(&adev->reset_sem))
                return;
 
+       amdgpu_virt_fini_data_exchange(adev);
        atomic_set(&adev->in_gpu_reset, 1);
 
        do {