[PATCH] lib: sbi: Issue a PAUSE hint between spins in spin_lock()
Anup Patel
anup at brainfault.org
Mon May 20 21:34:20 PDT 2024
On Wed, May 15, 2024 at 12:50 PM Christoph Müllner
<christoph.muellner at vrull.eu> wrote:
>
> On Wed, May 15, 2024 at 8:31 AM Anup Patel <anup at brainfault.org> wrote:
> >
> > On Tue, Apr 23, 2024 at 9:13 PM Christoph Müllner
> > <christoph.muellner at vrull.eu> wrote:
> > >
> > > RISC-V's Zihintpause extension includes a PAUSE instruction that
> > > is designed to reduce engergy consumption while executing spin-wait
> > > code sequences. It is encoded as a HINT, which means that it
> > > behaves like a NOP on systems that don't implement Zihintpause.
> > >
> > > Binutils supports Zihintpause since 2.36, so this patch uses
> > > the ".insn" directive to keep the code compatible with older
> > > toolchains.
> > >
> > > Signed-off-by: Christoph Müllner <christoph.muellner at vrull.eu>
> > > ---
> > > lib/sbi/riscv_locks.c | 3 ++-
> > > 1 file changed, 2 insertions(+), 1 deletion(-)
> > >
> > > diff --git a/lib/sbi/riscv_locks.c b/lib/sbi/riscv_locks.c
> > > index acab776..3c26a77 100644
> > > --- a/lib/sbi/riscv_locks.c
> > > +++ b/lib/sbi/riscv_locks.c
> > > @@ -61,7 +61,8 @@ void spin_lock(spinlock_t *lock)
> > > "1: and %2, %0, %5\n"
> > > " beq %1, %2, 2f\n"
> > >
> > > - /* If not, then spin on the lock. */
> > > + /* If not, then issue a PAUSE hint and spin on the lock. */
> > > + " .insn i 0x0f, 0, x0, x0, 0x010\n"
> >
> > There are a lot of platforms without Zihintpause so we need
> > instruction patching here.
>
> PAUSE is encoded as a HINT instruction (FENCE instruction with pred=W,
> succ=0, fm=0, rd=x0, and rs1=x0):
> https://github.com/riscv/riscv-isa-manual/blob/main/src/zihintpause.adoc
> HINT instructions are part of rv32i (base):
> https://github.com/riscv/riscv-isa-manual/blob/main/src/rv32.adoc#rv32i-hints
>
> I.e., if the platform does not have Zihintpause, then this will be a
> HINT that behaves like a NOP.
> But it is always a valid instruction (even if Zihintpause is not implemented).
Fair enough but to be aligned with Linux let's use PAUSE in
cpu_relax() rather than spin_locks().
I would prefer using WRS in spin_locks() with instruction patching.
Regards,
Anup
>
> >
> > > " lw %0, %3\n"
> > > RISCV_ACQUIRE_BARRIER
> > > " j 1b\n"
> > > --
> > > 2.44.0
> > >
> > >
> > > --
> > > opensbi mailing list
> > > opensbi at lists.infradead.org
> > > http://lists.infradead.org/mailman/listinfo/opensbi
> >
> > Regards,
> > Anup
More information about the opensbi
mailing list