[PATCH] RISC-V: KVM: Use try_cmpxchg for IMSIC MRIF RMW

Anup Patel anup at brainfault.org
Wed Jul 29 10:05:25 PDT 2026


On Tue, Jul 28, 2026 at 7:49 PM Yicong Yang <yang.yicong at picoheart.com> wrote:
>
> Currently the RMW for IMSIC MRIF is implemented with
> word LRSC loop. This will only cover the lower 32bit
> on a 64bit system. Instead of guard the implementation
> with CONFIG_64BIT here, use try_cmpxchg() wrapper
> which has already take care this to fix this issue.
> It can also use AMO instructions on supported system.
>
> Fixes: db8b7e97d613 ("RISC-V: KVM: Add in-kernel virtualization of AIA IMSIC")
> Signed-off-by: Yicong Yang <yang.yicong at picoheart.com>

LGTM.

Reviewed-by: Anup Patel <anup at brainfault.org>

Queued this patch for Linux-7.3

Thanks,
Anup

> ---
>  arch/riscv/kvm/aia_imsic.c | 15 ++++++---------
>  1 file changed, 6 insertions(+), 9 deletions(-)
>
> diff --git a/arch/riscv/kvm/aia_imsic.c b/arch/riscv/kvm/aia_imsic.c
> index d38f5de0834c..c922c037344c 100644
> --- a/arch/riscv/kvm/aia_imsic.c
> +++ b/arch/riscv/kvm/aia_imsic.c
> @@ -220,15 +220,12 @@ static unsigned long imsic_mrif_atomic_rmw(struct imsic_mrif *mrif,
>  {
>         unsigned long old_val = 0, tmp = 0;
>
> -       __asm__ __volatile__ (
> -               "0:     lr.w.aq   %1, %0\n"
> -               "       and       %2, %1, %3\n"
> -               "       or        %2, %2, %4\n"
> -               "       sc.w.rl   %2, %2, %0\n"
> -               "       bnez      %2, 0b"
> -               : "+A" (*ptr), "+r" (old_val), "+r" (tmp)
> -               : "r" (~wr_mask), "r" (new_val & wr_mask)
> -               : "memory");
> +       new_val &= wr_mask;
> +
> +       old_val = READ_ONCE(*ptr);
> +       do {
> +               tmp = (old_val & ~wr_mask) | new_val;
> +       } while (!try_cmpxchg(ptr, &old_val, tmp));
>
>         return old_val;
>  }
> --
> 2.50.1 (Apple Git-155)



More information about the linux-riscv mailing list