[PATCH] irqchip/riscv-imsic: Start local sync timer on correct CPU
Anup Patel
anup at brainfault.org
Wed May 14 23:39:22 PDT 2025
On Wed, May 14, 2025 at 10:43 PM Andrew Bresticker
<abrestic at rivosinc.com> wrote:
>
> 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: 0f67911e821c ("irqchip/riscv-imsic: Separate next and previous pointers in IMSIC vector")
> Signed-off-by: Andrew Bresticker <abrestic at rivosinc.com>
My bad. Thanks for catching the issue.
Reviewed-by: Anup Patel <anup at brainfault.org>
Regards,
Anup
> ---
> drivers/irqchip/irq-riscv-imsic-state.c | 10 +++++-----
> 1 file changed, 5 insertions(+), 5 deletions(-)
>
> diff --git a/drivers/irqchip/irq-riscv-imsic-state.c b/drivers/irqchip/irq-riscv-imsic-state.c
> index bdf5cd2037f2..62f76950a113 100644
> --- a/drivers/irqchip/irq-riscv-imsic-state.c
> +++ b/drivers/irqchip/irq-riscv-imsic-state.c
> @@ -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
> --
> 2.43.0
>
More information about the linux-riscv
mailing list