Переглянути джерело

drm/amdgpu: kmap PDs/PTs in amdgpu_vm_update_directories

In theory it is possible that PDs/PTs can move without eviction.

Signed-off-by: Christian König <christian.koenig@amd.com>
Reviewed-by: Chunming Zhou <david1.zhou@amd.com>
Reviewed-by: Junwei Zhang <Jerry.Zhang@amd.com>
Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
Christian König 7 роки тому
батько
коміт
a7f91061c6
1 змінених файлів з 8 додано та 7 видалено
  1. 8 7
      drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c

+ 8 - 7
drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c

@@ -242,13 +242,6 @@ int amdgpu_vm_validate_pt_bos(struct amdgpu_device *adev, struct amdgpu_vm *vm,
 			spin_unlock(&glob->lru_lock);
 			spin_unlock(&glob->lru_lock);
 		}
 		}
 
 
-		if (bo->tbo.type == ttm_bo_type_kernel &&
-		    vm->use_cpu_for_update) {
-			r = amdgpu_bo_kmap(bo, NULL);
-			if (r)
-				break;
-		}
-
 		if (bo->tbo.type != ttm_bo_type_kernel) {
 		if (bo->tbo.type != ttm_bo_type_kernel) {
 			spin_lock(&vm->moved_lock);
 			spin_lock(&vm->moved_lock);
 			list_move(&bo_base->vm_status, &vm->moved);
 			list_move(&bo_base->vm_status, &vm->moved);
@@ -940,6 +933,14 @@ restart:
 	params.adev = adev;
 	params.adev = adev;
 
 
 	if (vm->use_cpu_for_update) {
 	if (vm->use_cpu_for_update) {
+		struct amdgpu_vm_bo_base *bo_base;
+
+		list_for_each_entry(bo_base, &vm->relocated, vm_status) {
+			r = amdgpu_bo_kmap(bo_base->bo, NULL);
+			if (unlikely(r))
+				return r;
+		}
+
 		r = amdgpu_vm_wait_pd(adev, vm, AMDGPU_FENCE_OWNER_VM);
 		r = amdgpu_vm_wait_pd(adev, vm, AMDGPU_FENCE_OWNER_VM);
 		if (unlikely(r))
 		if (unlikely(r))
 			return r;
 			return r;