lkml.org 
[lkml]   [2013]   [Nov]   [23]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    /
    Date
    SubjectRe: [PATCH 4/5] futex: Avoid taking hb lock if nothing to wakeup
    From
    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


    \
     
     \ /
      Last update: 2013-11-24 05:01    [W:4.071 / U:0.068 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site