Commit 08fb6248 authored by Andrew Bresticker's avatar Andrew Bresticker Committed by Thomas Gleixner
Browse files

irqchip/riscv-imsic: Start local sync timer on correct CPU



When starting the local sync timer to synchronize the state of a remote
CPU it should be added on the CPU to be synchronized, not the initiating
CPU. This results in interrupt delivery being delayed until the timer
eventually runs (due to another mask/unmask/migrate operation) on the
target CPU.

Fixes: 0f67911e ("irqchip/riscv-imsic: Separate next and previous pointers in IMSIC vector")
Signed-off-by: default avatarAndrew Bresticker <abrestic@rivosinc.com>
Signed-off-by: default avatarThomas Gleixner <tglx@linutronix.de>
Reviewed-by: default avatarAnup Patel <anup@brainfault.org>
Link: https://lore.kernel.org/all/20250514171320.3494917-1-abrestic@rivosinc.com
parent fb0ea6e4
Loading
Loading
Loading
Loading
+5 −5
Original line number Diff line number Diff line
@@ -208,17 +208,17 @@ static bool __imsic_local_sync(struct imsic_local_priv *lpriv)
}

#ifdef CONFIG_SMP
static void __imsic_local_timer_start(struct imsic_local_priv *lpriv)
static void __imsic_local_timer_start(struct imsic_local_priv *lpriv, unsigned int cpu)
{
	lockdep_assert_held(&lpriv->lock);

	if (!timer_pending(&lpriv->timer)) {
		lpriv->timer.expires = jiffies + 1;
		add_timer_on(&lpriv->timer, smp_processor_id());
		add_timer_on(&lpriv->timer, cpu);
	}
}
#else
static inline void __imsic_local_timer_start(struct imsic_local_priv *lpriv)
static inline void __imsic_local_timer_start(struct imsic_local_priv *lpriv, unsigned int cpu)
{
}
#endif
@@ -233,7 +233,7 @@ void imsic_local_sync_all(bool force_all)
	if (force_all)
		bitmap_fill(lpriv->dirty_bitmap, imsic->global.nr_ids + 1);
	if (!__imsic_local_sync(lpriv))
		__imsic_local_timer_start(lpriv);
		__imsic_local_timer_start(lpriv, smp_processor_id());

	raw_spin_unlock_irqrestore(&lpriv->lock, flags);
}
@@ -278,7 +278,7 @@ static void __imsic_remote_sync(struct imsic_local_priv *lpriv, unsigned int cpu
				return;
		}

		__imsic_local_timer_start(lpriv);
		__imsic_local_timer_start(lpriv, cpu);
	}
}
#else