• Peter Zijlstra's avatar
    futex: Pull rt_mutex_futex_unlock() out from under hb->lock · 16ffa12d
    Peter Zijlstra authored
    There's a number of 'interesting' problems, all caused by holding
    hb->lock while doing the rt_mutex_unlock() equivalient.
    
    Notably:
    
     - a PI inversion on hb->lock; and,
    
     - a SCHED_DEADLINE crash because of pointer instability.
    
    The previous changes:
    
     - changed the locking rules to cover {uval,pi_state} with wait_lock.
    
     - allow to do rt_mutex_futex_unlock() without dropping wait_lock; which in
       turn allows to rely on wait_lock atomicity completely.
    
     - simplified the waiter conundrum.
    
    It's now sufficient to hold rtmutex::wait_lock and a reference on the
    pi_state to protect the state consistency, so hb->lock can be dropped
    before calling rt_mutex_futex_unlock().
    Signed-off-by: default avatarPeter Zijlstra (Intel) <peterz@infradead.org>
    Cc: juri.lelli@arm.com
    Cc: bigeasy@linutronix.de
    Cc: xlpang@redhat.com
    Cc: rostedt@goodmis.org
    Cc: mathieu.desnoyers@efficios.com
    Cc: jdesfossez@efficios.com
    Cc: dvhart@infradead.org
    Cc: bristot@redhat.com
    Link: http://lkml.kernel.org/r/20170322104151.900002056@infradead.orgSigned-off-by: default avatarThomas Gleixner <tglx@linutronix.de>
    16ffa12d
futex.c 92.3 KB