every vm uses itself recover entity to recovery page table from shadow.

Change-Id: I93e37666cb3fb511311c96ff172b6e9ebd337547
Signed-off-by: Chunming Zhou <david1.z...@amd.com>
---
 drivers/gpu/drm/amd/amdgpu/amdgpu.h    |  3 ++-
 drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c | 22 +++++++++++++++-------
 2 files changed, 17 insertions(+), 8 deletions(-)

diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu.h 
b/drivers/gpu/drm/amd/amdgpu/amdgpu.h
index 4889d13..b1a4af0 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu.h
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu.h
@@ -917,7 +917,8 @@ struct amdgpu_vm {
 
        /* Scheduler entity for page table updates */
        struct amd_sched_entity entity;
-
+       struct amd_sched_entity recover_entity;
+       struct amdgpu_ring      *ring;
        /* client id */
        u64                     client_id;
 
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c 
b/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c
index 1d58577..8b8d3db 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c
@@ -714,13 +714,13 @@ error_free:
 }
 
 static int amdgpu_vm_recover_bo_from_shadow(struct amdgpu_device *adev,
+                                           struct amdgpu_vm *vm,
                                            struct amdgpu_bo *bo,
                                            struct amdgpu_bo *bo_shadow,
                                            struct reservation_object *resv,
                                            struct fence **fence)
 
 {
-       struct amdgpu_ring *ring = adev->mman.buffer_funcs_ring;
        int r;
        uint64_t vram_addr, gtt_addr;
 
@@ -739,8 +739,8 @@ static int amdgpu_vm_recover_bo_from_shadow(struct 
amdgpu_device *adev,
        if (r)
                goto err3;
 
-       r = amdgpu_copy_buffer(ring, &adev->mman.entity, gtt_addr, vram_addr,
-                              amdgpu_bo_size(bo), resv, fence);
+       r = amdgpu_copy_buffer(vm->ring, &vm->recover_entity, gtt_addr,
+                              vram_addr, amdgpu_bo_size(bo), resv, fence);
        if (!r)
                amdgpu_bo_fence(bo, *fence, true);
 
@@ -767,7 +767,7 @@ int amdgpu_vm_recover_page_table_from_shadow(struct 
amdgpu_device *adev,
        if (unlikely(r != 0))
                return r;
 
-       r = amdgpu_vm_recover_bo_from_shadow(adev, vm->page_directory,
+       r = amdgpu_vm_recover_bo_from_shadow(adev, vm, vm->page_directory,
                                             vm->page_directory->shadow,
                                             NULL, &fence);
        if (r) {
@@ -784,7 +784,7 @@ 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,
+               r = amdgpu_vm_recover_bo_from_shadow(adev, vm, bo, bo_shadow,
                                                     NULL, &fence);
                if (r) {
                        DRM_ERROR("recover page table failed!\n");
@@ -1678,12 +1678,17 @@ int amdgpu_vm_init(struct amdgpu_device *adev, struct 
amdgpu_vm *vm)
        ring_instance = atomic_inc_return(&adev->vm_manager.vm_pte_next_ring);
        ring_instance %= adev->vm_manager.vm_pte_num_rings;
        ring = adev->vm_manager.vm_pte_rings[ring_instance];
+       rq = &ring->sched.sched_rq[AMD_SCHED_PRIORITY_RECOVER];
+       r = amd_sched_entity_init(&ring->sched, &vm->recover_entity,
+                                 rq, amdgpu_sched_jobs);
+       if (r)
+               goto err;
        rq = &ring->sched.sched_rq[AMD_SCHED_PRIORITY_KERNEL];
        r = amd_sched_entity_init(&ring->sched, &vm->entity,
                                  rq, amdgpu_sched_jobs);
        if (r)
-               goto err;
-
+               goto err1;
+       vm->ring = ring;
        vm->page_directory_fence = NULL;
 
        r = amdgpu_bo_create(adev, pd_size, align, true,
@@ -1725,6 +1730,8 @@ error_free_page_directory:
 error_free_sched_entity:
        amd_sched_entity_fini(&ring->sched, &vm->entity);
 
+err1:
+       amd_sched_entity_fini(&ring->sched, &vm->recover_entity);
 err:
        drm_free_large(vm->page_tables);
 
@@ -1748,6 +1755,7 @@ void amdgpu_vm_fini(struct amdgpu_device *adev, struct 
amdgpu_vm *vm)
        spin_lock(&adev->vm_list_lock);
        list_del(&vm->list);
        spin_unlock(&adev->vm_list_lock);
+       amd_sched_entity_fini(vm->entity.sched, &vm->recover_entity);
        amd_sched_entity_fini(vm->entity.sched, &vm->entity);
 
        if (!RB_EMPTY_ROOT(&vm->va)) {
-- 
1.9.1

_______________________________________________
amd-gfx mailing list
amd-gfx@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/amd-gfx

Reply via email to