From: David Laight <david.laight.linux@gmail.com>
To: "Paul E. McKenney" <paulmck@kernel.org>
Cc: Bradley Morgan <brads@mainlining.org>,
frederic@kernel.org, neeraj.upadhyay@kernel.org,
boqun@kernel.org, joelagnelf@nvidia.com, rcu@vger.kernel.org,
Andrew Morton <akpm@linux-foundation.org>,
Arnd Bergmann <arnd@arndb.de>,
linux-arch@vger.kernel.org, Vineet Gupta <vgupta@kernel.org>,
linux-snps-arc@lists.infradead.org,
Russell King <linux@armlinux.org.uk>,
linux-arm-kernel@lists.infradead.org, Guo Ren <guoren@kernel.org>,
linux-csky@vger.kernel.org,
Yoshinori Sato <ysato@users.sourceforge.jp>,
Rich Felker <dalias@libc.org>,
John Paul Adrian Glaubitz <glaubitz@physik.fu-berlin.de>,
linux-sh@vger.kernel.org, Chris Zankel <chris@zankel.net>,
Max Filippov <jcmvbkbc@gmail.com>,
linux-kernel@vger.kernel.org
Subject: Re: [PATCH 1/6] lib: Add two-byte cmpxchg emulation function
Date: Sat, 12 Sep 2026 10:30:47 +0100 [thread overview]
Message-ID: <20260912103047.1b95bb03@pumpkin> (raw)
In-Reply-To: <d0ef7beb-6952-49cc-9b33-e7542e831ba6@paulmck-laptop>
On Fri, 11 Sep 2026 16:09:16 -0700
"Paul E. McKenney" <paulmck@kernel.org> wrote:
> On Fri, Sep 11, 2026 at 11:10:17PM +0100, David Laight wrote:
> > On Fri, 11 Sep 2026 19:25:34 +0000
> > Bradley Morgan <brads@mainlining.org> wrote:
> >
> > > cmpxchg_emu_u8() emulates one-byte cmpxchg() in terms of four-byte
> > > cmpxchg() for the architectures lacking native one-byte atomics.
> > > The same architectures also lack native two-byte cmpxchg(), where
> > > such an operation is not supported and either fails to compile via
> > > BUILD_BUG() or fails to link, because the bad pointer sentinels
> > > these architectures declare are never defined.
> > >
> > > Add cmpxchg_emu_u16(), the two-byte sibling. It reads the enclosing
> > > word with READ_ONCE(), splices the two target bytes through a union
> > > and loops on cmpxchg() of the full word until the compare succeeds.
> > > Like cmpxchg_emu_u8() it is fully ordered.
> > >
> > > The Kconfig symbol gating this file is renamed from
> > > ARCH_NEED_CMPXCHG_1_EMU to ARCH_NEED_CMPXCHG_1_2_EMU, as it now
> > > selects both the one-byte and the two-byte emulation.
> > >
> > > Suggested-by: Paul E. McKenney <paulmck@kernel.org>
> > > Signed-off-by: Bradley Morgan <brads@mainlining.org>
> > > ---
> > > arch/Kconfig | 2 +-
> > > arch/arc/Kconfig | 2 +-
> > > arch/arm/Kconfig | 2 +-
> > > arch/csky/Kconfig | 2 +-
> > > arch/sh/Kconfig | 2 +-
> > > arch/xtensa/Kconfig | 2 +-
> > > include/linux/cmpxchg-emu.h | 1 +
> > > lib/Makefile | 2 +-
> > > lib/cmpxchg-emu.c | 35 ++++++++++++++++++++++++++++++++---
> > > 9 files changed, 40 insertions(+), 10 deletions(-)
> > >
> > ...
> > > diff --git a/include/linux/cmpxchg-emu.h b/include/linux/cmpxchg-emu.h
> > > index 998deec67740..fee8171fa05e 100644
> > > --- a/include/linux/cmpxchg-emu.h
> > > +++ b/include/linux/cmpxchg-emu.h
> > > @@ -11,5 +11,6 @@
> > > #define __LINUX_CMPXCHG_EMU_H
> > >
> > > uintptr_t cmpxchg_emu_u8(volatile u8 *p, uintptr_t old, uintptr_t new);
> > > +uintptr_t cmpxchg_emu_u16(volatile u16 *p, uintptr_t old, uintptr_t new);
> >
> > Why uintptr_t? Shouldn't it just be u16?
> > (Which probably means the code would better if it was just 'unsigned int')
>
> I suspect that Bradley is just following my cmpxchg_emu_u8() example,
> which also returns uintptr_t.
>
> I remember that *something* broke when I made this be u8, but I cannot
> recall what the problem was.
>
> Bradley, could you please try making it be u16 as David suggests just to
> see what happens? Who knows? Maybe it was a compiler issue that has
> since been fixed. Or maybe the macros and asms using cmpxchg_emu_u8()
> need that uintptr_t for some reason.
I think the uintptr (unsigned long) cast is needed to stop a compile
error when exchanging pointers.
But that is an issue with the #define not the called functions.
Possibly changing the #define to have:
unsigned long ul_old = (unsigned long)(old);
Or even, with the type check from:
unsigned long ul_old = (unsigned long)(0 ? *(ptr) : (old));
(with the same for 'new')
and the removing all the casts where the value are used might be better.
David
>
> Thanx, Paul
WARNING: multiple messages have this Message-ID (diff)
From: David Laight <david.laight.linux@gmail.com>
To: "Paul E. McKenney" <paulmck@kernel.org>
Cc: Bradley Morgan <brads@mainlining.org>,
frederic@kernel.org, neeraj.upadhyay@kernel.org,
boqun@kernel.org, joelagnelf@nvidia.com, rcu@vger.kernel.org,
Andrew Morton <akpm@linux-foundation.org>,
Arnd Bergmann <arnd@arndb.de>,
linux-arch@vger.kernel.org, Vineet Gupta <vgupta@kernel.org>,
linux-snps-arc@lists.infradead.org,
Russell King <linux@armlinux.org.uk>,
linux-arm-kernel@lists.infradead.org, Guo Ren <guoren@kernel.org>,
linux-csky@vger.kernel.org,
Yoshinori Sato <ysato@users.sourceforge.jp>,
Rich Felker <dalias@libc.org>,
John Paul Adrian Glaubitz <glaubitz@physik.fu-berlin.de>,
linux-sh@vger.kernel.org, Chris Zankel <chris@zankel.net>,
Max Filippov <jcmvbkbc@gmail.com>,
linux-kernel@vger.kernel.org
Subject: Re: [PATCH 1/6] lib: Add two-byte cmpxchg emulation function
Date: Sat, 12 Sep 2026 10:30:47 +0100 [thread overview]
Message-ID: <20260912103047.1b95bb03@pumpkin> (raw)
In-Reply-To: <d0ef7beb-6952-49cc-9b33-e7542e831ba6@paulmck-laptop>
On Fri, 11 Sep 2026 16:09:16 -0700
"Paul E. McKenney" <paulmck@kernel.org> wrote:
> On Fri, Sep 11, 2026 at 11:10:17PM +0100, David Laight wrote:
> > On Fri, 11 Sep 2026 19:25:34 +0000
> > Bradley Morgan <brads@mainlining.org> wrote:
> >
> > > cmpxchg_emu_u8() emulates one-byte cmpxchg() in terms of four-byte
> > > cmpxchg() for the architectures lacking native one-byte atomics.
> > > The same architectures also lack native two-byte cmpxchg(), where
> > > such an operation is not supported and either fails to compile via
> > > BUILD_BUG() or fails to link, because the bad pointer sentinels
> > > these architectures declare are never defined.
> > >
> > > Add cmpxchg_emu_u16(), the two-byte sibling. It reads the enclosing
> > > word with READ_ONCE(), splices the two target bytes through a union
> > > and loops on cmpxchg() of the full word until the compare succeeds.
> > > Like cmpxchg_emu_u8() it is fully ordered.
> > >
> > > The Kconfig symbol gating this file is renamed from
> > > ARCH_NEED_CMPXCHG_1_EMU to ARCH_NEED_CMPXCHG_1_2_EMU, as it now
> > > selects both the one-byte and the two-byte emulation.
> > >
> > > Suggested-by: Paul E. McKenney <paulmck@kernel.org>
> > > Signed-off-by: Bradley Morgan <brads@mainlining.org>
> > > ---
> > > arch/Kconfig | 2 +-
> > > arch/arc/Kconfig | 2 +-
> > > arch/arm/Kconfig | 2 +-
> > > arch/csky/Kconfig | 2 +-
> > > arch/sh/Kconfig | 2 +-
> > > arch/xtensa/Kconfig | 2 +-
> > > include/linux/cmpxchg-emu.h | 1 +
> > > lib/Makefile | 2 +-
> > > lib/cmpxchg-emu.c | 35 ++++++++++++++++++++++++++++++++---
> > > 9 files changed, 40 insertions(+), 10 deletions(-)
> > >
> > ...
> > > diff --git a/include/linux/cmpxchg-emu.h b/include/linux/cmpxchg-emu.h
> > > index 998deec67740..fee8171fa05e 100644
> > > --- a/include/linux/cmpxchg-emu.h
> > > +++ b/include/linux/cmpxchg-emu.h
> > > @@ -11,5 +11,6 @@
> > > #define __LINUX_CMPXCHG_EMU_H
> > >
> > > uintptr_t cmpxchg_emu_u8(volatile u8 *p, uintptr_t old, uintptr_t new);
> > > +uintptr_t cmpxchg_emu_u16(volatile u16 *p, uintptr_t old, uintptr_t new);
> >
> > Why uintptr_t? Shouldn't it just be u16?
> > (Which probably means the code would better if it was just 'unsigned int')
>
> I suspect that Bradley is just following my cmpxchg_emu_u8() example,
> which also returns uintptr_t.
>
> I remember that *something* broke when I made this be u8, but I cannot
> recall what the problem was.
>
> Bradley, could you please try making it be u16 as David suggests just to
> see what happens? Who knows? Maybe it was a compiler issue that has
> since been fixed. Or maybe the macros and asms using cmpxchg_emu_u8()
> need that uintptr_t for some reason.
I think the uintptr (unsigned long) cast is needed to stop a compile
error when exchanging pointers.
But that is an issue with the #define not the called functions.
Possibly changing the #define to have:
unsigned long ul_old = (unsigned long)(old);
Or even, with the type check from:
unsigned long ul_old = (unsigned long)(0 ? *(ptr) : (old));
(with the same for 'new')
and the removing all the casts where the value are used might be better.
David
>
> Thanx, Paul
_______________________________________________
linux-snps-arc mailing list
linux-snps-arc@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/linux-snps-arc
next prev parent reply other threads:[~2026-09-12 9:30 UTC|newest]
Thread overview: 21+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-09-11 19:25 [PATCH 0/6] Add two-byte cmpxchg emulation and wire it into the architectures Bradley Morgan
2026-09-11 19:25 ` [PATCH 1/6] lib: Add two-byte cmpxchg emulation function Bradley Morgan
2026-09-11 22:10 ` David Laight
2026-09-11 22:10 ` David Laight
2026-09-11 22:13 ` Bradley Morgan
2026-09-11 23:09 ` Paul E. McKenney
2026-09-11 23:09 ` Paul E. McKenney
2026-09-12 9:30 ` David Laight [this message]
2026-09-12 9:30 ` David Laight
2026-09-12 10:29 ` Bradley Morgan
2026-09-12 18:58 ` Paul E. McKenney
2026-09-12 18:58 ` Paul E. McKenney
2026-09-12 21:11 ` Bradley Morgan
2026-09-11 19:25 ` [PATCH 2/6] ARC: Emulate two-byte cmpxchg Bradley Morgan
2026-09-11 19:25 ` [PATCH 3/6] ARM: Emulate two-byte cmpxchg on ARMv6 Bradley Morgan
2026-09-11 19:25 ` [PATCH 4/6] csky: Emulate two-byte cmpxchg Bradley Morgan
2026-09-11 19:25 ` [PATCH 5/6] sh: " Bradley Morgan
2026-09-11 19:25 ` [PATCH 6/6] xtensa: " Bradley Morgan
2026-09-11 20:17 ` [PATCH 0/6] Add two-byte cmpxchg emulation and wire it into the architectures Arnd Bergmann
2026-09-11 20:17 ` Arnd Bergmann
2026-09-11 20:20 ` Bradley Morgan
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20260912103047.1b95bb03@pumpkin \
--to=david.laight.linux@gmail.com \
--cc=akpm@linux-foundation.org \
--cc=arnd@arndb.de \
--cc=boqun@kernel.org \
--cc=brads@mainlining.org \
--cc=chris@zankel.net \
--cc=dalias@libc.org \
--cc=frederic@kernel.org \
--cc=glaubitz@physik.fu-berlin.de \
--cc=guoren@kernel.org \
--cc=jcmvbkbc@gmail.com \
--cc=joelagnelf@nvidia.com \
--cc=linux-arch@vger.kernel.org \
--cc=linux-arm-kernel@lists.infradead.org \
--cc=linux-csky@vger.kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-sh@vger.kernel.org \
--cc=linux-snps-arc@lists.infradead.org \
--cc=linux@armlinux.org.uk \
--cc=neeraj.upadhyay@kernel.org \
--cc=paulmck@kernel.org \
--cc=rcu@vger.kernel.org \
--cc=vgupta@kernel.org \
--cc=ysato@users.sourceforge.jp \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.