From: K Prateek Nayak <kprateek.nayak@amd.com>
To: Thomas Gleixner <tglx@kernel.org>, Ingo Molnar <mingo@redhat.com>,
"Peter Zijlstra" <peterz@infradead.org>,
Sebastian Andrzej Siewior <bigeasy@linutronix.de>,
Borislav Petkov <bp@alien8.de>,
Dave Hansen <dave.hansen@linux.intel.com>, <x86@kernel.org>,
Catalin Marinas <catalin.marinas@arm.com>,
Will Deacon <will@kernel.org>, Paul Walmsley <pjw@kernel.org>,
Palmer Dabbelt <palmer@dabbelt.com>,
Albert Ou <aou@eecs.berkeley.edu>,
Heiko Carstens <hca@linux.ibm.com>,
Vasily Gorbik <gor@linux.ibm.com>,
Alexander Gordeev <agordeev@linux.ibm.com>,
"Arnd Bergmann" <arnd@arndb.de>, Guo Ren <guoren@kernel.org>
Cc: "Darren Hart" <dvhart@infradead.org>,
"Davidlohr Bueso" <dave@stgolabs.net>,
"André Almeida" <andrealmeid@igalia.com>,
linux-arch@vger.kernel.org, linux-kernel@vger.kernel.org,
linux-s390@vger.kernel.org, linux-riscv@lists.infradead.org,
linux-arm-kernel@lists.infradead.org,
"K Prateek Nayak" <kprateek.nayak@amd.com>,
"H. Peter Anvin" <hpa@zytor.com>,
"Thomas Huth" <thuth@redhat.com>,
"Sean Christopherson" <seanjc@google.com>,
"Jisheng Zhang" <jszhang@kernel.org>,
"Alexandre Ghiti" <alex@ghiti.fr>,
"Charlie Jenkins" <charlie@rivosinc.com>,
"Charles Mirabile" <cmirabil@redhat.com>,
"Christian Borntraeger" <borntraeger@linux.ibm.com>,
"Sven Schnelle" <svens@linux.ibm.com>
Subject: [PATCH v4 0/8] futex: Use runtime constants for futex_hash computation
Date: Thu, 30 Apr 2026 09:47:22 +0000 [thread overview]
Message-ID: <20260430094730.31624-1-kprateek.nayak@amd.com> (raw)
tl;dr
This series introduces runtime_const_mask_32() and uses runtime
constants for __ro_after_init data in futex_hash() hot path. More
information can be found on v2 [1].
Comments that have *not* been addressed
=======================================
Samuel had an observation on v2 that __futex_mask is always of the form
GENMASK(N, 0) /* Only lower bits set; N > 0. */
and ARM64 and RISC-V can use a single ubfx (ARM64), or slli+srli pattern
(RISC-V) for the mask operation respectively but this had the main
limitation of runtime_const_mask_32() only working with masks of such
form and others should fail runtime_const_init() at boot.
RISC-V does generated a "addi + slli" pattern with CONFIG_BASE_SMALL=y
where the futex_hash_mask is known at compile time.
The old scheme is retained for now since it is equivalent to the
generated asm for !CONFIG_BASE_SMALL and can handle any arbitrary masks
allowing for all future use cases.
If there is enough interest, please let me know, and I can look into
further optimization to runtime_const_mask_32() based on the current use
case for __futex_hash.
Testing
=======
Apart from x86, which was build and boot tested on baremetal, all the
other architectures have been build and boot tested with cross-compile +
QEMU with some light sanity testing on each.
ARM64 build was tested with CONFIG_DEBUG_VIRTUAL enabled to catch any
potential fallouts from switching runtime constant patching to use
aarch64_insn_patch_text_nosync().
Patches are based on:
git.kernel.org/pub/scm/linux/kernel/git/tip/tip.git master
at commit 8f1aacb683ef4 ("Merge branch into tip/master: 'x86/tdx'")
(29-04-2026)
Few comments from checkpatch.pl have been ignored to adhere to the style
of the particular file. If something needs addressing, please let me
know and I'll address it in the next iteration.
Everyone has been Cc'd on the cover-letter and the futex bits for the
context. Respective arch maintainers, reviewers, and whoever got lucky
with get_maintainer.pl have been Cc'd on their respective arch specific
changes. Futex maintainers and the lists will be receiving the whole
series (sorry in advance!)
---
changelog v3..v4:
o Dropped the lm_alias() on the patching location and send the kernel
text address directly to aarch64_insn_patch_text_nosync() since the
function does not expect a lm_alias() address. (Sashiko, Catalin)
o Added Patch 4 to convert the RISC-V magic literal to a #define and use
that in the inline assembly. (Guo)
o Reverted the naming of the macro variable to __ret to prevent any
collision with the local variables at callsite. __ret seems to be the
safe convention that is followed for all runtime constant macros.
(Sashiko)
o Sashiko commented that weakly ordered architectures may see the
placeholder value of runtime constant before their initialization
which shouldn't be true.
Since these variables are initialized at early boot, the BSP should
commit all the local accesses in order which would prevent the
placeholder value from ever leaking out for weakly ordered
architectures that do not implement runtime constants.
For the architectures that do support runtime constants,
runtime_const_init() should provide adequate barrier after patching
all the call-sites.
As such, this concern is dismissed.
v3: https://lore.kernel.org/lkml/20260402112250.2138-1-kprateek.nayak@amd.com/
changelog rfc v2..v3:
o Collected Ack from Heiko for s390 bits after folding in their
suggested changes (Thanks a ton!)
o Reordered Patch 2 and Patch 3 to allow for runtime_const_init() at
late_initcall() first before introducing runtime_const_mask_32() on
ARM64. (David)
o Moved the "&" operation outside the inline asm block on ARM64 and
RISC-V which allows the compiler to optimize it further if possible.
(David)
o Dropped the RFC tag.
v2: https://lore.kernel.org/lkml/20260316052401.18910-1-kprateek.nayak@amd.com/ [1]
changelog rfc v1..rfc v2:
o Use runtime constants to avoid the dereference overheads for
dynamically allocated futex_queues.
o arch/ side plumbings for runtime_const_mask_32()
v1: https://lore.kernel.org/all/20260128101358.20954-1-kprateek.nayak@amd.com/
---
K Prateek Nayak (5):
arm64/runtime-const: Use aarch64_insn_patch_text_nosync() for patching
arm64/runtime-const: Introduce runtime_const_mask_32()
riscv/runtime-const: Replace open-coded placeholder with RUNTIME_MAGIC
riscv/runtime-const: Introduce runtime_const_mask_32()
s390/runtime-const: Introduce runtime_const_mask_32()
Peter Zijlstra (3):
x86/runtime-const: Introduce runtime_const_mask_32()
asm-generic/runtime-const: Add dummy runtime_const_mask_32()
futex: Use runtime constants for __futex_hash() hot path
arch/arm64/include/asm/runtime-const.h | 36 ++++++++++-----
arch/riscv/include/asm/runtime-const.h | 61 ++++++++++++++++++--------
arch/s390/include/asm/runtime-const.h | 22 +++++++++-
arch/x86/include/asm/runtime-const.h | 14 ++++++
include/asm-generic/runtime-const.h | 1 +
include/asm-generic/vmlinux.lds.h | 5 ++-
kernel/futex/core.c | 42 ++++++++++--------
7 files changed, 130 insertions(+), 51 deletions(-)
base-commit: 8f1aacb683ef4a49b83dcc40bfce022aaa4aa597
--
2.34.1
next reply other threads:[~2026-04-30 9:48 UTC|newest]
Thread overview: 9+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-04-30 9:47 K Prateek Nayak [this message]
2026-04-30 9:47 ` [PATCH v4 1/8] x86/runtime-const: Introduce runtime_const_mask_32() K Prateek Nayak
2026-04-30 9:47 ` [PATCH v4 2/8] arm64/runtime-const: Use aarch64_insn_patch_text_nosync() for patching K Prateek Nayak
2026-04-30 9:47 ` [PATCH v4 3/8] arm64/runtime-const: Introduce runtime_const_mask_32() K Prateek Nayak
2026-04-30 9:47 ` [PATCH v4 4/8] riscv/runtime-const: Replace open-coded placeholder with RUNTIME_MAGIC K Prateek Nayak
2026-04-30 9:47 ` [PATCH v4 5/8] riscv/runtime-const: Introduce runtime_const_mask_32() K Prateek Nayak
2026-04-30 9:47 ` [PATCH v4 6/8] s390/runtime-const: " K Prateek Nayak
2026-04-30 9:47 ` [PATCH v4 7/8] asm-generic/runtime-const: Add dummy runtime_const_mask_32() K Prateek Nayak
2026-04-30 9:47 ` [PATCH v4 8/8] futex: Use runtime constants for __futex_hash() hot path K Prateek Nayak
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=20260430094730.31624-1-kprateek.nayak@amd.com \
--to=kprateek.nayak@amd.com \
--cc=agordeev@linux.ibm.com \
--cc=alex@ghiti.fr \
--cc=andrealmeid@igalia.com \
--cc=aou@eecs.berkeley.edu \
--cc=arnd@arndb.de \
--cc=bigeasy@linutronix.de \
--cc=borntraeger@linux.ibm.com \
--cc=bp@alien8.de \
--cc=catalin.marinas@arm.com \
--cc=charlie@rivosinc.com \
--cc=cmirabil@redhat.com \
--cc=dave.hansen@linux.intel.com \
--cc=dave@stgolabs.net \
--cc=dvhart@infradead.org \
--cc=gor@linux.ibm.com \
--cc=guoren@kernel.org \
--cc=hca@linux.ibm.com \
--cc=hpa@zytor.com \
--cc=jszhang@kernel.org \
--cc=linux-arch@vger.kernel.org \
--cc=linux-arm-kernel@lists.infradead.org \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-riscv@lists.infradead.org \
--cc=linux-s390@vger.kernel.org \
--cc=mingo@redhat.com \
--cc=palmer@dabbelt.com \
--cc=peterz@infradead.org \
--cc=pjw@kernel.org \
--cc=seanjc@google.com \
--cc=svens@linux.ibm.com \
--cc=tglx@kernel.org \
--cc=thuth@redhat.com \
--cc=will@kernel.org \
--cc=x86@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