[<prev] [next>] [<thread-prev] [thread-next>] [day] [month] [year] [list]
Message-ID: <CAAhSdy2nb0siV-oE8gDQLVdAnMzw2TQqYOSK6SXZqxzYBCqM0Q@mail.gmail.com>
Date: Thu, 15 May 2025 12:09:22 +0530
From: Anup Patel <anup@...infault.org>
To: Andrew Bresticker <abrestic@...osinc.com>
Cc: Thomas Gleixner <tglx@...utronix.de>, Palmer Dabbelt <palmer@...belt.com>,
Alexandre Ghiti <alex@...ti.fr>, linux-riscv@...ts.infradead.org,
linux-kernel@...r.kernel.org
Subject: Re: [PATCH] irqchip/riscv-imsic: Start local sync timer on correct CPU
On Wed, May 14, 2025 at 10:43 PM Andrew Bresticker
<abrestic@...osinc.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@...osinc.com>
My bad. Thanks for catching the issue.
Reviewed-by: Anup Patel <anup@...infault.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
>
Powered by blists - more mailing lists