[PATCH 2/2] drm/amdgpu: validate VM PTs only on eviction

Deucher, Alexander Alexander.Deucher at amd.com
Tue Jun 21 14:35:01 UTC 2016


> -----Original Message-----
> From: amd-gfx [mailto:amd-gfx-bounces at lists.freedesktop.org] On Behalf
> Of Christian König
> Sent: Tuesday, June 21, 2016 10:28 AM
> To: amd-gfx at lists.freedesktop.org
> Subject: [PATCH 2/2] drm/amdgpu: validate VM PTs only on eviction
> 
> From: Christian König <christian.koenig at amd.com>
> 
> We don't need to validate them again if the eviction counter didn't changed.
> 
> Signed-off-by: Christian König <christian.koenig at amd.com>

For the series:
Reviewed-by: Alex Deucher <alexander.deucher at amd.com>

> ---
>  drivers/gpu/drm/amd/amdgpu/amdgpu.h     |  4 +++-
>  drivers/gpu/drm/amd/amdgpu/amdgpu_cs.c  |  5 ++++-
>  drivers/gpu/drm/amd/amdgpu/amdgpu_gem.c |  2 +-
>  drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c  | 13 ++++++++++++-
>  4 files changed, 20 insertions(+), 4 deletions(-)
> 
> diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu.h
> b/drivers/gpu/drm/amd/amdgpu/amdgpu.h
> index 85fad3a..be25ede 100644
> --- a/drivers/gpu/drm/amd/amdgpu/amdgpu.h
> +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu.h
> @@ -866,6 +866,7 @@ struct amdgpu_vm {
>  	struct amdgpu_bo	*page_directory;
>  	unsigned		max_pde_used;
>  	struct fence		*page_directory_fence;
> +	uint64_t		last_eviction_counter;
> 
>  	/* array of page tables, one for each page directory entry */
>  	struct amdgpu_vm_pt	*page_tables;
> @@ -934,7 +935,8 @@ void amdgpu_vm_fini(struct amdgpu_device *adev,
> struct amdgpu_vm *vm);
>  void amdgpu_vm_get_pd_bo(struct amdgpu_vm *vm,
>  			 struct list_head *validated,
>  			 struct amdgpu_bo_list_entry *entry);
> -void amdgpu_vm_get_pt_bos(struct amdgpu_vm *vm, struct list_head
> *duplicates);
> +void amdgpu_vm_get_pt_bos(struct amdgpu_device *adev, struct
> amdgpu_vm *vm,
> +			  struct list_head *duplicates);
>  void amdgpu_vm_move_pt_bos_in_lru(struct amdgpu_device *adev,
>  				  struct amdgpu_vm *vm);
>  int amdgpu_vm_grab_id(struct amdgpu_vm *vm, struct amdgpu_ring *ring,
> diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_cs.c
> b/drivers/gpu/drm/amd/amdgpu/amdgpu_cs.c
> index c674c7c..0cc741d 100644
> --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_cs.c
> +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_cs.c
> @@ -459,7 +459,7 @@ static int amdgpu_cs_parser_bos(struct
> amdgpu_cs_parser *p,
>  		list_splice(&need_pages, &p->validated);
>  	}
> 
> -	amdgpu_vm_get_pt_bos(&fpriv->vm, &duplicates);
> +	amdgpu_vm_get_pt_bos(p->adev, &fpriv->vm, &duplicates);
> 
>  	p->bytes_moved_threshold =
> amdgpu_cs_get_threshold_for_moves(p->adev);
>  	p->bytes_moved = 0;
> @@ -472,6 +472,9 @@ static int amdgpu_cs_parser_bos(struct
> amdgpu_cs_parser *p,
>  	if (r)
>  		goto error_validate;
> 
> +	fpriv->vm.last_eviction_counter =
> +		atomic64_read(&p->adev->num_evictions);
> +
>  	if (p->bo_list) {
>  		struct amdgpu_bo *gds = p->bo_list->gds_obj;
>  		struct amdgpu_bo *gws = p->bo_list->gws_obj;
> diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_gem.c
> b/drivers/gpu/drm/amd/amdgpu/amdgpu_gem.c
> index 8fab648..88fbed2 100644
> --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_gem.c
> +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_gem.c
> @@ -503,7 +503,7 @@ static void amdgpu_gem_va_update_vm(struct
> amdgpu_device *adev,
>  	if (r)
>  		goto error_print;
> 
> -	amdgpu_vm_get_pt_bos(bo_va->vm, &duplicates);
> +	amdgpu_vm_get_pt_bos(adev, bo_va->vm, &duplicates);
>  	list_for_each_entry(entry, &list, head) {
>  		domain = amdgpu_mem_type_to_domain(entry->bo-
> >mem.mem_type);
>  		/* if anything is swapped out don't swap it in here,
> diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c
> b/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c
> index adb8778..f5b88b4 100644
> --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c
> +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c
> @@ -115,16 +115,26 @@ void amdgpu_vm_get_pd_bo(struct amdgpu_vm
> *vm,
>  /**
>   * amdgpu_vm_get_bos - add the vm BOs to a duplicates list
>   *
> + * @adev: amdgpu device pointer
>   * @vm: vm providing the BOs
>   * @duplicates: head of duplicates list
>   *
>   * Add the page directory to the BO duplicates list
>   * for command submission.
>   */
> -void amdgpu_vm_get_pt_bos(struct amdgpu_vm *vm, struct list_head
> *duplicates)
> +void amdgpu_vm_get_pt_bos(struct amdgpu_device *adev, struct
> amdgpu_vm *vm,
> +			  struct list_head *duplicates)
>  {
> +	uint64_t num_evictions;
>  	unsigned i;
> 
> +	/* We only need to validate the page tables
> +	 * if they aren't already valid.
> +	 */
> +	num_evictions = atomic64_read(&adev->num_evictions);
> +	if (num_evictions == vm->last_eviction_counter)
> +		return;
> +
>  	/* add the vm page table to the list */
>  	for (i = 0; i <= vm->max_pde_used; ++i) {
>  		struct amdgpu_bo_list_entry *entry = &vm-
> >page_tables[i].entry;
> @@ -1508,6 +1518,7 @@ int amdgpu_vm_init(struct amdgpu_device *adev,
> struct amdgpu_vm *vm)
>  	amdgpu_bo_unreserve(vm->page_directory);
>  	if (r)
>  		goto error_free_page_directory;
> +	vm->last_eviction_counter = atomic64_read(&adev-
> >num_evictions);
> 
>  	return 0;
> 
> --
> 2.5.0
> 
> _______________________________________________
> amd-gfx mailing list
> amd-gfx at lists.freedesktop.org
> https://lists.freedesktop.org/mailman/listinfo/amd-gfx


More information about the amd-gfx mailing list