Before every job runs, we must make sure which's vm is recoverred completely. Change-Id: Ibe77a3c8f8206def280543fbb4195ad2ab9772e0 Signed-off-by: Chunming Zhou <David1.Zhou at amd.com> --- drivers/gpu/drm/amd/amdgpu/amdgpu.h | 2 ++ drivers/gpu/drm/amd/amdgpu/amdgpu_job.c | 5 +++++ drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c | 24 ++++++++++++++++++------ 3 files changed, 25 insertions(+), 6 deletions(-) diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu.h b/drivers/gpu/drm/amd/amdgpu/amdgpu.h index a2261ac..c0e4164 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu.h +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu.h @@ -919,6 +919,8 @@ struct amdgpu_vm { /* client id */ u64 client_id; + + struct fence *recover_pt_fence; }; struct amdgpu_vm_id { diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_job.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_job.c index 6674d40..8d87a9a 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_job.c +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_job.c @@ -152,6 +152,10 @@ static struct fence *amdgpu_job_dependency(struct amd_sched_job *sched_job) fence = amdgpu_sync_get_fence(&job->sync); } + if (fence == NULL && vm && vm->recover_pt_fence && + !fence_is_signaled(vm->recover_pt_fence)) + fence = fence_get(vm->recover_pt_fence); + return fence; } @@ -170,6 +174,7 @@ static struct fence *amdgpu_job_run(struct amd_sched_job *sched_job) BUG_ON(amdgpu_sync_peek_fence(&job->sync, NULL)); trace_amdgpu_sched_run_job(job); + r = amdgpu_ib_schedule(job->ring, job->num_ibs, job->ibs, job->sync.last_vm_update, job, &fence); if (r) diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c index 1cb2e71..1305dc1 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c @@ -703,11 +703,11 @@ error_free: static int amdgpu_vm_recover_bo_from_shadow(struct amdgpu_device *adev, struct amdgpu_bo *bo, struct amdgpu_bo *bo_shadow, - struct reservation_object *resv) + struct reservation_object *resv, + struct fence **fence) { struct amdgpu_ring *ring = adev->mman.buffer_funcs_ring; - struct fence *fence; int r; uint64_t vram_addr, gtt_addr; @@ -727,9 +727,9 @@ static int amdgpu_vm_recover_bo_from_shadow(struct amdgpu_device *adev, goto err3; r = amdgpu_copy_buffer(ring, gtt_addr, vram_addr, - amdgpu_bo_size(bo), resv, &fence); + amdgpu_bo_size(bo), resv, fence); if (!r) - amdgpu_bo_fence(bo, fence, true); + amdgpu_bo_fence(bo, *fence, true); err3: amdgpu_bo_unpin(bo_shadow); @@ -743,6 +743,7 @@ err1: int amdgpu_vm_recover_page_table_from_shadow(struct amdgpu_device *adev, struct amdgpu_vm *vm) { + struct fence *fence; uint64_t pt_idx; int r; @@ -753,11 +754,14 @@ int amdgpu_vm_recover_page_table_from_shadow(struct amdgpu_device *adev, r = amdgpu_vm_recover_bo_from_shadow(adev, vm->page_directory, vm->page_directory->shadow, - NULL); + NULL, &fence); if (r) { DRM_ERROR("recover page table failed!\n"); goto err; } + fence_put(vm->recover_pt_fence); + vm->recover_pt_fence = fence_get(fence); + fence_put(fence); for (pt_idx = 0; pt_idx <= vm->max_pde_used; ++pt_idx) { struct amdgpu_bo *bo = vm->page_tables[pt_idx].entry.robj; @@ -766,15 +770,21 @@ int amdgpu_vm_recover_page_table_from_shadow(struct amdgpu_device *adev, if (!bo || !bo_shadow) continue; r = amdgpu_vm_recover_bo_from_shadow(adev, bo, bo_shadow, - NULL); + NULL, &fence); if (r) { DRM_ERROR("recover page table failed!\n"); goto err; } + fence_put(vm->recover_pt_fence); + vm->recover_pt_fence = fence_get(fence); + fence_put(fence); } err: amdgpu_bo_unreserve(vm->page_directory); + if (vm->recover_pt_fence) + r = fence_wait(vm->recover_pt_fence, false); + return r; } /** @@ -1629,6 +1639,7 @@ int amdgpu_vm_init(struct amdgpu_device *adev, struct amdgpu_vm *vm) INIT_LIST_HEAD(&vm->cleared); INIT_LIST_HEAD(&vm->freed); INIT_LIST_HEAD(&vm->list); + vm->recover_pt_fence = NULL; pd_size = amdgpu_vm_directory_size(adev); pd_entries = amdgpu_vm_num_pdes(adev); @@ -1730,6 +1741,7 @@ void amdgpu_vm_fini(struct amdgpu_device *adev, struct amdgpu_vm *vm) amdgpu_bo_unref(&vm->page_directory); fence_put(vm->page_directory_fence); + fence_put(vm->recover_pt_fence); } /** -- 1.9.1