[PATCH 3/3] drm/amdgpu: recovery hw jobs when gpu reset V3
Chunming Zhou
David1.Zhou at amd.com
Mon Jul 4 02:27:22 UTC 2016
V3: directly use pd_addr.
Change-Id: If10da1e224d81a12fd4f8d760c48178adb9e82d0
Signed-off-by: Chunming Zhou <David1.Zhou at amd.com>
---
drivers/gpu/drm/amd/amdgpu/amdgpu_device.c | 4 +++-
drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c | 3 ++-
2 files changed, 5 insertions(+), 2 deletions(-)
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c
index 74f484d..0474b7b 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c
@@ -1954,6 +1954,7 @@ int amdgpu_gpu_reset(struct amdgpu_device *adev)
continue;
kthread_park(ring->sched.thread);
+ amd_sched_hw_job_reset(&ring->sched);
}
/* after all hw jobs are reset, hw fence is meaningless, so force_completion */
amdgpu_fence_driver_force_completion(adev);
@@ -2001,8 +2002,9 @@ retry:
struct amdgpu_ring *ring = adev->rings[i];
if (!ring)
continue;
+ amd_sched_job_recovery(&ring->sched);
kthread_unpark(ring->sched.thread);
- amdgpu_ring_restore(ring, ring_sizes[i], ring_data[i]);
+ kfree(ring_data[i]);
ring_sizes[i] = 0;
ring_data[i] = NULL;
}
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c
index c8d9577..d43bced 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c
@@ -378,7 +378,8 @@ int amdgpu_vm_flush(struct amdgpu_ring *ring, struct amdgpu_job *job)
amdgpu_vm_ring_has_compute_vm_bug(ring)))
amdgpu_ring_emit_pipeline_sync(ring);
- if (ring->funcs->emit_vm_flush && job->vm_needs_flush) {
+ if (ring->funcs->emit_vm_flush && (job->vm_needs_flush ||
+ amdgpu_vm_is_gpu_reset(adev, id))) {
struct fence *fence;
trace_amdgpu_vm_flush(job->vm_pd_addr, ring->idx, job->vm_id);
--
1.9.1
More information about the amd-gfx
mailing list