Commit d823445b authored by Jani Nikula's avatar Jani Nikula
Browse files

drm/i915/uncore: fix race around i915->params.mmio_debug

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@intel.com>
Reviewed-by: default avatarTvrtko Ursulin <tvrtko.ursulin@intel.com>
Signed-off-by: default avatarJani Nikula <jani.nikula@intel.com>
Link: https://patchwork.freedesktop.org/patch/msgid/a53fb0fd84c4627398ccd4304b35db05603b89b6.1690886109.git.jani.nikula@intel.com
parent 7afe2340
Loading
Loading
Loading
Loading
+12 −9
Original line number Diff line number Diff line
@@ -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,12 +2007,14 @@ __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 \
	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); \
@@ -2112,12 +2113,14 @@ __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 \
	if (unclaimed_reg_debug) \
		unclaimed_reg_debug_footer(uncore, reg, false); \
	spin_unlock_irqrestore(&uncore->lock, irqflags)