Re: [PATCH 2/3] drm/i915/uncore: fix race around i915->params.mmio_debug

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 




On 04/07/2023 10:48, Jani Nikula wrote:
Only check the conditions for unclaimed reg debug once to avoid locking
problems when i915->params.mmio_debug changes between header and footer.

Closes: https://gitlab.freedesktop.org/drm/intel/-/issues/8749
Cc: Lee Shawn C <shawn.c.lee@xxxxxxxxx>
Signed-off-by: Jani Nikula <jani.nikula@xxxxxxxxx>
---
  drivers/gpu/drm/i915/intel_uncore.c | 21 ++++++++++++---------
  1 file changed, 12 insertions(+), 9 deletions(-)

diff --git a/drivers/gpu/drm/i915/intel_uncore.c b/drivers/gpu/drm/i915/intel_uncore.c
index a88aa342b623..dfefad5a5fec 100644
--- a/drivers/gpu/drm/i915/intel_uncore.c
+++ b/drivers/gpu/drm/i915/intel_uncore.c
@@ -1925,27 +1925,26 @@ __unclaimed_previous_reg_debug(struct intel_uncore *uncore,
  			i915_mmio_reg_offset(reg));
  }
-static inline void
+static inline bool __must_check
  unclaimed_reg_debug_header(struct intel_uncore *uncore,
  			   const i915_reg_t reg, const bool read)
  {
  	if (likely(!uncore->i915->params.mmio_debug) || !uncore->debug)
-		return;
+		return false;
/* interrupts are disabled and re-enabled around uncore->lock usage */
  	lockdep_assert_held(&uncore->lock);
spin_lock(&uncore->debug->lock);
  	__unclaimed_previous_reg_debug(uncore, reg, read);
+
+	return true;
  }
static inline void
  unclaimed_reg_debug_footer(struct intel_uncore *uncore,
  			   const i915_reg_t reg, const bool read)
  {
-	if (likely(!uncore->i915->params.mmio_debug) || !uncore->debug)
-		return;
-
  	/* interrupts are disabled and re-enabled around uncore->lock usage */
  	lockdep_assert_held(&uncore->lock);
@@ -2008,13 +2007,15 @@ __gen2_read(64)
  #define GEN6_READ_HEADER(x) \
  	u32 offset = i915_mmio_reg_offset(reg); \
  	unsigned long irqflags; \
+	bool unclaimed_reg_debug; \
  	u##x val = 0; \
  	assert_rpm_wakelock_held(uncore->rpm); \
  	spin_lock_irqsave(&uncore->lock, irqflags); \
-	unclaimed_reg_debug_header(uncore, reg, true)
+	unclaimed_reg_debug = unclaimed_reg_debug_header(uncore, reg, true)
#define GEN6_READ_FOOTER \
-	unclaimed_reg_debug_footer(uncore, reg, true); \
+	if (unclaimed_reg_debug) \
+		unclaimed_reg_debug_footer(uncore, reg, true);	\
  	spin_unlock_irqrestore(&uncore->lock, irqflags); \
  	trace_i915_reg_rw(false, reg, val, sizeof(val), trace); \
  	return val
@@ -2112,13 +2113,15 @@ __gen2_write(32)
  #define GEN6_WRITE_HEADER \
  	u32 offset = i915_mmio_reg_offset(reg); \
  	unsigned long irqflags; \
+	bool unclaimed_reg_debug; \
  	trace_i915_reg_rw(true, reg, val, sizeof(val), trace); \
  	assert_rpm_wakelock_held(uncore->rpm); \
  	spin_lock_irqsave(&uncore->lock, irqflags); \
-	unclaimed_reg_debug_header(uncore, reg, false)
+	unclaimed_reg_debug = unclaimed_reg_debug_header(uncore, reg, false)
#define GEN6_WRITE_FOOTER \
-	unclaimed_reg_debug_footer(uncore, reg, false); \
+	if (unclaimed_reg_debug) \
+		unclaimed_reg_debug_footer(uncore, reg, false); \
  	spin_unlock_irqrestore(&uncore->lock, irqflags)
#define __gen6_write(x) \

Reviewed-by: Tvrtko Ursulin <tvrtko.ursulin@xxxxxxxxx>

Regards,

Tvrtko



[Index of Archives]     [AMD Graphics]     [Linux USB Devel]     [Linux Audio Users]     [Yosemite News]     [Linux Kernel]     [Linux SCSI]

  Powered by Linux