André Almeida of the consulting firm Igalia posted version 7 of two new Linux system calls, set_robust_list2() and get_robust_list2(), on September 25, 2026. They fix a gap that stops emulators such as FEX-Emu from handling locks correctly when they run 32-bit x86 programs on Arm64 machines. It is the first new revision since v6 on November 22, 2025.
A system call, or syscall, is the fixed door a program uses to ask the kernel for something. This pair is now on its seventh version.
What a robust futex list does
A futex is a lock that lives in a program's own memory. The kernel documentation describes futexes as locks that, when nobody else wants them, "can be acquired/released from userspace without having to enter the kernel." That makes them fast, and they sit underneath ordinary thread locks such as pthread mutexes.
The trouble starts when a thread dies while it still holds a lock. Other threads could then wait forever. A robust futex list solves that. Each thread keeps a list of the locks it holds, usually managed by a library such as glibc, and tells the kernel where that list lives.
When the thread exits, the kernel "carefully walks the list," according to the documentation. It marks every lock the thread owned with a FUTEX_OWNER_DIED flag and wakes one waiting thread. The next thread to take the lock learns that its previous owner died mid-task.
Why the old syscalls fail on Arm64
Today a thread registers its list with set_robust_list(). LWN's coverage of an earlier version of this work explained two limits. The call allows only one list per thread. It also assumes the list uses the machine's native pointer size, which is 64 bits on a modern Arm64 or x86-64 system.
On x86-64, the kernel has a second compatibility entry point that understands the 32-bit lists of older x86 programs. As LWN put it, "there's no such compat entry point for AArch64," the formal name for 64-bit Arm. So a 32-bit x86 program running under an emulator on Arm64 has nowhere to register its lists in the format it uses.
FEX-Emu is one such emulator. It translates x86 and x86-64 Linux programs so they run on Arm64 hardware, and it is the use case the v7 patches name. Tech AI Wire covered the project's own account of why x86 emulation on Arm is costly last week.
What changes in v7
The new syscalls let one thread hold several robust lists, and each list declares whether it uses 32-bit or 64-bit pointers. The main change in v7, the cover letter says, is that the interface "now uses CREATE/MODIFY semantics instead of SET." Almeida writes that this lets "both libc and app" use robust lists "without conflicts."
| Operation in v7 | What it does |
|---|---|
| Create (32 or 64) | Sets up a new robust list and returns its index |
| Modify (32 or 64) | Replaces the head of an existing list |
| Modify with a null head | Frees that list's slot |
| List limit | Reports how many lists a thread may hold |
The series has 10 patches. It is rebased on the current mainline kernel. Almeida writes that he expanded the robust list self-tests and ported the old syscall onto the new internals. "Tested on both x86 and arm64," the cover letter says.
The work waited on another fix. The cover letter says the work resumed now that "we mostly fixed the op_pending race condition," a flaw in how an unlock in progress is recorded. The kernel documentation calls the old unlock path "racy." The cover letter names no target kernel release.
What this means for developers
Most application code will never call these syscalls directly. C libraries and emulators will. If you maintain a libc, a threading runtime or a translation layer, read the v7 cover letter now. The create-and-modify design exists so a libc and an application can each own a list without clobbering each other, and that coordination is exactly what your code would rely on.
If you ship software that people run under FEX-Emu or a similar Arm64 translator, watch for this series landing in a released kernel. Until it does, 32-bit x86 code on Arm64 still has no way to register robust lists in the format it uses.
Treat the details as provisional. This is a proposal on a mailing list, not merged code, and the interface has already changed shape between v6 and v7. Do not build against it until a kernel release carries it.
This article was first published on Tech AI Wire.
Also available in
Deutsch · 日本語 · Français · Español · Português
Related on Tech AI Wire
Sources
- [PATCH v7 00/10] futex: Create {set,get}_robust_list2() syscalls - Linux kernel mailing list
- futex: Create set_robust_list2 - LWN.net
- Robust futexes - The Linux Kernel documentation
Top comments (0)