Commit 1e1981b1 authored by Lucas De Marchi's avatar Lucas De Marchi
Browse files

drm/xe: Fix taking invalid lock on wedge



If device wedges on e.g. GuC upload, the submission is not yet enabled
and the state is not even initialized. Protect the wedge call so it does
nothing in this case. It fixes the following splat:

	[] xe 0000:bf:00.0: [drm] device wedged, needs recovery
	[] ------------[ cut here ]------------
	[] DEBUG_LOCKS_WARN_ON(lock->magic != lock)
	[] WARNING: CPU: 48 PID: 312 at kernel/locking/mutex.c:564 __mutex_lock+0x8a1/0xe60
	...
	[] RIP: 0010:__mutex_lock+0x8a1/0xe60
	[]  mutex_lock_nested+0x1b/0x30
	[]  xe_guc_submit_wedge+0x80/0x2b0 [xe]

Reviewed-by: default avatarBalasubramani Vivekanandan <balasubramani.vivekanandan@intel.com>
Link: https://lore.kernel.org/r/20250402-warn-after-wedge-v1-1-93e971511fa5@intel.com


Signed-off-by: default avatarLucas De Marchi <lucas.demarchi@intel.com>
parent f350747a
Loading
Loading
Loading
Loading
+9 −0
Original line number Diff line number Diff line
@@ -300,6 +300,8 @@ int xe_guc_submit_init(struct xe_guc *guc, unsigned int num_ids)

	primelockdep(guc);

	guc->submission_state.initialized = true;

	return drmm_add_action_or_reset(&xe->drm, guc_submit_fini, guc);
}

@@ -834,6 +836,13 @@ void xe_guc_submit_wedge(struct xe_guc *guc)

	xe_gt_assert(guc_to_gt(guc), guc_to_xe(guc)->wedged.mode);

	/*
	 * If device is being wedged even before submission_state is
	 * initialized, there's nothing to do here.
	 */
	if (!guc->submission_state.initialized)
		return;

	err = devm_add_action_or_reset(guc_to_xe(guc)->drm.dev,
				       guc_submit_wedged_fini, guc);
	if (err) {
+5 −0
Original line number Diff line number Diff line
@@ -89,6 +89,11 @@ struct xe_guc {
		struct mutex lock;
		/** @submission_state.enabled: submission is enabled */
		bool enabled;
		/**
		 * @submission_state.initialized: mark when submission state is
		 * even initialized - before that not even the lock is valid
		 */
		bool initialized;
		/** @submission_state.fini_wq: submit fini wait queue */
		wait_queue_head_t fini_wq;
	} submission_state;