[PATCH 05/11] drm/amdgpu: add vm recover entity
Chunming Zhou
David1.Zhou at amd.com
Tue Aug 2 07:51:36 UTC 2016
every vm uses itself recover entity to recovery page table from shadow.
Change-Id: I93e37666cb3fb511311c96ff172b6e9ebd337547
Signed-off-by: Chunming Zhou <David1.Zhou at 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
More information about the amd-gfx
mailing list