Skip to content

Commit

Permalink
powerpc/qspinlock: use a half-word store to unlock to avoid larx/stcx.
Browse files Browse the repository at this point in the history
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.

Signed-off-by: Nicholas Piggin <npiggin@gmail.com>
Signed-off-by: Michael Ellerman <mpe@ellerman.id.au>
Link: https://lore.kernel.org/r/20221126095932.1234527-3-npiggin@gmail.com
  • Loading branch information
Nicholas Piggin authored and Michael Ellerman committed Dec 2, 2022
1 parent 84990b1 commit 4c93c2e
Show file tree
Hide file tree
Showing 2 changed files with 18 additions and 7 deletions.
6 changes: 1 addition & 5 deletions arch/powerpc/include/asm/qspinlock.h
Original file line number Diff line number Diff line change
Expand Up @@ -37,11 +37,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);
}

#define arch_spin_is_locked(l) queued_spin_is_locked(l)
Expand Down
19 changes: 17 additions & 2 deletions arch/powerpc/include/asm/qspinlock_types.h
Original file line number Diff line number Diff line change
Expand Up @@ -3,12 +3,27 @@
#define _ASM_POWERPC_QSPINLOCK_TYPES_H

#include <linux/types.h>
#include <asm/byteorder.h>

typedef struct qspinlock {
atomic_t val;
union {
atomic_t val;

#ifdef __LITTLE_ENDIAN
struct {
u16 locked;
u8 reserved[2];
};
#else
struct {
u8 reserved[2];
u16 locked;
};
#endif
};
} arch_spinlock_t;

#define __ARCH_SPIN_LOCK_UNLOCKED { .val = ATOMIC_INIT(0) }
#define __ARCH_SPIN_LOCK_UNLOCKED { { .val = ATOMIC_INIT(0) } }

/*
* Bitfields in the lock word:
Expand Down

0 comments on commit 4c93c2e

Please sign in to comment.