Re: [PATCH V2 0/6][RFC] futex: FUTEX_LOCK with optional adaptivespinning

From: Darren Hart
Date: Wed Apr 07 2010 - 23:34:16 EST

john cooper wrote:
Avi Kivity wrote:
On 04/06/2010 07:14 PM, Thomas Gleixner wrote:
IMO the best solution is to spin in userspace while the lock holder is
running, fall into the kernel when it is scheduled out.
That's just not realistic as user space has no idea whether the lock
holder is running or not and when it's scheduled out without a syscall :)
The kernel could easily expose this information by writing into the
thread's TLS area.


- the kernel maintains a current_cpu field in a thread's tls
- lock() atomically writes a pointer to the current thread's current_cpu
when acquiring
- the kernel writes an invalid value to current_cpu when switching out
- a contended lock() retrieves the current_cpu pointer, and spins as
long as it is a valid cpu

There are certainly details to sort through in the packaging
of the mechanism but conceptually that should do the job.
So here the application has chosen a blocking lock as being
the optimal synchronization operation and we're detecting a
scenario where we can factor out the aggregate overhead of two
context switch operations.

I didn't intend to change the behavior of an existing blocking call with adaptive spinning if that is what you are getting at here. Initially there would be a new futex op, something like FUTEX_LOCK_ADAPTIVE or maybe just FUTEX_WAIT_ADAPTIVE. Applications can use this directly to implement adaptive spinlocks. Ideally glibc would make use of this via either the existing adaptive spinning NP API or via a new one. Before we even go there, we need to see if this can provide a real benefit.

There is also the case where the application requires a
polled lock with the rational being the assumed lock
hold/wait time is substantially less than the above context
switch overhead.

Polled lock == userspace spinlock?

But here we're otherwise completely
open to indiscriminate scheduling preemption even though
we may be holding a userland lock.

That's true with any userland lock.

The adaptive mutex above is an optimization beyond what
is normally expected for the associated model. The preemption
of a polled lock OTOH can easily inflict latency several orders
of magnitude beyond what is expected in that model. Two use
cases exist here which IMO aren't related except for the latter
unintentionally degenerating into the former.

Again, my intention is not to replace any existing functionality, so applications would have to explicitly request this behavior.

If I'm missing your point, please elaborate.


Darren Hart
IBM Linux Technology Center
Real-Time Linux Team
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at
Please read the FAQ at