IO_uring FUTEX Support In Linux 6.7 For A Nice Performance/Efficiency Boost

In addition to the continued FUTEX2 improvements that landed in Linux 6.7, another pull request merged last week for the new kernel bring FUTEX support to IO_uring .

The new code allows using futexes through IO_uring -- including the FUTEX vectored waits. This FUTEX IO_uring support can lead to some nice performance/efficiency wins. Jens Axboe explained in the pull request:
As far as I can recall, the first request for futex support with io_uring came from Andres Freund, working on postgres. His aio rework of postgres was one of the early adopters of io_uring, and futex support was a natural extension for that. This is relevant from both a usability point of view, as well as for effiency and performance. In Andres's words, for the former:

"Futex wait support in io_uring makes it a lot easier to avoid deadlocks in concurrent programs that have their own buffer pool: Obviously pages in the application buffer pool have to be locked during IO. If the initiator of IO A needs to wait for a held lock B, the holder of lock B might wait for the IO A to complete. The ability to wait for a lock and IO completions at the same time provides an efficient way to avoid such deadlocks."

and in terms of effiency, even without unlocking the full potential yet, Andres says:

"Futex wake support in io_uring is useful because it allows for more efficient directed wakeups. For some "locks" postgres has queues implemented in userspace, with wakeup logic that cannot easily be implemented with FUTEX_WAKE_BITSET on a single "futex word" (imagine waiting for journal flushes to have completed up to a certain point). Thus a "lock release" sometimes need to wake up many processes in a row. A quick-and-dirty conversion to doing these wakeups via io_uring lead to a 3% throughput increase, with 12% fewer context switches, albeit in a fairly extreme workload."

A 3% throughput boost and a 12% reduction in context switches is a nice little boost for the kernel. More details and the code via this pull that's been in the mainline tree the past few days.