drm/amdgpu: fix and cleanup VM ready check
Stop checking the mapped BO itself, cause that one is certainly not a page table. Additional to that move the code into amdgpu_vm.c 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>
This commit is contained in:
		
							parent
							
								
									87f64a76b3
								
							
						
					
					
						commit
						34d7be5dc2
					
				| @ -127,35 +127,6 @@ int amdgpu_gem_object_open(struct drm_gem_object *obj, | ||||
| 	return 0; | ||||
| } | ||||
| 
 | ||||
| static int amdgpu_gem_vm_check(void *param, struct amdgpu_bo *bo) | ||||
| { | ||||
| 	/* if anything is swapped out don't swap it in here,
 | ||||
| 	   just abort and wait for the next CS */ | ||||
| 	if (!amdgpu_bo_gpu_accessible(bo)) | ||||
| 		return -ERESTARTSYS; | ||||
| 
 | ||||
| 	if (bo->shadow && !amdgpu_bo_gpu_accessible(bo->shadow)) | ||||
| 		return -ERESTARTSYS; | ||||
| 
 | ||||
| 	return 0; | ||||
| } | ||||
| 
 | ||||
| static bool amdgpu_gem_vm_ready(struct amdgpu_device *adev, | ||||
| 				struct amdgpu_vm *vm, | ||||
| 				struct list_head *list) | ||||
| { | ||||
| 	struct ttm_validate_buffer *entry; | ||||
| 
 | ||||
| 	list_for_each_entry(entry, list, head) { | ||||
| 		struct amdgpu_bo *bo = | ||||
| 			container_of(entry->bo, struct amdgpu_bo, tbo); | ||||
| 		if (amdgpu_gem_vm_check(NULL, bo)) | ||||
| 			return false; | ||||
| 	} | ||||
| 
 | ||||
| 	return !amdgpu_vm_validate_pt_bos(adev, vm, amdgpu_gem_vm_check, NULL); | ||||
| } | ||||
| 
 | ||||
| void amdgpu_gem_object_close(struct drm_gem_object *obj, | ||||
| 			     struct drm_file *file_priv) | ||||
| { | ||||
| @ -189,7 +160,7 @@ void amdgpu_gem_object_close(struct drm_gem_object *obj, | ||||
| 	if (bo_va && --bo_va->ref_count == 0) { | ||||
| 		amdgpu_vm_bo_rmv(adev, bo_va); | ||||
| 
 | ||||
| 		if (amdgpu_gem_vm_ready(adev, vm, &list)) { | ||||
| 		if (amdgpu_vm_ready(adev, vm)) { | ||||
| 			struct dma_fence *fence = NULL; | ||||
| 
 | ||||
| 			r = amdgpu_vm_clear_freed(adev, vm, &fence); | ||||
| @ -513,7 +484,7 @@ static void amdgpu_gem_va_update_vm(struct amdgpu_device *adev, | ||||
| { | ||||
| 	int r = -ERESTARTSYS; | ||||
| 
 | ||||
| 	if (!amdgpu_gem_vm_ready(adev, vm, list)) | ||||
| 	if (!amdgpu_vm_ready(adev, vm)) | ||||
| 		goto error; | ||||
| 
 | ||||
| 	r = amdgpu_vm_update_directories(adev, vm); | ||||
|  | ||||
| @ -231,6 +231,38 @@ int amdgpu_vm_validate_pt_bos(struct amdgpu_device *adev, struct amdgpu_vm *vm, | ||||
| 					adev->mman.bdev.glob); | ||||
| } | ||||
| 
 | ||||
| /**
 | ||||
|  * amdgpu_vm_check - helper for amdgpu_vm_ready | ||||
|  */ | ||||
| static int amdgpu_vm_check(void *param, struct amdgpu_bo *bo) | ||||
| { | ||||
| 	/* if anything is swapped out don't swap it in here,
 | ||||
| 	   just abort and wait for the next CS */ | ||||
| 	if (!amdgpu_bo_gpu_accessible(bo)) | ||||
| 		return -ERESTARTSYS; | ||||
| 
 | ||||
| 	if (bo->shadow && !amdgpu_bo_gpu_accessible(bo->shadow)) | ||||
| 		return -ERESTARTSYS; | ||||
| 
 | ||||
| 	return 0; | ||||
| } | ||||
| 
 | ||||
| /**
 | ||||
|  * amdgpu_vm_ready - check VM is ready for updates | ||||
|  * | ||||
|  * @adev: amdgpu device | ||||
|  * @vm: VM to check | ||||
|  * | ||||
|  * Check if all VM PDs/PTs are ready for updates | ||||
|  */ | ||||
| bool amdgpu_vm_ready(struct amdgpu_device *adev, struct amdgpu_vm *vm) | ||||
| { | ||||
| 	if (amdgpu_vm_check(NULL, vm->root.bo)) | ||||
| 		return false; | ||||
| 
 | ||||
| 	return !amdgpu_vm_validate_pt_bos(adev, vm, amdgpu_vm_check, NULL); | ||||
| } | ||||
| 
 | ||||
| /**
 | ||||
|  * amdgpu_vm_alloc_levels - allocate the PD/PT levels | ||||
|  * | ||||
|  | ||||
| @ -225,6 +225,7 @@ void amdgpu_vm_fini(struct amdgpu_device *adev, struct amdgpu_vm *vm); | ||||
| void amdgpu_vm_get_pd_bo(struct amdgpu_vm *vm, | ||||
| 			 struct list_head *validated, | ||||
| 			 struct amdgpu_bo_list_entry *entry); | ||||
| bool amdgpu_vm_ready(struct amdgpu_device *adev, struct amdgpu_vm *vm); | ||||
| int amdgpu_vm_validate_pt_bos(struct amdgpu_device *adev, struct amdgpu_vm *vm, | ||||
| 			      int (*callback)(void *p, struct amdgpu_bo *bo), | ||||
| 			      void *param); | ||||
|  | ||||
		Loading…
	
		Reference in New Issue
	
	Block a user