• P
    workqueue/lockdep: 'Fix' flush_work() annotation · a1d14934
    Peter Zijlstra 提交于
    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: NPeter Zijlstra (Intel) <peterz@infradead.org>
    Acked-by: NTejun 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: NIngo Molnar <mingo@kernel.org>
    a1d14934
workqueue.c 156.1 KB