mirror of
https://github.com/torvalds/linux.git
synced 2024-11-24 05:02:12 +00:00
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: Li 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: Andrew Morton <akpm@linux-foundation.org> Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
This commit is contained in:
parent
83aae4c737
commit
0b4217b3fd
@ -2070,7 +2070,9 @@ static int cpuset_track_online_cpus(struct notifier_block *unused_nb,
|
|||||||
}
|
}
|
||||||
|
|
||||||
cgroup_lock();
|
cgroup_lock();
|
||||||
|
mutex_lock(&callback_mutex);
|
||||||
cpumask_copy(top_cpuset.cpus_allowed, cpu_online_mask);
|
cpumask_copy(top_cpuset.cpus_allowed, cpu_online_mask);
|
||||||
|
mutex_unlock(&callback_mutex);
|
||||||
scan_for_empty_cpusets(&top_cpuset);
|
scan_for_empty_cpusets(&top_cpuset);
|
||||||
ndoms = generate_sched_domains(&doms, &attr);
|
ndoms = generate_sched_domains(&doms, &attr);
|
||||||
cgroup_unlock();
|
cgroup_unlock();
|
||||||
@ -2093,11 +2095,12 @@ static int cpuset_track_online_nodes(struct notifier_block *self,
|
|||||||
cgroup_lock();
|
cgroup_lock();
|
||||||
switch (action) {
|
switch (action) {
|
||||||
case MEM_ONLINE:
|
case MEM_ONLINE:
|
||||||
top_cpuset.mems_allowed = node_states[N_HIGH_MEMORY];
|
|
||||||
break;
|
|
||||||
case MEM_OFFLINE:
|
case MEM_OFFLINE:
|
||||||
|
mutex_lock(&callback_mutex);
|
||||||
top_cpuset.mems_allowed = node_states[N_HIGH_MEMORY];
|
top_cpuset.mems_allowed = node_states[N_HIGH_MEMORY];
|
||||||
scan_for_empty_cpusets(&top_cpuset);
|
mutex_unlock(&callback_mutex);
|
||||||
|
if (action == MEM_OFFLINE)
|
||||||
|
scan_for_empty_cpusets(&top_cpuset);
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
break;
|
break;
|
||||||
|
Loading…
Reference in New Issue
Block a user