workqueue: Drain BH work items on hot-unplugged CPUs
authorTejun Heo <tj@kernel.org>
Tue, 27 Feb 2024 01:38:55 +0000 (15:38 -1000)
committerTejun Heo <tj@kernel.org>
Thu, 29 Feb 2024 21:51:24 +0000 (11:51 -1000)
commit1acd92d95fa24edca8f0292b21870025da93e24f
tree2b6d2805ff5700650f326e138a62316c532328ce
parent60b2ebf48526567b53e0188dbd1a4df8e646bcc1
workqueue: Drain BH work items on hot-unplugged CPUs

Boqun pointed out that workqueues aren't handling BH work items on offlined
CPUs. Unlike tasklet which transfers out the pending tasks from
CPUHP_SOFTIRQ_DEAD, BH workqueue would just leave them pending which is
problematic. Note that this behavior is specific to BH workqueues as the
non-BH per-CPU workers just become unbound when the CPU goes offline.

This patch fixes the issue by draining the pending BH work items from an
offlined CPU from CPUHP_SOFTIRQ_DEAD. Because work items carry more context,
it's not as easy to transfer the pending work items from one pool to
another. Instead, run BH work items which execute the offlined pools on an
online CPU.

Note that this assumes that no further BH work items will be queued on the
offlined CPUs. This assumption is shared with tasklet and should be fine for
conversions. However, this issue also exists for per-CPU workqueues which
will just keep executing work items queued after CPU offline on unbound
workers and workqueue should reject per-CPU and BH work items queued on
offline CPUs. This will be addressed separately later.

Signed-off-by: Tejun Heo <tj@kernel.org>
Reported-and-reviewed-by: Boqun Feng <boqun.feng@gmail.com>
Link: http://lkml.kernel.org/r/Zdvw0HdSXcU3JZ4g@boqun-archlinux
include/linux/workqueue.h
kernel/softirq.c
kernel/workqueue.c