Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit aa44002e authored by Zhang Qiao's avatar Zhang Qiao Committed by Greg Kroah-Hartman
Browse files

cpuset: Fix unsafe lock order between cpuset lock and cpuslock



The backport commit 4eec5fe1 ("cgroup/cpuset: Fix a race
between cpuset_attach() and cpu hotplug") looks suspicious since
it comes before commit d74b27d63a8b ("cgroup/cpuset: Change
cpuset_rwsem and hotplug lock order") v5.4-rc1~176^2~30 when
the locking order was: cpuset lock, cpus lock.

Fix it with the correct locking order and reduce the cpus locking
range because only set_cpus_allowed_ptr() needs the protection of
cpus lock.

Fixes: 4eec5fe1 ("cgroup/cpuset: Fix a race between cpuset_attach() and cpu hotplug")
Reported-by: default avatarMichal Koutný <mkoutny@suse.com>
Signed-off-by: default avatarZhang Qiao <zhangqiao22@huawei.com>
Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
parent 1ba1ec19
Loading
Loading
Loading
Loading
+6 −2
Original line number Diff line number Diff line
@@ -1528,9 +1528,13 @@ static void cpuset_attach(struct cgroup_taskset *tset)
	cgroup_taskset_first(tset, &css);
	cs = css_cs(css);

	cpus_read_lock();
	mutex_lock(&cpuset_mutex);

	/*
	 * It should hold cpus lock because a cpu offline event can
	 * cause set_cpus_allowed_ptr() failed.
	 */
	get_online_cpus();
	/* prepare for attach */
	if (cs == &top_cpuset)
		cpumask_copy(cpus_attach, cpu_possible_mask);
@@ -1549,6 +1553,7 @@ static void cpuset_attach(struct cgroup_taskset *tset)
		cpuset_change_task_nodemask(task, &cpuset_attach_nodemask_to);
		cpuset_update_task_spread_flag(cs, task);
	}
       put_online_cpus();

	/*
	 * Change mm for all threadgroup leaders. This is expensive and may
@@ -1584,7 +1589,6 @@ static void cpuset_attach(struct cgroup_taskset *tset)
		wake_up(&cpuset_attach_wq);

	mutex_unlock(&cpuset_mutex);
	cpus_read_unlock();
}

/* The various types of files and directories in a cpuset file system */