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