Perform reboot stresss test on a kernel build with lockdebug flag enabled. Bad unlock balanace detected would happened sometimes. Below is the problematic scenario. If params.mmio_debug value was changed at step #4. And it would trigger this issue. Modify code flow that decide to enable/disable mmio debug before unclaimed_reg_debug() can avoid this symptom. 1. GEN6_READ_HEADER is called with params.mmio_debug = 0 2. unclaimed_reg_debug(before = true) is called 3. unclaimed_reg_debug return without taking a lock because params.mmio_debug == 0 4. other thread modifies params.mmio_debug to 1 5. GEN6_READ_FOOTER is called with params.mmio_debug != 0 6. unclaimed_reg_debug tries to assert non-taken lock (first WARN) 7. unclaimed_reg_debug tries to release non-taken lock (second WARN) Closes:https://gitlab.freedesktop.org/drm/intel/-/issues/8749 Signed-off-by: Lee Shawn C <shawn.c.lee@xxxxxxxxx> Cc: Uma Shankar <uma.shankar@xxxxxxxxx> Cc: Matt Roper <matthew.d.roper@xxxxxxxxx> Cc: Andi Shyti <andi.shyti@xxxxxxxxxxxxxxx> --- drivers/gpu/drm/i915/intel_uncore.c | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/drivers/gpu/drm/i915/intel_uncore.c b/drivers/gpu/drm/i915/intel_uncore.c index 796ebfe6c550..9d665978cc43 100644 --- a/drivers/gpu/drm/i915/intel_uncore.c +++ b/drivers/gpu/drm/i915/intel_uncore.c @@ -1931,9 +1931,6 @@ unclaimed_reg_debug(struct intel_uncore *uncore, const bool read, const bool before) { - 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); @@ -2001,13 +1998,16 @@ __gen2_read(64) #define GEN6_READ_HEADER(x) \ u32 offset = i915_mmio_reg_offset(reg); \ unsigned long irqflags; \ + const bool mmio_debug = likely(uncore->i915->params.mmio_debug) || uncore->debug; \ u##x val = 0; \ assert_rpm_wakelock_held(uncore->rpm); \ spin_lock_irqsave(&uncore->lock, irqflags); \ - unclaimed_reg_debug(uncore, reg, true, true) + if (mmio_debug) \ + unclaimed_reg_debug(uncore, reg, true, true) #define GEN6_READ_FOOTER \ - unclaimed_reg_debug(uncore, reg, true, false); \ + if (mmio_debug) \ + unclaimed_reg_debug(uncore, reg, true, false); \ spin_unlock_irqrestore(&uncore->lock, irqflags); \ trace_i915_reg_rw(false, reg, val, sizeof(val), trace); \ return val -- 2.17.1