Skip to content
  • Peter Zijlstra's avatar
    futex: Rework inconsistent rt_mutex/futex_q state · 73d786bd
    Peter Zijlstra authored
    
    
    There is a weird state in the futex_unlock_pi() path when it interleaves
    with a concurrent futex_lock_pi() at the point where it drops hb->lock.
    
    In this case, it can happen that the rt_mutex wait_list and the futex_q
    disagree on pending waiters, in particular rt_mutex will find no pending
    waiters where futex_q thinks there are. In this case the rt_mutex unlock
    code cannot assign an owner.
    
    The futex side fixup code has to cleanup the inconsistencies with quite a
    bunch of interesting corner cases.
    
    Simplify all this by changing wake_futex_pi() to return -EAGAIN when this
    situation occurs. This then gives the futex_lock_pi() code the opportunity
    to continue and the retried futex_unlock_pi() will now observe a coherent
    state.
    
    The only problem is that this breaks RT timeliness guarantees. That
    is, consider the following scenario:
    
      T1 and T2 are both pinned to CPU0. prio(T2) > prio(T1)
    
        CPU0
    
        T1
          lock_pi()
          queue_me()  <- Waiter is visible
    
        preemption
    
        T2
          unlock_pi()
    	loops with -EAGAIN forever
    
    Which is undesirable for PI primitives. Future patches will rectify
    this.
    
    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.850383690@infradead.org
    
    
    Signed-off-by: default avatarThomas Gleixner <tglx@linutronix.de>
    73d786bd