Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 34d7be5d authored by Christian König's avatar Christian König Committed by Alex Deucher
Browse files

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: default avatarChristian König <christian.koenig@amd.com>
Reviewed-by: default avatarChunming Zhou <david1.zhou@amd.com>
Signed-off-by: default avatarAlex Deucher <alexander.deucher@amd.com>
parent 87f64a76
Loading
Loading
Loading
Loading
+2 −31
Original line number Diff line number Diff line
@@ -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);
+32 −0
Original line number Diff line number Diff line
@@ -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
 *
+1 −0
Original line number Diff line number Diff line
@@ -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);