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: Tvrtko Ursulin <tvrtko.ursulin@intel.com> Signed-off-by: Jani Nikula <jani.nikula@intel.com> Link: https://patchwork.freedesktop.org/patch/msgid/a53fb0fd84c4627398ccd4304b35db05603b89b6.1690886109.git.jani.nikula@intel.com
This commit is contained in:
parent
7afe234064
commit
d823445b09
@ -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) \
|
||||
|
Loading…
x
Reference in New Issue
Block a user