[PATCH v3 2/3] arm64: Optimize __READ_ONCE() with CONFIG_LTO=y
David Laight
david.laight.linux at gmail.com
Mon Feb 2 11:28:18 PST 2026
On Mon, 2 Feb 2026 15:36:40 +0000
Will Deacon <will at kernel.org> wrote:
> On Fri, Jan 30, 2026 at 02:28:25PM +0100, Marco Elver wrote:
> > Rework arm64 LTO __READ_ONCE() to improve code generation as follows:
... \
> > default: \
> > - atomic = 0; \
> > + __u.__val = *(volatile typeof(*__x) *)__x; \
>
> Since we're not providing acquire semantics for the non-atomic case,
> what we really want is the generic definition of __READ_ONCE() from
> include/asm-generic/rwonce.h here. The header inclusion mess prevents
> that, but why can't we just inline that definition here for the
> 'default' case? If TYPEOF_UNQUAL() leads to better codegen, shouldn't
> we use that to implement __unqual_scalar_typeof() when it is available?
>
> I fear I'm missing something here, but it just feels like we're
> optimising a pretty niche case (arm64 + LTO + non-atomic __READ_ONCE())
> in a way that looks more generally applicable.
Is that path even needed?
I'm sure I've built an x86-64 allmodconfig with it being an error.
If you look back in the history it used to be an error.
Anything to simplify READ_ONCE() will noticeably speed up build times.
Even on x86 just removing the check that the size is 1, 2, 4 or 8
makes a measurable difference - and that check doesn't need to be done
on every compile.
I'm not setup to do arm builds - never mind LTO ones.
(Yes, I know, it 'just' involves downloading the toolchain.)
David
More information about the linux-arm-kernel
mailing list