Commit 0a51bf3e authored by Thomas Hellström's avatar Thomas Hellström
Browse files

drm/xe/vm: Don't pin the vm_resv during validation



The pinning has the odd side-effect that unlocking *any* resv
during validation triggers an "unlocking pinned lock" warning.

Cc: Matthew Brost <matthew.brost@intel.com>
Fixes: 9d555864 ("drm/xe: Rework eviction rejection of bound external bos")
Signed-off-by: default avatarThomas Hellström <thomas.hellstrom@linux.intel.com>
Reviewed-by: default avatarMatthew Brost <matthew.brost@intel.com>
Link: https://lore.kernel.org/r/20250821143045.106005-2-thomas.hellstrom@linux.intel.com
parent 8ae04fe9
Loading
Loading
Loading
Loading
+2 −3
Original line number Diff line number Diff line
@@ -2468,7 +2468,6 @@ int xe_bo_validate(struct xe_bo *bo, struct xe_vm *vm, bool allow_res_evict)
		.no_wait_gpu = false,
		.gfp_retry_mayfail = true,
	};
	struct pin_cookie cookie;
	int ret;

	if (vm) {
@@ -2479,10 +2478,10 @@ int xe_bo_validate(struct xe_bo *bo, struct xe_vm *vm, bool allow_res_evict)
		ctx.resv = xe_vm_resv(vm);
	}

	cookie = xe_vm_set_validating(vm, allow_res_evict);
	xe_vm_set_validating(vm, allow_res_evict);
	trace_xe_bo_validate(bo);
	ret = ttm_bo_validate(&bo->ttm, &bo->placement, &ctx);
	xe_vm_clear_validating(vm, allow_res_evict, cookie);
	xe_vm_clear_validating(vm, allow_res_evict);

	return ret;
}
+2 −13
Original line number Diff line number Diff line
@@ -315,22 +315,14 @@ void xe_vm_snapshot_free(struct xe_vm_snapshot *snap);
 * Register this task as currently making bos resident for the vm. Intended
 * to avoid eviction by the same task of shared bos bound to the vm.
 * Call with the vm's resv lock held.
 *
 * Return: A pin cookie that should be used for xe_vm_clear_validating().
 */
static inline struct pin_cookie xe_vm_set_validating(struct xe_vm *vm,
						     bool allow_res_evict)
static inline void xe_vm_set_validating(struct xe_vm *vm, bool allow_res_evict)
{
	struct pin_cookie cookie = {};

	if (vm && !allow_res_evict) {
		xe_vm_assert_held(vm);
		cookie = lockdep_pin_lock(&xe_vm_resv(vm)->lock.base);
		/* Pairs with READ_ONCE in xe_vm_is_validating() */
		WRITE_ONCE(vm->validating, current);
	}

	return cookie;
}

/**
@@ -338,17 +330,14 @@ static inline struct pin_cookie xe_vm_set_validating(struct xe_vm *vm,
 * @vm: Pointer to the vm or NULL
 * @allow_res_evict: Eviction from @vm was allowed. Must be set to the same
 * value as for xe_vm_set_validation().
 * @cookie: Cookie obtained from xe_vm_set_validating().
 *
 * Register this task as currently making bos resident for the vm. Intended
 * to avoid eviction by the same task of shared bos bound to the vm.
 * Call with the vm's resv lock held.
 */
static inline void xe_vm_clear_validating(struct xe_vm *vm, bool allow_res_evict,
					  struct pin_cookie cookie)
static inline void xe_vm_clear_validating(struct xe_vm *vm, bool allow_res_evict)
{
	if (vm && !allow_res_evict) {
		lockdep_unpin_lock(&xe_vm_resv(vm)->lock.base, cookie);
		/* Pairs with READ_ONCE in xe_vm_is_validating() */
		WRITE_ONCE(vm->validating, NULL);
	}