Am 03.01.2018 um 11:43 schrieb Chunming Zhou: > > > 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? Interesting point, but no that should be handled as well. The vm_debug handling is only for the BOs on the BO-list. E.g. per VM BOs are never handled here. Regards, Christian. > > 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); >> >