[Intel-gfx] [PATCH 2/3] drm/i915/uncore: fix race around i915->params.mmio_debug
Tvrtko Ursulin
tvrtko.ursulin at linux.intel.com
Thu Jul 6 10:51:21 UTC 2023
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 at intel.com>
> Signed-off-by: Jani Nikula <jani.nikula at intel.com>
> ---
> 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 at intel.com>
Regards,
Tvrtko
More information about the Intel-gfx
mailing list