[PATCH] drm/i915/gt: Swap the order of mcr lock and spinlock
Andi Shyti
andi.shyti at linux.intel.com
Thu Oct 5 16:35:17 UTC 2023
Until now we first have taken the mcr steering semaphore in
hardware and then the mcr_lock spinlock in KMD.
But when performing a big amount of MCR lock/unlock, like during
TLB invalidation, the time between MCR steering semaphore lock
and the spinlock is liable to a locking contention in the steer
semaphore register; especially considering that there is a
waiting timeout for the MCR lock.
Swap the order of the locks to ensure proper serialization of the
MCR steering semaphore lock access.
Suggested-by: Jonathan Cavitt <jonathan.cavitt at intel.com>
Signed-off-by: Andi Shyti <andi.shyti at linux.intel.com>
---
drivers/gpu/drm/i915/gt/intel_gt_mcr.c | 20 ++++++++++----------
1 file changed, 10 insertions(+), 10 deletions(-)
diff --git a/drivers/gpu/drm/i915/gt/intel_gt_mcr.c b/drivers/gpu/drm/i915/gt/intel_gt_mcr.c
index 326c2ed1d99b..e33b33f8deb2 100644
--- a/drivers/gpu/drm/i915/gt/intel_gt_mcr.c
+++ b/drivers/gpu/drm/i915/gt/intel_gt_mcr.c
@@ -371,6 +371,14 @@ void intel_gt_mcr_lock(struct intel_gt *gt, unsigned long *flags)
lockdep_assert_not_held(>->uncore->lock);
+ /*
+ * Even on platforms with a hardware lock, we'll continue to grab
+ * a software spinlock too for lockdep purposes. If the hardware lock
+ * was already acquired, there should never be contention on the
+ * software lock.
+ */
+ spin_lock_irqsave(>->mcr_lock, __flags);
+
/*
* Starting with MTL, we need to coordinate not only with other
* driver threads, but also with hardware/firmware agents. A dedicated
@@ -380,14 +388,6 @@ void intel_gt_mcr_lock(struct intel_gt *gt, unsigned long *flags)
err = wait_for(intel_uncore_read_fw(gt->uncore,
MTL_STEER_SEMAPHORE) == 0x1, 100);
- /*
- * Even on platforms with a hardware lock, we'll continue to grab
- * a software spinlock too for lockdep purposes. If the hardware lock
- * was already acquired, there should never be contention on the
- * software lock.
- */
- spin_lock_irqsave(>->mcr_lock, __flags);
-
*flags = __flags;
/*
@@ -413,10 +413,10 @@ void intel_gt_mcr_lock(struct intel_gt *gt, unsigned long *flags)
void intel_gt_mcr_unlock(struct intel_gt *gt, unsigned long flags)
__releases(>->mcr_lock)
{
- spin_unlock_irqrestore(>->mcr_lock, flags);
-
if (GRAPHICS_VER_FULL(gt->i915) >= IP_VER(12, 70))
intel_uncore_write_fw(gt->uncore, MTL_STEER_SEMAPHORE, 0x1);
+
+ spin_unlock_irqrestore(>->mcr_lock, flags);
}
/**
--
2.40.1
More information about the Intel-gfx-trybot
mailing list