From: Marco Elver <elver@google.com>
To: elver@google.com, Peter Zijlstra <peterz@infradead.org>,
Will Deacon <will@kernel.org>
Cc: Ingo Molnar <mingo@kernel.org>,
Thomas Gleixner <tglx@linutronix.de>,
Boqun Feng <boqun.feng@gmail.com>,
Waiman Long <longman@redhat.com>,
Bart Van Assche <bvanassche@acm.org>,
llvm@lists.linux.dev,
David Laight <david.laight.linux@gmail.com>,
Catalin Marinas <catalin.marinas@arm.com>,
Arnd Bergmann <arnd@arndb.de>,
linux-arm-kernel@lists.infradead.org,
linux-kernel@vger.kernel.org
Subject: [PATCH v3 0/3] arm64: Fixes for __READ_ONCE() with CONFIG_LTO=y
Date: Fri, 30 Jan 2026 14:28:23 +0100 [thread overview]
Message-ID: <20260130132951.2714396-1-elver@google.com> (raw)
While investigating a Clang Context Analysis [1] false positive [2], I started
to dig deeper into arm64's __READ_ONCE() implementation with LTO. That rabbit
hole led me to find one critical bug with the current implementation (patch 1),
and subtle improvements that then enabled me to fix the original false positive.
Patch 1 fixes a bug where READ_ONCE() on types larger than 8 bytes (non-atomic
fallback) incorrectly qualified the pointer rather than the pointee as volatile.
This resulted in a lack of "once" semantics for large struct loads.
Patch 2 refactors the macro to use __rwonce_typeof_unqual() and
eliminates the ternary conditional.
Building on the refactor, patch 3 fixes the context analysis false positive, by
helping its alias analysis "see through" the __READ_ONCE despite the inline asm.
## Note on Alternative for Patch 3
An alternative considered for the Context Analysis fix was introducing a helper
function to redirect the pointer alias; specifically passing a pointer to
const-pointer does not invalidate an alias either (casting away the const is a
deliberate escape hatch, albeit somewhat unusual looking). This approach was
slightly more verbose, so the simpler approach was chosen for now. It is
preserved here for future reference in case we need it for something else:
static __always_inline void __set_pointer_opaque(void *const *dst, const void *val)
{
*(void **)dst = (void *)val;
}
...
__set_pointer_opaque((void *const *)&__ret, &__u.__val);
...
[1] https://docs.kernel.org/next/dev-tools/context-analysis.html
[2] https://lore.kernel.org/all/202601221040.TeM0ihff-lkp@intel.com/
---
v3:
* Comments-smithing.
* Use 'typeof(*__ret) __val'
v2:
* Add __rwonce_typeof_unqual() as fallback for old compilers.
Marco Elver (3):
arm64: Fix non-atomic __READ_ONCE() with CONFIG_LTO=y
arm64: Optimize __READ_ONCE() with CONFIG_LTO=y
arm64, compiler-context-analysis: Permit alias analysis through
__READ_ONCE() with CONFIG_LTO=y
arch/arm64/include/asm/rwonce.h | 27 ++++++++++++++++++++++-----
1 file changed, 22 insertions(+), 5 deletions(-)
--
2.53.0.rc1.225.gd81095ad13-goog
next reply other threads:[~2026-01-30 13:30 UTC|newest]
Thread overview: 37+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-01-30 13:28 Marco Elver [this message]
2026-01-30 13:28 ` [PATCH v3 1/3] arm64: Fix non-atomic __READ_ONCE() with CONFIG_LTO=y Marco Elver
2026-01-30 15:06 ` David Laight
2026-01-30 13:28 ` [PATCH v3 2/3] arm64: Optimize " Marco Elver
2026-01-30 15:11 ` David Laight
2026-02-02 15:36 ` Will Deacon
2026-02-02 16:01 ` Peter Zijlstra
2026-02-02 16:05 ` Will Deacon
2026-02-02 17:48 ` Marco Elver
2026-02-02 19:28 ` David Laight
2026-01-30 13:28 ` [PATCH v3 3/3] arm64, compiler-context-analysis: Permit alias analysis through " Marco Elver
2026-01-30 15:13 ` David Laight
2026-02-02 15:39 ` Will Deacon
2026-02-02 19:29 ` David Laight
2026-02-03 11:47 ` Will Deacon
2026-02-04 10:46 ` Marco Elver
2026-02-04 13:14 ` Peter Zijlstra
2026-02-04 14:15 ` Will Deacon
2026-02-06 15:09 ` Marco Elver
2026-02-06 18:26 ` David Laight
2026-02-15 21:55 ` Marco Elver
2026-02-15 22:16 ` David Laight
2026-02-15 22:43 ` Marco Elver
2026-02-15 23:18 ` David Laight
2026-02-15 23:40 ` Linus Torvalds
2026-02-16 11:09 ` David Laight
2026-02-16 15:32 ` Linus Torvalds
2026-02-16 17:43 ` David Laight
2026-02-17 12:16 ` Peter Zijlstra
2026-02-17 14:25 ` David Laight
2026-02-17 16:23 ` Linus Torvalds
2026-02-17 16:32 ` Linus Torvalds
2026-02-18 19:34 ` Boqun Feng
2026-02-18 20:18 ` Linus Torvalds
2026-02-19 15:21 ` Gary Guo
2026-02-19 18:36 ` Linus Torvalds
2026-02-02 19:13 ` [PATCH v3 0/3] arm64: Fixes for " Will Deacon
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=20260130132951.2714396-1-elver@google.com \
--to=elver@google.com \
--cc=arnd@arndb.de \
--cc=boqun.feng@gmail.com \
--cc=bvanassche@acm.org \
--cc=catalin.marinas@arm.com \
--cc=david.laight.linux@gmail.com \
--cc=linux-arm-kernel@lists.infradead.org \
--cc=linux-kernel@vger.kernel.org \
--cc=llvm@lists.linux.dev \
--cc=longman@redhat.com \
--cc=mingo@kernel.org \
--cc=peterz@infradead.org \
--cc=tglx@linutronix.de \
--cc=will@kernel.org \
/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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox