drm/amdgpu: fix VM faults with per VM BOs
authorChristian König <christian.koenig@amd.com>
Fri, 22 Dec 2017 16:13:03 +0000 (17:13 +0100)
committerAlex Deucher <alexander.deucher@amd.com>
Wed, 27 Dec 2017 16:34:31 +0000 (11:34 -0500)
There was a small window between unreserve and second reserve where the
freshly allocated BO could have been evicted without the VM noticing it.

Signed-off-by: Christian König <christian.koenig@amd.com>
Reviewed-by: Chunming Zhou <david1.zhou@amd.com>
Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c

index af7dceb7131ed4e34230833fe4a91165dee9d9ce..e623109be2023e6bc9fbc7b7823ae14951ba5432 100644 (file)
@@ -1745,8 +1745,26 @@ struct amdgpu_bo_va *amdgpu_vm_bo_add(struct amdgpu_device *adev,
        INIT_LIST_HEAD(&bo_va->valids);
        INIT_LIST_HEAD(&bo_va->invalids);
 
-       if (bo)
-               list_add_tail(&bo_va->base.bo_list, &bo->va);
+       if (!bo)
+               return bo_va;
+
+       list_add_tail(&bo_va->base.bo_list, &bo->va);
+
+       if (bo->tbo.resv != vm->root.base.bo->tbo.resv)
+               return bo_va;
+
+       if (bo->preferred_domains &
+           amdgpu_mem_type_to_domain(bo->tbo.mem.mem_type))
+               return bo_va;
+
+       /*
+        * We checked all the prerequisites, but it looks like this per VM BO
+        * is currently evicted. add the BO to the evicted list to make sure it
+        * is validated on next VM use to avoid fault.
+        * */
+       spin_lock(&vm->status_lock);
+       list_move_tail(&bo_va->base.vm_status, &vm->evicted);
+       spin_unlock(&vm->status_lock);
 
        return bo_va;
 }