Messages in this thread | | | Date | Sat, 23 Nov 2013 19:46:31 -0800 | Subject | Re: [PATCH 4/5] futex: Avoid taking hb lock if nothing to wakeup | From | Linus Torvalds <> |
| |
On Sat, Nov 23, 2013 at 5:16 AM, Thomas Gleixner <tglx@linutronix.de> wrote: > > Now the question is why we queue the waiter _AFTER_ reading the user > space value. The comment in the code is pretty non sensical: > > * On the other hand, we insert q and release the hash-bucket only > * after testing *uaddr. This guarantees that futex_wait() will NOT > * absorb a wakeup if *uaddr does not match the desired values > * while the syscall executes. > > There is no reason why we cannot queue _BEFORE_ reading the user space > value. We just have to dequeue in all the error handling cases, but > for the fast path it does not matter at all. > > CPU 0 CPU 1 > > val = *futex; > futex_wait(futex, val); > > spin_lock(&hb->lock); > > plist_add(hb, self); > smp_wmb(); > > uval = *futex; > *futex = newval; > futex_wake(); > > smp_rmb(); > if (plist_empty(hb)) > return; > ...
This would seem to be a nicer approach indeed, without needing the extra atomics.
Davidlohr, mind trying Thomas' approach?
Linus
| |