[PATCH v3 0/7] futex: Use runtime constants for futex_hash computation

From: K Prateek Nayak

Date: Thu Apr 02 2026 - 07:28:51 EST


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 in this version
=======================================================

Samuel had an observation on v2 that __futex_mask is always of the form

((1 << bits) - 1) /* Only lower bits set; bits > 1. */

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 would fail runtime_const_init() at boot.

RISC-V does generated a "addi + slli" pattern with CONFIG_BASE_SMALL=y
where the futex_hash_mask can be computed 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.

Patches are based on:

git.kernel.org/pub/scm/linux/kernel/git/tip/tip.git master

at commit 1086b33a3f64 ("Merge branch into tip/master: 'x86/vdso'")
(2026-04-02)

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 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@xxxxxxx/ [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@xxxxxxx/
---
K Prateek Nayak (4):
arm64/runtime-const: Use aarch64_insn_patch_text_nosync() for patching
arm64/runtime-const: Introduce runtime_const_mask_32()
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 | 32 ++++++++++++++------
arch/riscv/include/asm/runtime-const.h | 22 ++++++++++++++
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, 107 insertions(+), 31 deletions(-)


base-commit: 1086b33a3f644c3bc37abefd699defc45accced1
--
2.34.1