[PATCH v2 0/5] Add two-byte cmpxchg emulation and wire it into the architectures
From: Bradley Morgan
Date: Wed Sep 16 2026 - 16:04:54 EST
This adds cmpxchg_emu_u16() next to cmpxchg_emu_u8() and wires it into
the architectures that use the one byte emulation, arc, csky, sh and
xtensa.
David Laight noted that uintptr_t was an odd choice for the API and
suggested u16 as the natural type, so v2 takes u16 arguments and the
cast work moves to the architectures. The arc and csky call sites
cast to u16 instead of uintptr_t, and sh and xtensa pass the values
through unchanged, letting the narrowing happen at the function
boundary.
The experiment answers David's question about what the 32 bit word
compare does with an API typed u16. It compares only the 16 bits that
make up the halfword being emulated, because the union splice packs
the caller's old value into the selected halfword of the compare word
before the word wide cmpxchg runs, and the union layout puts every
h[i] at byte offset 2*i on both endian layouts. A value wider than 16
bits can never reach the compare, so the return value is the old
halfword contents, exactly what cmpxchg() returns on architectures
with a native two byte variant.
The ARMv6 wiring is dropped. Arnd Bergmann's platform removal series
makes the ARMv6 path unreachable once it lands, and he offered to take
the INTEGRATOR_CM1136JFS cleanup as part of it, so the wiring here
would be churn against his tree. I will forward port this part once
the mach-versatile removal actually happens, if the path still exists
then.
Patch 1 adds the function, the prototype, and renames the Kconfig
symbol to ARCH_NEED_CMPXCHG_1_2_EMU since it now gates both
emulations. Patches 2 through 5 add case 2 beside each existing case
1, following each file's current style. The function body follows the
two byte implementation in Paul's April 2024 RFC series, of which only
the one byte part landed as commit a88d970c8bb5 ("lib: Add one-byte
emulation function").
Verification. A host test ran 972 cases across both halfword offsets,
matching and mismatching compares, against a byte level reference
model, all passing. The remaining checkpatch warnings are the volatile
and long line ones that the merged cmpxchg_emu_u8() lines already
carry.
Changes since v1:
- u16 arguments instead of uintptr_t, per David Laight
- ARMv6 wiring dropped, per Arnd Bergmann's offer and the discussion
with Paul McKenney
- copyright lines now carry both authors, Paul's 2024 line and mine
Thank you, Paul McKenney, for suggesting this, and thank you David
Laight and Arnd Bergmann for the review.
Bradley Morgan (5):
lib: Add two-byte cmpxchg emulation function
ARC: Emulate two-byte cmpxchg
csky: Emulate two-byte cmpxchg
sh: Emulate two-byte cmpxchg
xtensa: Emulate two-byte cmpxchg
arch/Kconfig | 2 +-
arch/arc/Kconfig | 2 +-
arch/arc/include/asm/cmpxchg.h | 3 +++
arch/csky/Kconfig | 2 +-
arch/csky/include/asm/cmpxchg.h | 9 +++++++++
arch/sh/Kconfig | 2 +-
arch/sh/include/asm/cmpxchg.h | 2 ++
arch/xtensa/Kconfig | 2 +-
arch/xtensa/include/asm/cmpxchg.h | 1 +
include/linux/cmpxchg-emu.h | 4 +++-
lib/Makefile | 2 +-
lib/cmpxchg-emu.c | 38 ++++++++++++++++++++++------------
12 files changed, 58 insertions(+), 11 deletions(-)
--
2.47.3