• T
    workqueue: don't butcher idle workers on an offline CPU · 3ce63377
    Tejun Heo 提交于
    Currently, during CPU offlining, after all pending work items are
    drained, the trustee butchers all workers.  Also, on CPU onlining
    failure, workqueue_cpu_callback() ensures that the first idle worker
    is destroyed.  Combined, these guarantee that an offline CPU doesn't
    have any worker for it once all the lingering work items are finished.
    
    This guarantee isn't really necessary and makes CPU on/offlining more
    expensive than needs to be, especially for platforms which use CPU
    hotplug for powersaving.
    
    This patch lets offline CPUs removes idle worker butchering from the
    trustee and let a CPU which failed onlining keep the created first
    worker.  The first worker is created if the CPU doesn't have any
    during CPU_DOWN_PREPARE and started right away.  If onlining succeeds,
    the rebind_workers() call in CPU_ONLINE will rebind it like any other
    workers.  If onlining fails, the worker is left alone till the next
    try.
    
    This makes CPU hotplugs cheaper by allowing global_cwqs to keep
    workers across them and simplifies code.
    
    Note that trustee doesn't re-arm idle timer when it's done and thus
    the disassociated global_cwq will keep all workers until it comes back
    online.  This will be improved by further patches.
    Signed-off-by: NTejun Heo <tj@kernel.org>
    Acked-by: N"Rafael J. Wysocki" <rjw@sisk.pl>
    3ce63377
workqueue.c 109.1 KB