Re: [PATCH v3 0/5] Add two-byte cmpxchg emulation and wire it into the architectures
From: David Laight
Date: Fri Sep 18 2026 - 05:24:23 EST
On Thu, 17 Sep 2026 16:38:25 +0000
Bradley Morgan <brads@xxxxxxxxxxxxxx> wrote:
> This is v3 of the two byte cmpxchg emulation series, wiring
> cmpxchg_emu_u16() into arc, csky, sh and xtensa.
>
> v2 tried u16 as the parameter type. David Laight pointed out that
> this does not compile warning free when exchanging a pointer type,
> because the switch statements in the architecture macros instantiate
> every size case, so a pointer cmpxchg() type checks the two byte
> case, and the (u16) casts there warn. v3 takes the old and new
> values as unsigned long and casts to u16 inside the function, so the
> call sites need no narrowing casts and pointer exchanges compile
> clean. The function still compares and returns exactly the 16 bits
> of the emulated halfword, which matches hardware cmpxchg r16
> behaviour, and a host test of 972 cases across both halfword offsets
> against a byte level reference model still passes.
>
> David also noted the missing pointer to integer type check in some
> of the macros, so cmpxchg(&p, 4, 5) compiled silently. The csky
> macros typed __old and __new through __typeof__(old), which skips
> the check, and sh had none either. Both now type check through
> (unsigned long)(0 ? *(ptr) : (old)), the idiom David suggested,
> which keeps the pointer to integer conversion explicit while making
> the compiler reject mismatched types. Both of his test cases now
> fail to compile on every macro shape.
You fixed csky but not the others.
I guess that could be a separate patch (maybe series).
David
>
> The ARMv6 wiring stays dropped from v1, per Arnd Bergmann's offer to
> take the INTEGRATOR_CM1136JFS cleanup in his platform removal series.
>
> Thank you, Paul McKenney for suggesting this, and David Laight and
> Arnd Bergmann for the review that shaped all three revisions.
>
> 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