| Message ID | 20260916200215.21774-6-brads@mainlining.org |
|---|---|
| State | New |
| Headers | show |
| Series | Add two-byte cmpxchg emulation and wire it into the architectures | expand |
On Wed, Sep 16, 2026 at 1:02 PM Bradley Morgan <brads@mainlining.org> wrote: > > Xtensa has no two-byte atomic compare and swap, so the __cmpxchg() > switch lets case 2 fall through to __cmpxchg_called_with_bad_pointer(), > which is declared but never defined, so a two-byte cmpxchg() fails at > link time. Route case 2 through the new cmpxchg_emu_u16(), which takes > natural u16 arguments, so the unsigned long old and new narrow at the > function boundary. > > Signed-off-by: Bradley Morgan <brads@mainlining.org> > --- > arch/xtensa/include/asm/cmpxchg.h | 1 + > 1 file changed, 1 insertion(+) Reviewed-by: Max Filippov <jcmvbkbc@gmail.com>
diff --git a/arch/xtensa/include/asm/cmpxchg.h b/arch/xtensa/include/asm/cmpxchg.h index b6db4838b175..8dea8e357fc0 100644 --- a/arch/xtensa/include/asm/cmpxchg.h +++ b/arch/xtensa/include/asm/cmpxchg.h @@ -76,6 +76,7 @@ __cmpxchg(volatile void *ptr, unsigned long old, unsigned long new, int size) { switch (size) { case 1: return cmpxchg_emu_u8(ptr, old, new); + case 2: return cmpxchg_emu_u16(ptr, old, new); case 4: return __cmpxchg_u32(ptr, old, new); default: __cmpxchg_called_with_bad_pointer(); return old;
Xtensa has no two-byte atomic compare and swap, so the __cmpxchg() switch lets case 2 fall through to __cmpxchg_called_with_bad_pointer(), which is declared but never defined, so a two-byte cmpxchg() fails at link time. Route case 2 through the new cmpxchg_emu_u16(), which takes natural u16 arguments, so the unsigned long old and new narrow at the function boundary. Signed-off-by: Bradley Morgan <brads@mainlining.org> --- arch/xtensa/include/asm/cmpxchg.h | 1 + 1 file changed, 1 insertion(+)