• Tejun Heo's avatar
    workqueue: Drain BH work items on hot-unplugged CPUs · 1acd92d9
    Tejun Heo authored
    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: default avatarTejun Heo <tj@kernel.org>
    Reported-and-reviewed-by: default avatarBoqun Feng <boqun.feng@gmail.com>
    Link: http://lkml.kernel.org/r/Zdvw0HdSXcU3JZ4g@boqun-archlinux
    1acd92d9
softirq.c 23.8 KB