• Tejun Heo's avatar
    workqueue: relax lockdep annotation on flush_work() · e159489b
    Tejun Heo authored
    Currently, the lockdep annotation in flush_work() requires exclusive
    access on the workqueue the target work is queued on and triggers
    warning if a work is trying to flush another work on the same
    workqueue; however, this is no longer true as workqueues can now
    execute multiple works concurrently.
    
    This patch adds lock_map_acquire_read() and make process_one_work()
    hold read access to the workqueue while executing a work and
    start_flush_work() check for write access if concurrnecy level is one
    or the workqueue has a rescuer (as only one execution resource - the
    rescuer - is guaranteed to be available under memory pressure), and
    read access if higher.
    
    This better represents what's going on and removes spurious lockdep
    warnings which are triggered by fake dependency chain created through
    flush_work().
    
    * Peter pointed out that flushing another work from a WQ_MEM_RECLAIM
      wq breaks forward progress guarantee under memory pressure.
      Condition check accordingly updated.
    Signed-off-by: default avatarTejun Heo <tj@kernel.org>
    Reported-by: default avatar"Rafael J. Wysocki" <rjw@sisk.pl>
    Tested-by: default avatar"Rafael J. Wysocki" <rjw@sisk.pl>
    Cc: Peter Zijlstra <peterz@infradead.org>
    Cc: stable@kernel.org
    e159489b
workqueue.c 102 KB