[PATCH 07/17] powerpc/qspinlock: store owner CPU in lock word
Nicholas Piggin
npiggin at gmail.com
Thu Nov 10 21:59:52 AEDT 2022
On Thu Nov 10, 2022 at 10:40 AM AEST, Jordan Niethe wrote:
> On Thu, 2022-07-28 at 16:31 +1000, Nicholas Piggin wrote:
> [resend as utf-8, not utf-7]
> > Store the owner CPU number in the lock word so it may be yielded to,
> > as powerpc's paravirtualised simple spinlocks do.
> > ---
> > arch/powerpc/include/asm/qspinlock.h | 8 +++++++-
> > arch/powerpc/include/asm/qspinlock_types.h | 10 ++++++++++
> > arch/powerpc/lib/qspinlock.c | 6 +++---
> > 3 files changed, 20 insertions(+), 4 deletions(-)
> >
> > diff --git a/arch/powerpc/include/asm/qspinlock.h b/arch/powerpc/include/asm/qspinlock.h
> > index 3ab354159e5e..44601b261e08 100644
> > --- a/arch/powerpc/include/asm/qspinlock.h
> > +++ b/arch/powerpc/include/asm/qspinlock.h
> > @@ -20,9 +20,15 @@ static __always_inline int queued_spin_is_contended(struct qspinlock *lock)
> > return !!(READ_ONCE(lock->val) & _Q_TAIL_CPU_MASK);
> > }
> >
> > +static __always_inline u32 queued_spin_get_locked_val(void)
>
> Maybe this function should have "encode" in the name to match with
> encode_tail_cpu().
Yep.
> > +{
> > + /* XXX: make this use lock value in paca like simple spinlocks? */
>
> Is that the paca's lock_token which is 0x8000?
Yes, which AFAIKS is actually unused now with queued spinlocks.
> > + return _Q_LOCKED_VAL | (smp_processor_id() << _Q_OWNER_CPU_OFFSET);
> > +}
> > +
> > static __always_inline int queued_spin_trylock(struct qspinlock *lock)
> > {
> > - u32 new = _Q_LOCKED_VAL;
> > + u32 new = queued_spin_get_locked_val();
> > u32 prev;
> >
> > asm volatile(
> > diff --git a/arch/powerpc/include/asm/qspinlock_types.h b/arch/powerpc/include/asm/qspinlock_types.h
> > index 8b20f5e22bba..35f9525381e6 100644
> > --- a/arch/powerpc/include/asm/qspinlock_types.h
> > +++ b/arch/powerpc/include/asm/qspinlock_types.h
> > @@ -29,6 +29,8 @@ typedef struct qspinlock {
> > * Bitfields in the lock word:
> > *
> > * 0: locked bit
> > + * 1-14: lock holder cpu
> > + * 15: unused bit
> > * 16: must queue bit
> > * 17-31: tail cpu (+1)
>
> So there is one more bit to store the tail cpu vs the lock holder cpu?
Yeah but the tail has to encode it as CPU+1.
Thanks,
Nick
More information about the Linuxppc-dev
mailing list