diff options
Diffstat (limited to 'kernel/cpuset.c')
-rw-r--r-- | kernel/cpuset.c | 20 |
1 files changed, 12 insertions, 8 deletions
diff --git a/kernel/cpuset.c b/kernel/cpuset.c index ba401fab459f..5d38bd74483c 100644 --- a/kernel/cpuset.c +++ b/kernel/cpuset.c | |||
@@ -920,9 +920,6 @@ static int update_cpumask(struct cpuset *cs, struct cpuset *trialcs, | |||
920 | * call to guarantee_online_mems(), as we know no one is changing | 920 | * call to guarantee_online_mems(), as we know no one is changing |
921 | * our task's cpuset. | 921 | * our task's cpuset. |
922 | * | 922 | * |
923 | * Hold callback_mutex around the two modifications of our tasks | ||
924 | * mems_allowed to synchronize with cpuset_mems_allowed(). | ||
925 | * | ||
926 | * While the mm_struct we are migrating is typically from some | 923 | * While the mm_struct we are migrating is typically from some |
927 | * other task, the task_struct mems_allowed that we are hacking | 924 | * other task, the task_struct mems_allowed that we are hacking |
928 | * is for our current task, which must allocate new pages for that | 925 | * is for our current task, which must allocate new pages for that |
@@ -1391,11 +1388,10 @@ static void cpuset_attach(struct cgroup_subsys *ss, struct cgroup *cont, | |||
1391 | 1388 | ||
1392 | if (cs == &top_cpuset) { | 1389 | if (cs == &top_cpuset) { |
1393 | cpumask_copy(cpus_attach, cpu_possible_mask); | 1390 | cpumask_copy(cpus_attach, cpu_possible_mask); |
1394 | to = node_possible_map; | ||
1395 | } else { | 1391 | } else { |
1396 | guarantee_online_cpus(cs, cpus_attach); | 1392 | guarantee_online_cpus(cs, cpus_attach); |
1397 | guarantee_online_mems(cs, &to); | ||
1398 | } | 1393 | } |
1394 | guarantee_online_mems(cs, &to); | ||
1399 | 1395 | ||
1400 | /* do per-task migration stuff possibly for each in the threadgroup */ | 1396 | /* do per-task migration stuff possibly for each in the threadgroup */ |
1401 | cpuset_attach_task(tsk, &to, cs); | 1397 | cpuset_attach_task(tsk, &to, cs); |
@@ -2090,15 +2086,23 @@ static int cpuset_track_online_cpus(struct notifier_block *unused_nb, | |||
2090 | static int cpuset_track_online_nodes(struct notifier_block *self, | 2086 | static int cpuset_track_online_nodes(struct notifier_block *self, |
2091 | unsigned long action, void *arg) | 2087 | unsigned long action, void *arg) |
2092 | { | 2088 | { |
2089 | nodemask_t oldmems; | ||
2090 | |||
2093 | cgroup_lock(); | 2091 | cgroup_lock(); |
2094 | switch (action) { | 2092 | switch (action) { |
2095 | case MEM_ONLINE: | 2093 | case MEM_ONLINE: |
2096 | case MEM_OFFLINE: | 2094 | oldmems = top_cpuset.mems_allowed; |
2097 | mutex_lock(&callback_mutex); | 2095 | mutex_lock(&callback_mutex); |
2098 | top_cpuset.mems_allowed = node_states[N_HIGH_MEMORY]; | 2096 | top_cpuset.mems_allowed = node_states[N_HIGH_MEMORY]; |
2099 | mutex_unlock(&callback_mutex); | 2097 | mutex_unlock(&callback_mutex); |
2100 | if (action == MEM_OFFLINE) | 2098 | update_tasks_nodemask(&top_cpuset, &oldmems, NULL); |
2101 | scan_for_empty_cpusets(&top_cpuset); | 2099 | break; |
2100 | case MEM_OFFLINE: | ||
2101 | /* | ||
2102 | * needn't update top_cpuset.mems_allowed explicitly because | ||
2103 | * scan_for_empty_cpusets() will update it. | ||
2104 | */ | ||
2105 | scan_for_empty_cpusets(&top_cpuset); | ||
2102 | break; | 2106 | break; |
2103 | default: | 2107 | default: |
2104 | break; | 2108 | break; |