• Waiman Long's avatar
    cgroup/cpuset: Don't filter offline CPUs in cpuset_cpus_allowed() for top cpuset tasks · 3fb906e7
    Waiman Long authored
    Since commit 8f9ea86f ("sched: Always preserve the user
    requested cpumask"), relax_compatible_cpus_allowed_ptr() is calling
    __sched_setaffinity() unconditionally. This helps to expose a bug in
    the current cpuset hotplug code where the cpumasks of the tasks in
    the top cpuset are not updated at all when some CPUs become online or
    offline. It is likely caused by the fact that some of the tasks in the
    top cpuset, like percpu kthreads, cannot have their cpu affinity changed.
    
    One way to reproduce this as suggested by Peter is:
     - boot machine
     - offline all CPUs except one
     - taskset -p ffffffff $$
     - online all CPUs
    
    Fix this by allowing cpuset_cpus_allowed() to return a wider mask that
    includes offline CPUs for those tasks that are in the top cpuset. For
    tasks not in the top cpuset, the old rule applies and only online CPUs
    will be returned in the mask since hotplug events will update their
    cpumasks accordingly.
    
    Fixes: 8f9ea86f ("sched: Always preserve the user requested cpumask")
    Reported-by: default avatarWill Deacon <will@kernel.org>
    Originally-from: Peter Zijlstra (Intel) <peterz@infradead.org>
    Tested-by: default avatarWill Deacon <will@kernel.org>
    Signed-off-by: default avatarWaiman Long <longman@redhat.com>
    Signed-off-by: default avatarTejun Heo <tj@kernel.org>
    3fb906e7
cpuset.c 113 KB