]> git.itanic.dy.fi Git - linux-stable/blobdiff - kernel/workqueue.c
workqueue: don't skip lockdep work dependency in cancel_work_sync()
[linux-stable] / kernel / workqueue.c
index 1ea50f6be843698965a14a13a7498834fc510e36..fc6e4f252345233d566fdf6e8fc528cd99a6a5ac 100644 (file)
@@ -3066,10 +3066,8 @@ static bool __flush_work(struct work_struct *work, bool from_cancel)
        if (WARN_ON(!work->func))
                return false;
 
-       if (!from_cancel) {
-               lock_map_acquire(&work->lockdep_map);
-               lock_map_release(&work->lockdep_map);
-       }
+       lock_map_acquire(&work->lockdep_map);
+       lock_map_release(&work->lockdep_map);
 
        if (start_flush_work(work, &barr, from_cancel)) {
                wait_for_completion(&barr.done);
@@ -5001,7 +4999,10 @@ static void unbind_workers(int cpu)
 
                for_each_pool_worker(worker, pool) {
                        kthread_set_per_cpu(worker->task, -1);
-                       WARN_ON_ONCE(set_cpus_allowed_ptr(worker->task, wq_unbound_cpumask) < 0);
+                       if (cpumask_intersects(wq_unbound_cpumask, cpu_active_mask))
+                               WARN_ON_ONCE(set_cpus_allowed_ptr(worker->task, wq_unbound_cpumask) < 0);
+                       else
+                               WARN_ON_ONCE(set_cpus_allowed_ptr(worker->task, cpu_possible_mask) < 0);
                }
 
                mutex_unlock(&wq_pool_attach_mutex);