• Peter Zijlstra's avatar
    sched: Fix CPU hotplug / tighten is_per_cpu_kthread() · 5ba2ffba
    Peter Zijlstra authored
    Prior to commit 1cf12e08 ("sched/hotplug: Consolidate task
    migration on CPU unplug") we'd leave any task on the dying CPU and
    break affinity and force them off at the very end.
    
    This scheme had to change in order to enable migrate_disable(). One
    cannot wait for migrate_disable() to complete while stuck in
    stop_machine(). Furthermore, since we need at the very least: idle,
    hotplug and stop threads at any point before stop_machine, we can't
    break affinity and/or push those away.
    
    Under the assumption that all per-cpu kthreads are sanely handled by
    CPU hotplug, the new code no long breaks affinity or migrates any of
    them (which then includes the critical ones above).
    
    However, there's an important difference between per-cpu kthreads and
    kthreads that happen to have a single CPU affinity which is lost. The
    latter class very much relies on the forced affinity breaking and
    migration semantics previously provided.
    
    Use the new kthread_is_per_cpu() infrastructure to tighten
    is_per_cpu_kthread() and fix the hot-unplug problems stemming from the
    change.
    
    Fixes: 1cf12e08 ("sched/hotplug: Consolidate task migration on CPU unplug")
    Signed-off-by: default avatarPeter Zijlstra (Intel) <peterz@infradead.org>
    Reviewed-by: default avatarValentin Schneider <valentin.schneider@arm.com>
    Tested-by: default avatarValentin Schneider <valentin.schneider@arm.com>
    Link: https://lkml.kernel.org/r/20210121103507.102416009@infradead.org
    5ba2ffba
core.c 233 KB