• Tejun Heo's avatar
    sched: Allow migrating kthreads into online but inactive CPUs · 955dbdf4
    Tejun Heo authored
    Per-cpu workqueues have been tripping CPU affinity sanity checks while
    a CPU is being offlined.  A per-cpu kworker ends up running on a CPU
    which isn't its target CPU while the CPU is online but inactive.
    
    While the scheduler allows kthreads to wake up on an online but
    inactive CPU, it doesn't allow a running kthread to be migrated to
    such a CPU, which leads to an odd situation where setting affinity on
    a sleeping and running kthread leads to different results.
    
    Each mem-reclaim workqueue has one rescuer which guarantees forward
    progress and the rescuer needs to bind itself to the CPU which needs
    help in making forward progress; however, due to the above issue,
    while set_cpus_allowed_ptr() succeeds, the rescuer doesn't end up on
    the correct CPU if the CPU is in the process of going offline,
    tripping the sanity check and executing the work item on the wrong
    CPU.
    
    This patch updates __migrate_task() so that kthreads can be migrated
    into an inactive but online CPU.
    Signed-off-by: default avatarTejun Heo <tj@kernel.org>
    Reported-by: default avatar"Paul E. McKenney" <paulmck@linux.vnet.ibm.com>
    Reported-by: default avatarSteven Rostedt <rostedt@goodmis.org>
    Signed-off-by: default avatarPaul E. McKenney <paulmck@linux.vnet.ibm.com>
    955dbdf4
core.c 165 KB