Commit bba0b6a1 authored by Linus Torvalds's avatar Linus Torvalds
Browse files

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
parents a69eddfd aa7d3a56
Loading
Loading
Loading
Loading
+16 −5
Original line number Diff line number Diff line
@@ -1668,7 +1668,14 @@ static int remote_partition_enable(struct cpuset *cs, int new_prs,
static void remote_partition_disable(struct cpuset *cs, struct tmpmasks *tmp)
{
	WARN_ON_ONCE(!is_remote_partition(cs));
	WARN_ON_ONCE(!cpumask_subset(cs->effective_xcpus, subpartitions_cpus));
	/*
	 * When a CPU is offlined, top_cpuset may end up with no available CPUs,
	 * which should clear subpartitions_cpus. We should not emit a warning for this
	 * scenario: the hierarchy is updated from top to bottom, so subpartitions_cpus
	 * may already be cleared when disabling the partition.
	 */
	WARN_ON_ONCE(!cpumask_subset(cs->effective_xcpus, subpartitions_cpus) &&
		     !cpumask_empty(subpartitions_cpus));

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

	if (remote && cpumask_empty(&new_cpus) &&
	    partition_is_populated(cs, NULL)) {
	if (remote && (cpumask_empty(subpartitions_cpus) ||
			(cpumask_empty(&new_cpus) &&
			 partition_is_populated(cs, NULL)))) {
		cs->prs_err = PERR_HOTPLUG;
		remote_partition_disable(cs, tmp);
		compute_effective_cpumask(&new_cpus, cs, parent);
@@ -3990,9 +3998,12 @@ static void cpuset_hotplug_update_tasks(struct cpuset *cs, struct tmpmasks *tmp)
	 * 1) empty effective cpus but not valid empty partition.
	 * 2) parent is invalid or doesn't grant any cpus to child
	 *    partitions.
	 * 3) subpartitions_cpus is empty.
	 */
	if (is_local_partition(cs) && (!is_partition_valid(parent) ||
				tasks_nocpu_error(parent, cs, &new_cpus)))
	if (is_local_partition(cs) &&
	    (!is_partition_valid(parent) ||
	     tasks_nocpu_error(parent, cs, &new_cpus) ||
	     cpumask_empty(subpartitions_cpus)))
		partcmd = partcmd_invalidate;
	/*
	 * On the other hand, an invalid partition root may be transitioned