drm/amdgpu:use job* to replace voluntary
authorMonk Liu <Monk.Liu@amd.com>
Wed, 26 Apr 2017 06:51:54 +0000 (14:51 +0800)
committerAlex Deucher <alexander.deucher@amd.com>
Wed, 24 May 2017 21:40:38 +0000 (17:40 -0400)
that way we can know which job cause hang and
can do per sched reset/recovery instead of all
sched.

Signed-off-by: Monk Liu <Monk.Liu@amd.com>
Reviewed-by: Christian König <christian.koenig@amd.com>
Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
drivers/gpu/drm/amd/amdgpu/amdgpu_device.c
drivers/gpu/drm/amd/amdgpu/amdgpu_job.c
drivers/gpu/drm/amd/amdgpu/amdgpu_virt.h
drivers/gpu/drm/amd/amdgpu/mxgpu_ai.c
drivers/gpu/drm/amd/amdgpu/mxgpu_vi.c

index 5b8f7e59099ede894aa1ca4d5b2bce92b928d89a..41c18700e2759d3cae2764229374d3a40350e12a 100644 (file)
@@ -2609,14 +2609,13 @@ err:
  * amdgpu_sriov_gpu_reset - reset the asic
  *
  * @adev: amdgpu device pointer
- * @voluntary: if this reset is requested by guest.
- *             (true means by guest and false means by HYPERVISOR )
+ * @job: which job trigger hang
  *
  * Attempt the reset the GPU if it has hung (all asics).
  * for SRIOV case.
  * Returns 0 for success or an error on failure.
  */
-int amdgpu_sriov_gpu_reset(struct amdgpu_device *adev, bool voluntary)
+int amdgpu_sriov_gpu_reset(struct amdgpu_device *adev, struct amdgpu_job *job)
 {
        int i, r = 0;
        int resched;
@@ -2646,7 +2645,7 @@ int amdgpu_sriov_gpu_reset(struct amdgpu_device *adev, bool voluntary)
        amdgpu_fence_driver_force_completion(adev);
 
        /* request to take full control of GPU before re-initialization  */
-       if (voluntary)
+       if (job)
                amdgpu_virt_reset_gpu(adev);
        else
                amdgpu_virt_request_full_gpu(adev, true);
index 1aac8b0e6273ea12e9fa6a1a5a15a9bfa9acaa31..ec2dd2b644a7e3d29a9d0fbeaa25ceef1d7332a6 100644 (file)
@@ -38,7 +38,7 @@ static void amdgpu_job_timedout(struct amd_sched_job *s_job)
                  job->ring->fence_drv.sync_seq);
 
        if (amdgpu_sriov_vf(job->adev))
-               amdgpu_sriov_gpu_reset(job->adev, true);
+               amdgpu_sriov_gpu_reset(job->adev, job);
        else
                amdgpu_gpu_reset(job->adev);
 }
index 6f2b7dfd237e12a04e5776bca61fc243d06b60a7..9e1062edb76eb0649a0a97291c320222fd21bfa9 100644 (file)
@@ -96,7 +96,7 @@ void amdgpu_virt_kiq_wreg(struct amdgpu_device *adev, uint32_t reg, uint32_t v);
 int amdgpu_virt_request_full_gpu(struct amdgpu_device *adev, bool init);
 int amdgpu_virt_release_full_gpu(struct amdgpu_device *adev, bool init);
 int amdgpu_virt_reset_gpu(struct amdgpu_device *adev);
-int amdgpu_sriov_gpu_reset(struct amdgpu_device *adev, bool voluntary);
+int amdgpu_sriov_gpu_reset(struct amdgpu_device *adev, struct amdgpu_job *job);
 int amdgpu_virt_alloc_mm_table(struct amdgpu_device *adev);
 void amdgpu_virt_free_mm_table(struct amdgpu_device *adev);
 
index 96139ec5ed62af455491de4f6982f7de19bf8ef4..69da52d7e6e2ada6b2e922d0c73162228d3710ee 100644 (file)
@@ -243,7 +243,7 @@ static void xgpu_ai_mailbox_flr_work(struct work_struct *work)
        }
 
        /* Trigger recovery due to world switch failure */
-       amdgpu_sriov_gpu_reset(adev, false);
+       amdgpu_sriov_gpu_reset(adev, NULL);
 }
 
 static int xgpu_ai_set_mailbox_rcv_irq(struct amdgpu_device *adev,
index f0d64f13abbc0b2816967a2ab0301192bcd09f09..1cdf5cc8cc67d24b511a526dd6e4ec000eca49bf 100644 (file)
@@ -514,7 +514,7 @@ static void xgpu_vi_mailbox_flr_work(struct work_struct *work)
        }
 
        /* Trigger recovery due to world switch failure */
-       amdgpu_sriov_gpu_reset(adev, false);
+       amdgpu_sriov_gpu_reset(adev, NULL);
 }
 
 static int xgpu_vi_set_mailbox_rcv_irq(struct amdgpu_device *adev,