On 07/28/2016 08:13 PM, Chunming Zhou wrote:
> every vm uses itself recover entity to recovery page table from shadow.
> 
> Change-Id: I93e37666cb3fb511311c96ff172b6e9ebd337547
> Signed-off-by: Chunming Zhou <[email protected]>
> ---
>  drivers/gpu/drm/amd/amdgpu/amdgpu.h    |  3 ++-
>  drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c | 21 ++++++++++++++-------
>  2 files changed, 16 insertions(+), 8 deletions(-)
> 
> diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu.h 
> b/drivers/gpu/drm/amd/amdgpu/amdgpu.h
> index 9f7fae0..98f631a 100644
> --- a/drivers/gpu/drm/amd/amdgpu/amdgpu.h
> +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu.h
> @@ -911,7 +911,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..6d2a28a 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);

This is slightly out of scope from your patchsets intention however:

If we are passing 'vm' in now to 'amdgpu_vm_recover_bo_from_shadow()'
could we then perhaps do the dereferences to 'vm->page_directory' and
'vm->page_directory->shadow' in there?

>       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);
>  
> 

Attachment: signature.asc
Description: OpenPGP digital signature

_______________________________________________
amd-gfx mailing list
[email protected]
https://lists.freedesktop.org/mailman/listinfo/amd-gfx

Reply via email to