On 2018å¹´01æ??03æ?¥ 17:25, Christian König wrote: > Am 03.01.2018 um 09:10 schrieb Zhou, David(ChunMing): >> >> On 2018å¹´01æ??02æ?¥ 22:47, Christian König wrote: >>> Try to lock moved BOs if it's successful we can update the >>> PTEs directly to the new location. >>> >>> v2: rebase >>> >>> Signed-off-by: Christian König <christian.koenig at amd.com> >>> --- >>>   drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c | 15 ++++++++++++++- >>>   1 file changed, 14 insertions(+), 1 deletion(-) >>> >>> diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c >>> b/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c >>> index 3632c69f1814..c1c5ccdee783 100644 >>> --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c >>> +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c >>> @@ -1697,18 +1697,31 @@ int amdgpu_vm_handle_moved(struct >>> amdgpu_device *adev, >>>       spin_lock(&vm->status_lock); >>>       while (!list_empty(&vm->moved)) { >>>           struct amdgpu_bo_va *bo_va; >>> +       struct reservation_object *resv; >>>             bo_va = list_first_entry(&vm->moved, >>>               struct amdgpu_bo_va, base.vm_status); >>>           spin_unlock(&vm->status_lock); >>>   +       resv = bo_va->base.bo->tbo.resv; >>> + >>>           /* Per VM BOs never need to bo cleared in the page tables */ >> This reminders us Per-VM-BOs need to cleared as well after we allow to >> evict/swap out per-vm-bos. > > Actually they don't. The page tables only need to be valid during CS. > > So what happens is that the per VM-BOs are validated in right before > we call amdgpu_vm_handle_moved(). Yeah, agree it for per-vm-bo situation after I checked all adding moved list cases: 1. validate pt bos 2. bo invalidate 3. insert_map for per-vm-bo item #1 and #3 both are per-vm-bo, they are already validated before handle_moved(). For item #2, there are three places to call it: a. amdgpu_bo_vm_update_pte in CS for amdgpu_vm_debug b. amdgpu_gem_op_ioctl, but it is for evicted list, nothing with moved list. c. amdgpu_bo_move_notify when bo validate. For c case, your optimization is valid, we don't need clear for validate bo. But for a case, yours will break amdgpu_vm_debug functionality. Right? Regards, David Zhou > > Regards, > Christian. > >> >> Regards, >> David Zhou >>> -       clear = bo_va->base.bo->tbo.resv != >>> vm->root.base.bo->tbo.resv; >>> +       if (resv == vm->root.base.bo->tbo.resv) >>> +           clear = false; >>> +       /* Try to reserve the BO to avoid clearing its ptes */ >>> +       else if (reservation_object_trylock(resv)) >>> +           clear = false; >>> +       /* Somebody else is using the BO right now */ >>> +       else >>> +           clear = true; >>>             r = amdgpu_vm_bo_update(adev, bo_va, clear); >>>           if (r) >>>               return r; >>>   +       if (!clear && resv != vm->root.base.bo->tbo.resv) >>> +           reservation_object_unlock(resv); >>> + >>>           spin_lock(&vm->status_lock); >>>       } >>>       spin_unlock(&vm->status_lock); >