Messages in this thread | | | From | David Laight <> | Subject | RE: [PATCH V7 1/5] asm-generic: ticket-lock: Remove unnecessary atomic_read | Date | Wed, 29 Jun 2022 08:27:19 +0000 |
| |
From: guoren@kernel.org > Sent: 28 June 2022 09:17 > > From: Guo Ren <guoren@linux.alibaba.com> > > Remove unnecessary atomic_read in arch_spin_value_unlocked(lock), > because the value has been in lock. This patch could prevent > arch_spin_value_unlocked contend spin_lock data again.
I'm confused (as usual). Isn't atomic_read() pretty much free?
.. > diff --git a/include/asm-generic/spinlock.h b/include/asm-generic/spinlock.h > index fdfebcb050f4..f1e4fa100f5a 100644 > --- a/include/asm-generic/spinlock.h > +++ b/include/asm-generic/spinlock.h > @@ -84,7 +84,9 @@ static __always_inline int arch_spin_is_contended(arch_spinlock_t *lock) > > static __always_inline int arch_spin_value_unlocked(arch_spinlock_t lock) > { > - return !arch_spin_is_locked(&lock); > + u32 val = lock.counter; > + > + return ((val >> 16) == (val & 0xffff));
That almost certainly needs a READ_ONCE().
The result is also inherently stale. So the uses must be pretty limited.
David
> } > > #include <asm/qrwlock.h> > -- > 2.36.1
- Registered Address Lakeside, Bramley Road, Mount Farm, Milton Keynes, MK1 1PT, UK Registration No: 1397386 (Wales)
| |