Commit 0b4217b3 authored by Li Zefan's avatar Li Zefan Committed by Linus Torvalds
Browse files

cpuset: fix possible races in cpu/memory hotplug



Change to cpuset->cpus_allowed and cpuset->mems_allowed should be protected
by callback_mutex, otherwise the reader may read wrong cpus/mems. This is
cpuset's lock rule.

Signed-off-by: default avatarLi Zefan <lizf@cn.fujitsu.com>
Cc: Paul Menage <menage@google.com>
Cc: Ingo Molnar <mingo@elte.hu>
Cc: Peter Zijlstra <a.p.zijlstra@chello.nl>
Signed-off-by: default avatarAndrew Morton <akpm@linux-foundation.org>
Signed-off-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
parent 83aae4c7
Loading
Loading
Loading
Loading
+6 −3
Original line number Diff line number Diff line
@@ -2070,7 +2070,9 @@ static int cpuset_track_online_cpus(struct notifier_block *unused_nb,
	}

	cgroup_lock();
	mutex_lock(&callback_mutex);
	cpumask_copy(top_cpuset.cpus_allowed, cpu_online_mask);
	mutex_unlock(&callback_mutex);
	scan_for_empty_cpusets(&top_cpuset);
	ndoms = generate_sched_domains(&doms, &attr);
	cgroup_unlock();
@@ -2093,10 +2095,11 @@ static int cpuset_track_online_nodes(struct notifier_block *self,
	cgroup_lock();
	switch (action) {
	case MEM_ONLINE:
		top_cpuset.mems_allowed = node_states[N_HIGH_MEMORY];
		break;
	case MEM_OFFLINE:
		mutex_lock(&callback_mutex);
		top_cpuset.mems_allowed = node_states[N_HIGH_MEMORY];
		mutex_unlock(&callback_mutex);
		if (action == MEM_OFFLINE)
			scan_for_empty_cpusets(&top_cpuset);
		break;
	default: