]> git.proxmox.com Git - mirror_ubuntu-kernels.git/commitdiff
drm/i915/uncore: fix race around i915->params.mmio_debug
authorJani Nikula <jani.nikula@intel.com>
Tue, 1 Aug 2023 12:32:50 +0000 (15:32 +0300)
committerJani Nikula <jani.nikula@intel.com>
Tue, 1 Aug 2023 16:39:17 +0000 (19:39 +0300)
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
drivers/gpu/drm/i915/intel_uncore.c

index a88aa342b623aefbc48ee326b2e4cbba270d6838..dfefad5a5fec9e6fd1da6dd9bf9ec64905d8e958 100644 (file)
@@ -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) \