Skip to content
  • Johannes Berg's avatar
    workqueue: skip lockdep wq dependency in cancel_work_sync() · b7a3d36d
    Johannes Berg authored
    [ Upstream commit d6e89786
    
     ]
    
    In cancel_work_sync(), we can only have one of two cases, even
    with an ordered workqueue:
     * the work isn't running, just cancelled before it started
     * the work is running, but then nothing else can be on the
       workqueue before it
    
    Thus, we need to skip the lockdep workqueue dependency handling,
    otherwise we get false positive reports from lockdep saying that
    we have a potential deadlock when the workqueue also has other
    work items with locking, e.g.
    
      work1_function() { mutex_lock(&mutex); ... }
      work2_function() { /* nothing */ }
    
      other_function() {
        queue_work(ordered_wq, &work1);
        queue_work(ordered_wq, &work2);
        mutex_lock(&mutex);
        cancel_work_sync(&work2);
      }
    
    As described above, this isn't a problem, but lockdep will
    currently flag it as if cancel_work_sync() was flush_work(),
    which *is* a problem.
    
    Signed-off-by: default avatarJohannes Berg <johannes.berg@intel.com>
    Signed-off-by: default avatarTejun Heo <tj@kernel.org>
    Signed-off-by: default avatarSasha Levin <alexander.levin@microsoft.com>
    Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
    b7a3d36d