Skip to content

Commit bba0b6a

Browse files
committed
Merge tag 'cgroup-for-6.19-rc3-fixes' of git://git.kernel.org/pub/scm/linux/kernel/git/tj/cgroup
Pull cgroup fix from Tejun Heo: - Fix a spurious cpuset warning when disabling remote partition after CPU hotplug leaves subpartitions_cpus empty. Guard the warning and invalidate affected partitions. * tag 'cgroup-for-6.19-rc3-fixes' of git://git.kernel.org/pub/scm/linux/kernel/git/tj/cgroup: cpuset: fix warning when disabling remote partition
2 parents a69eddf + aa7d3a5 commit bba0b6a

1 file changed

Lines changed: 16 additions & 5 deletions

File tree

kernel/cgroup/cpuset.c

Lines changed: 16 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1668,7 +1668,14 @@ static int remote_partition_enable(struct cpuset *cs, int new_prs,
16681668
static void remote_partition_disable(struct cpuset *cs, struct tmpmasks *tmp)
16691669
{
16701670
WARN_ON_ONCE(!is_remote_partition(cs));
1671-
WARN_ON_ONCE(!cpumask_subset(cs->effective_xcpus, subpartitions_cpus));
1671+
/*
1672+
* When a CPU is offlined, top_cpuset may end up with no available CPUs,
1673+
* which should clear subpartitions_cpus. We should not emit a warning for this
1674+
* scenario: the hierarchy is updated from top to bottom, so subpartitions_cpus
1675+
* may already be cleared when disabling the partition.
1676+
*/
1677+
WARN_ON_ONCE(!cpumask_subset(cs->effective_xcpus, subpartitions_cpus) &&
1678+
!cpumask_empty(subpartitions_cpus));
16721679

16731680
spin_lock_irq(&callback_lock);
16741681
cs->remote_partition = false;
@@ -3976,8 +3983,9 @@ static void cpuset_hotplug_update_tasks(struct cpuset *cs, struct tmpmasks *tmp)
39763983
if (remote || (is_partition_valid(cs) && is_partition_valid(parent)))
39773984
compute_partition_effective_cpumask(cs, &new_cpus);
39783985

3979-
if (remote && cpumask_empty(&new_cpus) &&
3980-
partition_is_populated(cs, NULL)) {
3986+
if (remote && (cpumask_empty(subpartitions_cpus) ||
3987+
(cpumask_empty(&new_cpus) &&
3988+
partition_is_populated(cs, NULL)))) {
39813989
cs->prs_err = PERR_HOTPLUG;
39823990
remote_partition_disable(cs, tmp);
39833991
compute_effective_cpumask(&new_cpus, cs, parent);
@@ -3990,9 +3998,12 @@ static void cpuset_hotplug_update_tasks(struct cpuset *cs, struct tmpmasks *tmp)
39903998
* 1) empty effective cpus but not valid empty partition.
39913999
* 2) parent is invalid or doesn't grant any cpus to child
39924000
* partitions.
4001+
* 3) subpartitions_cpus is empty.
39934002
*/
3994-
if (is_local_partition(cs) && (!is_partition_valid(parent) ||
3995-
tasks_nocpu_error(parent, cs, &new_cpus)))
4003+
if (is_local_partition(cs) &&
4004+
(!is_partition_valid(parent) ||
4005+
tasks_nocpu_error(parent, cs, &new_cpus) ||
4006+
cpumask_empty(subpartitions_cpus)))
39964007
partcmd = partcmd_invalidate;
39974008
/*
39984009
* On the other hand, an invalid partition root may be transitioned

0 commit comments

Comments
 (0)