[PATCH v9 0/3] arm64: vdso: Implement __vdso_futex_robust_try_unlock()
From: André Almeida <andrealmeid@igalia.com>
Date: 2026-09-18 00:27:26
Also in:
linux-arch, lkml
Hi folks, This is my take on implementing the new vDSO for unlocking a robust futex in arm64. If you don't know what's that, Thomas wrote a good summary, including the motivation for this work and the x86 implementation: https://lore.kernel.org/lkml/878qb89g7b.ffs@tglx/ (local) * Testing There's one selftest proposed [1] that tests precisely if the task is interrupted during the critical section, if the kernel will clear op_pending pointer. I've adapted to arm64 [2] and it works as expected. This test is not being upstreamed right now because it depends on a better way to expose vdso.so.dbg [3]. I also used gdb to manually check if the address is cleared when the kernel interrupts the critical section. Thanks! André [1] https://lore.kernel.org/lkml/20260404093939.7XgeW_54@linutronix.de/ (local) [2] https://lore.kernel.org/lkml/20260529-tonyk-robust_arm-v3-3-a6f02684d4fe@igalia.com/ (local) [3] https://lore.kernel.org/lkml/20260602090536.045586688@kernel.org/ (local) Changes in v9: - Refactored asm code style - Fix registers constrains, making sure that [pop_reg] uses the allocated register and mark [lock] as read-write - Simplified arm64_futex_robust_unlock_get_pop() with regs->regs[] - Reduced the scope a bit, dropped the compat vdso32 bit entry for now. It needs to first be added to arch/arm/, and later to arch/arm64/kernel/vdso32/ to ensure that they are the same thing. I will add those bits in a next series, as arch/arm needs a different toolchain, vm image, test and so on. - v8: https://patch.msgid.link/20260821-tonyk-robust_arm-v8-0-077707b6f1c7@igalia.com Changes in v8: - Fix build when CONFIG_FUTEX is disabled - v7: https://patch.msgid.link/20260728-tonyk-robust_arm-v7-0-40873c377c63@igalia.com Changes in v7: - vdso32: Use stlex instead of strex to ensure release semanthics - vdso32: result reg should use "=&r" clobber - both: pop_reg will be read afterwards so it was moved to be an input operand, with "+Q" clobber" v6: https://patch.msgid.link/20260720-tonyk-robust_arm-v6-0-7e68c122047e@igalia.com Changes in v6: - Reorganized the patchset, better split for helpers functions vs aarch64 vs arm32 code - Use "full name" for labels instead of macros - Completely reworded "Implement __vdso_futex_robust_try_unlock()" to make it more obvious what's the bug and how does this fix it v5: https://patch.msgid.link/20260717-tonyk-robust_arm-v5-0-ffd1ad318d17@igalia.com Changes in v5: - Drop unneeded commit "arm64/entry: Unify user mode handling" - Replace "_success" with "_start" labels in vdso_futex_robust_unlock_update_ips - Added "cc" to the asm clobberlist v4: https://patch.msgid.link/20260705-tonyk-robust_arm-v4-0-e0fd0fa259d3@igalia.com Changes in v4: - Added commit "arm64/entry: Unify user mode handling" - Added missing ifdef FUTEX_ROBUST_UNLOCK guards - Fixed the position of _start and _success labels in the critical section - Instead of checking the zero flag, check the result register to decide if the op_pending needs to be cleared v3: https://patch.msgid.link/20260529-tonyk-robust_arm-v3-0-a6f02684d4fe@igalia.com Changes in v3: - Change asm to always use x2 to store *pop - Fix clang asm errors - Moved 32 bit entry point to vdso32/ and use littlearm asm - Adapted Sebastians test for arm v2: https://patch.msgid.link/20260424-tonyk-robust_arm-v2-0-db4e46f752cf@igalia.com Changes in v2: - s/CONFIG_COMPAT/CONFIG_COMPAT_VDSO (Thomas Weißschuh) - Fixed linker not finding the symbols (Thomas Weißschuh) v1: https://patch.msgid.link/20260417-tonyk-robust_arm-v1-0-03aa64e2ff1a@igalia.com --- André Almeida (2): arm64: vdso: Prepare for robust futex unlock support arm64: vdso: Implement __vdso_futex_robust_try_unlock() Mark Rutland (1): arm64: vdso: Split native/compat mremap callbacks arch/arm64/Kconfig | 1 + arch/arm64/include/asm/futex_robust.h | 24 ++++++++++++++++++++ arch/arm64/kernel/vdso.c | 42 +++++++++++++++++++++++++++++++++-- arch/arm64/kernel/vdso/Makefile | 10 +++++++++ arch/arm64/kernel/vdso/vdso.lds.S | 9 ++++++++ arch/arm64/kernel/vdso/vfutex.c | 41 ++++++++++++++++++++++++++++++++++ 6 files changed, 125 insertions(+), 2 deletions(-) --- base-commit: 238650ef6c7c7cca08e032527329424c9fbd70e5 change-id: 20260416-tonyk-robust_arm-54ff77d2c4e4 Best regards, -- André Almeida [off-list ref]