• Peter Zijlstra's avatar
    workqueue/lockdep: 'Fix' flush_work() annotation · a1d14934
    Peter Zijlstra authored
    The flush_work() annotation as introduced by commit:
    
      e159489b ("workqueue: relax lockdep annotation on flush_work()")
    
    hits on the lockdep problem with recursive read locks.
    
    The situation as described is:
    
    Work W1:                Work W2:        Task:
    
    ARR(Q)                  ARR(Q)		flush_workqueue(Q)
    A(W1)                   A(W2)             A(Q)
      flush_work(W2)			  R(Q)
        A(W2)
        R(W2)
        if (special)
          A(Q)
        else
          ARR(Q)
        R(Q)
    
    where: A - acquire, ARR - acquire-read-recursive, R - release.
    
    Where under 'special' conditions we want to trigger a lock recursion
    deadlock, but otherwise allow the flush_work(). The allowing is done
    by using recursive read locks (ARR), but lockdep is broken for
    recursive stuff.
    
    However, there appears to be no need to acquire the lock if we're not
    'special', so if we remove the 'else' clause things become much
    simpler and no longer need the recursion thing at all.
    Signed-off-by: default avatarPeter Zijlstra (Intel) <peterz@infradead.org>
    Acked-by: default avatarTejun Heo <tj@kernel.org>
    Cc: Linus Torvalds <torvalds@linux-foundation.org>
    Cc: Peter Zijlstra <peterz@infradead.org>
    Cc: Thomas Gleixner <tglx@linutronix.de>
    Cc: boqun.feng@gmail.com
    Cc: byungchul.park@lge.com
    Cc: david@fromorbit.com
    Cc: johannes@sipsolutions.net
    Cc: oleg@redhat.com
    Signed-off-by: default avatarIngo Molnar <mingo@kernel.org>
    a1d14934
workqueue.c 156 KB