[PATCH 03/17] powerpc/qspinlock: use a half-word store to unlock to avoid larx/stcx.
Nicholas Piggin
npiggin at gmail.com
Thu Nov 10 20:25:32 AEDT 2022
On Thu Nov 10, 2022 at 10:39 AM AEST, Jordan Niethe wrote:
> On Thu, 2022-07-28 at 16:31 +1000, Nicholas Piggin wrote:
> [resend as utf-8, not utf-7]
> > The first 16 bits of the lock are only modified by the owner, and other
> > modifications always use atomic operations on the entire 32 bits, so
> > unlocks can use plain stores on the 16 bits. This is the same kind of
> > optimisation done by core qspinlock code.
> > ---
> > arch/powerpc/include/asm/qspinlock.h | 6 +-----
> > arch/powerpc/include/asm/qspinlock_types.h | 19 +++++++++++++++++--
> > 2 files changed, 18 insertions(+), 7 deletions(-)
> >
> > diff --git a/arch/powerpc/include/asm/qspinlock.h b/arch/powerpc/include/asm/qspinlock.h
> > index f06117aa60e1..79a1936fb68d 100644
> > --- a/arch/powerpc/include/asm/qspinlock.h
> > +++ b/arch/powerpc/include/asm/qspinlock.h
> > @@ -38,11 +38,7 @@ static __always_inline void queued_spin_lock(struct qspinlock *lock)
> >
> > static inline void queued_spin_unlock(struct qspinlock *lock)
> > {
> > - for (;;) {
> > - int val = atomic_read(&lock->val);
> > - if (atomic_cmpxchg_release(&lock->val, val, val & ~_Q_LOCKED_VAL) == val)
> > - return;
> > - }
> > + smp_store_release(&lock->locked, 0);
>
> Is it also possible for lock_set_locked() to use a non-atomic acquire
> operation?
It has to be atomic as mentioned earlier.
Thanks,
Nick
More information about the Linuxppc-dev
mailing list