diff options
author | Waiman Long <longman@redhat.com> | 2021-07-20 10:18:27 -0400 |
---|---|---|
committer | Tejun Heo <tj@kernel.org> | 2021-07-26 12:59:05 -1000 |
commit | 15d428e6fe77fffc3f4fff923336036f5496ef17 (patch) | |
tree | feee2b28339093b7f3a76d762080d22d7c243716 /kernel/cgroup | |
parent | 0f3adb8a1e5f36e792598c1d77a2cfac9c90a4f9 (diff) | |
download | lwn-15d428e6fe77fffc3f4fff923336036f5496ef17.tar.gz lwn-15d428e6fe77fffc3f4fff923336036f5496ef17.zip |
cgroup/cpuset: Fix a partition bug with hotplug
In cpuset_hotplug_workfn(), the detection of whether the cpu list
has been changed is done by comparing the effective cpus of the top
cpuset with the cpu_active_mask. However, in the rare case that just
all the CPUs in the subparts_cpus are offlined, the detection fails
and the partition states are not updated correctly. Fix it by forcing
the cpus_updated flag to true in this particular case.
Fixes: 4b842da276a8 ("cpuset: Make CPU hotplug work with partition")
Signed-off-by: Waiman Long <longman@redhat.com>
Signed-off-by: Tejun Heo <tj@kernel.org>
Diffstat (limited to 'kernel/cgroup')
-rw-r--r-- | kernel/cgroup/cpuset.c | 7 |
1 files changed, 7 insertions, 0 deletions
diff --git a/kernel/cgroup/cpuset.c b/kernel/cgroup/cpuset.c index f5fef5516d99..28a784bf64b1 100644 --- a/kernel/cgroup/cpuset.c +++ b/kernel/cgroup/cpuset.c @@ -3166,6 +3166,13 @@ static void cpuset_hotplug_workfn(struct work_struct *work) cpus_updated = !cpumask_equal(top_cpuset.effective_cpus, &new_cpus); mems_updated = !nodes_equal(top_cpuset.effective_mems, new_mems); + /* + * In the rare case that hotplug removes all the cpus in subparts_cpus, + * we assumed that cpus are updated. + */ + if (!cpus_updated && top_cpuset.nr_subparts_cpus) + cpus_updated = true; + /* synchronize cpus_allowed to cpu_active_mask */ if (cpus_updated) { spin_lock_irq(&callback_lock); |