I'm wondering if you need a HDP flush in update_directories at all. Are there cases where the directories are updated but the page tables are not? Also, in case of amdgpu_cs, I think we already have an HPD flush anyway. For KFD we don't use kernel-based submission, so we'd have to add an HDP flush into the KFD-specific VM mapping code. Either way, this is Reviewed-by: Felix Kuehling <Felix.Kuehling at amd.com> Regards, Felix On 17-07-12 04:31 AM, Christian König wrote: > From: Christian König <christian.koenig at amd.com> > > No need to do this after every single update. > > Signed-off-by: Christian König <christian.koenig at amd.com> > --- > drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c | 16 ++++++++++++---- > 1 file changed, 12 insertions(+), 4 deletions(-) > > diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c > index f52a358..1c6018b 100644 > --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c > +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c > @@ -991,10 +991,6 @@ static void amdgpu_vm_cpu_set_ptes(struct amdgpu_pte_update_params *params, > i, value, flags); > addr += incr; > } > - > - /* Flush HDP */ > - mb(); > - amdgpu_gart_flush_gpu_tlb(params->adev, 0); > } > > static int amdgpu_vm_wait_pd(struct amdgpu_device *adev, struct amdgpu_vm *vm, > @@ -1237,6 +1233,12 @@ int amdgpu_vm_update_directories(struct amdgpu_device *adev, > if (r) > amdgpu_vm_invalidate_level(&vm->root); > > + if (vm->use_cpu_for_update) { > + /* Flush HDP */ > + mb(); > + amdgpu_gart_flush_gpu_tlb(adev, 0); > + } > + > return r; > } > > @@ -1745,6 +1747,12 @@ int amdgpu_vm_bo_update(struct amdgpu_device *adev, > list_add(&bo_va->vm_status, &vm->cleared); > spin_unlock(&vm->status_lock); > > + if (vm->use_cpu_for_update) { > + /* Flush HDP */ > + mb(); > + amdgpu_gart_flush_gpu_tlb(adev, 0); > + } > + > return 0; > } >