Commit 477a3c33 authored by Tejun Heo's avatar Tejun Heo
Browse files

workqueue: fix GCWQ_DISASSOCIATED initialization



init_workqueues() incorrectly marks workqueues for all possible CPUs
associated.  Combined with mayday_mask initialization bug, this can
make rescuers keep trying to bind to an offline gcwq indefinitely.
Fix init_workqueues() such that only online CPUs have their gcwqs have
GCWQ_DISASSOCIATED cleared.

Signed-off-by: default avatarTejun Heo <tj@kernel.org>
Reported-by: default avatarCAI Qian <caiqian@redhat.com>
parent 7c38875a
Loading
Loading
Loading
Loading
+3 −2
Original line number Diff line number Diff line
@@ -3558,7 +3558,6 @@ static int __init init_workqueues(void)
		spin_lock_init(&gcwq->lock);
		INIT_LIST_HEAD(&gcwq->worklist);
		gcwq->cpu = cpu;
		if (cpu == WORK_CPU_UNBOUND)
		gcwq->flags |= GCWQ_DISASSOCIATED;

		INIT_LIST_HEAD(&gcwq->idle_list);
@@ -3583,6 +3582,8 @@ static int __init init_workqueues(void)
		struct global_cwq *gcwq = get_gcwq(cpu);
		struct worker *worker;

		if (cpu != WORK_CPU_UNBOUND)
			gcwq->flags &= ~GCWQ_DISASSOCIATED;
		worker = create_worker(gcwq, true);
		BUG_ON(!worker);
		spin_lock_irq(&gcwq->lock);