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