• Peter Zijlstra's avatar
    locking/mutex: Add lock handoff to avoid starvation · 9d659ae1
    Peter Zijlstra authored
    Implement lock handoff to avoid lock starvation.
    
    Lock starvation is possible because mutex_lock() allows lock stealing,
    where a running (or optimistic spinning) task beats the woken waiter
    to the acquire.
    
    Lock stealing is an important performance optimization because waiting
    for a waiter to wake up and get runtime can take a significant time,
    during which everyboy would stall on the lock.
    
    The down-side is of course that it allows for starvation.
    
    This patch has the waiter requesting a handoff if it fails to acquire
    the lock upon waking. This re-introduces some of the wait time,
    because once we do a handoff we have to wait for the waiter to wake up
    again.
    
    A future patch will add a round of optimistic spinning to attempt to
    alleviate this penalty, but if that turns out to not be enough, we can
    add a counter and only request handoff after multiple failed wakeups.
    
    There are a few tricky implementation details:
    
     - accepting a handoff must only be done in the wait-loop. Since the
       handoff condition is owner == current, it can easily cause
       recursive locking trouble.
    
     - accepting the handoff must be careful to provide the ACQUIRE
       semantics.
    
     - having the HANDOFF bit set on unlock requires care, we must not
       clear the owner.
    
     - we must be careful to not leave HANDOFF set after we've acquired
       the lock. The tricky scenario is setting the HANDOFF bit on an
       unlocked mutex.
    Tested-by: default avatarJason Low <jason.low2@hpe.com>
    Signed-off-by: default avatarPeter Zijlstra (Intel) <peterz@infradead.org>
    Reviewed-by: default avatarWaiman Long <Waiman.Long@hpe.com>
    Cc: Andrew Morton <akpm@linux-foundation.org>
    Cc: Linus Torvalds <torvalds@linux-foundation.org>
    Cc: Paul E. McKenney <paulmck@linux.vnet.ibm.com>
    Cc: Peter Zijlstra <peterz@infradead.org>
    Cc: Thomas Gleixner <tglx@linutronix.de>
    Cc: linux-kernel@vger.kernel.org
    Signed-off-by: default avatarIngo Molnar <mingo@kernel.org>
    9d659ae1
mutex.c 25.4 KB