This was supposed to loop over the individual evicted list, as the
kernel and always_valid evicted lists were already handled in
amdgpu_vm_validate.

Without this, BOs that were created and evicted before a userq was made
would never end up in an eviction fence rearm.

Also add the missing ref to the BO before drm_exec locks and refs it.

Fixes: 4cdbba5a16aa ("drm/amdgpu: restructure VM state machine v4")
Signed-off-by: Benjamin Cheng <[email protected]>
---
v2:
- ref the BO before drm_exec locks it
- updated commit message (s/invalidate/validate/)
---
 drivers/gpu/drm/amd/amdgpu/amdgpu_userq.c | 10 ++++++----
 1 file changed, 6 insertions(+), 4 deletions(-)

diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_userq.c 
b/drivers/gpu/drm/amd/amdgpu/amdgpu_userq.c
index e29823ae8672..4dca1ab48410 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_userq.c
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_userq.c
@@ -998,19 +998,21 @@ amdgpu_userq_bo_validate(struct amdgpu_device *adev, 
struct drm_exec *exec,
 {
        struct ttm_operation_ctx ctx = { false, false };
        struct amdgpu_bo_va *bo_va;
-       struct amdgpu_bo *bo;
+       struct amdgpu_bo *bo, *tmp;
        int ret;
 
        spin_lock(&vm->individual_lock);
-       while (!list_empty(&vm->always_valid.evicted)) {
-               bo_va = list_first_entry(&vm->always_valid.evicted,
+       while (!list_empty(&vm->individual.evicted)) {
+               bo_va = list_first_entry(&vm->individual.evicted,
                                         struct amdgpu_bo_va,
                                         base.vm_status);
+               bo = bo_va->base.bo;
+               tmp = amdgpu_bo_ref(bo);
                spin_unlock(&vm->individual_lock);
 
-               bo = bo_va->base.bo;
                ret = drm_exec_prepare_obj(exec, &bo->tbo.base,
                                           TTM_NUM_MOVE_FENCES + 1);
+               amdgpu_bo_unref(&tmp);
                if (unlikely(ret))
                        return ret;
 
-- 
2.55.0

Reply via email to