diff options
Diffstat (limited to 'kernel/cpuset.c')
-rw-r--r-- | kernel/cpuset.c | 90 |
1 files changed, 22 insertions, 68 deletions
diff --git a/kernel/cpuset.c b/kernel/cpuset.c index a09ac2b9a661..14f7070b4ba2 100644 --- a/kernel/cpuset.c +++ b/kernel/cpuset.c | |||
@@ -270,11 +270,11 @@ static struct file_system_type cpuset_fs_type = { | |||
270 | * are online. If none are online, walk up the cpuset hierarchy | 270 | * are online. If none are online, walk up the cpuset hierarchy |
271 | * until we find one that does have some online cpus. If we get | 271 | * until we find one that does have some online cpus. If we get |
272 | * all the way to the top and still haven't found any online cpus, | 272 | * all the way to the top and still haven't found any online cpus, |
273 | * return cpu_online_map. Or if passed a NULL cs from an exit'ing | 273 | * return cpu_online_mask. Or if passed a NULL cs from an exit'ing |
274 | * task, return cpu_online_map. | 274 | * task, return cpu_online_mask. |
275 | * | 275 | * |
276 | * One way or another, we guarantee to return some non-empty subset | 276 | * One way or another, we guarantee to return some non-empty subset |
277 | * of cpu_online_map. | 277 | * of cpu_online_mask. |
278 | * | 278 | * |
279 | * Call with callback_mutex held. | 279 | * Call with callback_mutex held. |
280 | */ | 280 | */ |
@@ -867,7 +867,7 @@ static int update_cpumask(struct cpuset *cs, struct cpuset *trialcs, | |||
867 | int retval; | 867 | int retval; |
868 | int is_load_balanced; | 868 | int is_load_balanced; |
869 | 869 | ||
870 | /* top_cpuset.cpus_allowed tracks cpu_online_map; it's read-only */ | 870 | /* top_cpuset.cpus_allowed tracks cpu_online_mask; it's read-only */ |
871 | if (cs == &top_cpuset) | 871 | if (cs == &top_cpuset) |
872 | return -EACCES; | 872 | return -EACCES; |
873 | 873 | ||
@@ -964,7 +964,6 @@ static void cpuset_change_task_nodemask(struct task_struct *tsk, | |||
964 | { | 964 | { |
965 | bool need_loop; | 965 | bool need_loop; |
966 | 966 | ||
967 | repeat: | ||
968 | /* | 967 | /* |
969 | * Allow tasks that have access to memory reserves because they have | 968 | * Allow tasks that have access to memory reserves because they have |
970 | * been OOM killed to get memory anywhere. | 969 | * been OOM killed to get memory anywhere. |
@@ -983,45 +982,19 @@ repeat: | |||
983 | */ | 982 | */ |
984 | need_loop = task_has_mempolicy(tsk) || | 983 | need_loop = task_has_mempolicy(tsk) || |
985 | !nodes_intersects(*newmems, tsk->mems_allowed); | 984 | !nodes_intersects(*newmems, tsk->mems_allowed); |
986 | nodes_or(tsk->mems_allowed, tsk->mems_allowed, *newmems); | ||
987 | mpol_rebind_task(tsk, newmems, MPOL_REBIND_STEP1); | ||
988 | |||
989 | /* | ||
990 | * ensure checking ->mems_allowed_change_disable after setting all new | ||
991 | * allowed nodes. | ||
992 | * | ||
993 | * the read-side task can see an nodemask with new allowed nodes and | ||
994 | * old allowed nodes. and if it allocates page when cpuset clears newly | ||
995 | * disallowed ones continuous, it can see the new allowed bits. | ||
996 | * | ||
997 | * And if setting all new allowed nodes is after the checking, setting | ||
998 | * all new allowed nodes and clearing newly disallowed ones will be done | ||
999 | * continuous, and the read-side task may find no node to alloc page. | ||
1000 | */ | ||
1001 | smp_mb(); | ||
1002 | 985 | ||
1003 | /* | 986 | if (need_loop) |
1004 | * Allocation of memory is very fast, we needn't sleep when waiting | 987 | write_seqcount_begin(&tsk->mems_allowed_seq); |
1005 | * for the read-side. | ||
1006 | */ | ||
1007 | while (need_loop && ACCESS_ONCE(tsk->mems_allowed_change_disable)) { | ||
1008 | task_unlock(tsk); | ||
1009 | if (!task_curr(tsk)) | ||
1010 | yield(); | ||
1011 | goto repeat; | ||
1012 | } | ||
1013 | 988 | ||
1014 | /* | 989 | nodes_or(tsk->mems_allowed, tsk->mems_allowed, *newmems); |
1015 | * ensure checking ->mems_allowed_change_disable before clearing all new | 990 | mpol_rebind_task(tsk, newmems, MPOL_REBIND_STEP1); |
1016 | * disallowed nodes. | ||
1017 | * | ||
1018 | * if clearing newly disallowed bits before the checking, the read-side | ||
1019 | * task may find no node to alloc page. | ||
1020 | */ | ||
1021 | smp_mb(); | ||
1022 | 991 | ||
1023 | mpol_rebind_task(tsk, newmems, MPOL_REBIND_STEP2); | 992 | mpol_rebind_task(tsk, newmems, MPOL_REBIND_STEP2); |
1024 | tsk->mems_allowed = *newmems; | 993 | tsk->mems_allowed = *newmems; |
994 | |||
995 | if (need_loop) | ||
996 | write_seqcount_end(&tsk->mems_allowed_seq); | ||
997 | |||
1025 | task_unlock(tsk); | 998 | task_unlock(tsk); |
1026 | } | 999 | } |
1027 | 1000 | ||
@@ -1399,8 +1372,7 @@ static nodemask_t cpuset_attach_nodemask_from; | |||
1399 | static nodemask_t cpuset_attach_nodemask_to; | 1372 | static nodemask_t cpuset_attach_nodemask_to; |
1400 | 1373 | ||
1401 | /* Called by cgroups to determine if a cpuset is usable; cgroup_mutex held */ | 1374 | /* Called by cgroups to determine if a cpuset is usable; cgroup_mutex held */ |
1402 | static int cpuset_can_attach(struct cgroup_subsys *ss, struct cgroup *cgrp, | 1375 | static int cpuset_can_attach(struct cgroup *cgrp, struct cgroup_taskset *tset) |
1403 | struct cgroup_taskset *tset) | ||
1404 | { | 1376 | { |
1405 | struct cpuset *cs = cgroup_cs(cgrp); | 1377 | struct cpuset *cs = cgroup_cs(cgrp); |
1406 | struct task_struct *task; | 1378 | struct task_struct *task; |
@@ -1436,8 +1408,7 @@ static int cpuset_can_attach(struct cgroup_subsys *ss, struct cgroup *cgrp, | |||
1436 | return 0; | 1408 | return 0; |
1437 | } | 1409 | } |
1438 | 1410 | ||
1439 | static void cpuset_attach(struct cgroup_subsys *ss, struct cgroup *cgrp, | 1411 | static void cpuset_attach(struct cgroup *cgrp, struct cgroup_taskset *tset) |
1440 | struct cgroup_taskset *tset) | ||
1441 | { | 1412 | { |
1442 | struct mm_struct *mm; | 1413 | struct mm_struct *mm; |
1443 | struct task_struct *task; | 1414 | struct task_struct *task; |
@@ -1833,8 +1804,7 @@ static int cpuset_populate(struct cgroup_subsys *ss, struct cgroup *cont) | |||
1833 | * (and likewise for mems) to the new cgroup. Called with cgroup_mutex | 1804 | * (and likewise for mems) to the new cgroup. Called with cgroup_mutex |
1834 | * held. | 1805 | * held. |
1835 | */ | 1806 | */ |
1836 | static void cpuset_post_clone(struct cgroup_subsys *ss, | 1807 | static void cpuset_post_clone(struct cgroup *cgroup) |
1837 | struct cgroup *cgroup) | ||
1838 | { | 1808 | { |
1839 | struct cgroup *parent, *child; | 1809 | struct cgroup *parent, *child; |
1840 | struct cpuset *cs, *parent_cs; | 1810 | struct cpuset *cs, *parent_cs; |
@@ -1857,13 +1827,10 @@ static void cpuset_post_clone(struct cgroup_subsys *ss, | |||
1857 | 1827 | ||
1858 | /* | 1828 | /* |
1859 | * cpuset_create - create a cpuset | 1829 | * cpuset_create - create a cpuset |
1860 | * ss: cpuset cgroup subsystem | ||
1861 | * cont: control group that the new cpuset will be part of | 1830 | * cont: control group that the new cpuset will be part of |
1862 | */ | 1831 | */ |
1863 | 1832 | ||
1864 | static struct cgroup_subsys_state *cpuset_create( | 1833 | static struct cgroup_subsys_state *cpuset_create(struct cgroup *cont) |
1865 | struct cgroup_subsys *ss, | ||
1866 | struct cgroup *cont) | ||
1867 | { | 1834 | { |
1868 | struct cpuset *cs; | 1835 | struct cpuset *cs; |
1869 | struct cpuset *parent; | 1836 | struct cpuset *parent; |
@@ -1902,7 +1869,7 @@ static struct cgroup_subsys_state *cpuset_create( | |||
1902 | * will call async_rebuild_sched_domains(). | 1869 | * will call async_rebuild_sched_domains(). |
1903 | */ | 1870 | */ |
1904 | 1871 | ||
1905 | static void cpuset_destroy(struct cgroup_subsys *ss, struct cgroup *cont) | 1872 | static void cpuset_destroy(struct cgroup *cont) |
1906 | { | 1873 | { |
1907 | struct cpuset *cs = cgroup_cs(cont); | 1874 | struct cpuset *cs = cgroup_cs(cont); |
1908 | 1875 | ||
@@ -2182,7 +2149,7 @@ void __init cpuset_init_smp(void) | |||
2182 | * | 2149 | * |
2183 | * Description: Returns the cpumask_var_t cpus_allowed of the cpuset | 2150 | * Description: Returns the cpumask_var_t cpus_allowed of the cpuset |
2184 | * attached to the specified @tsk. Guaranteed to return some non-empty | 2151 | * attached to the specified @tsk. Guaranteed to return some non-empty |
2185 | * subset of cpu_online_map, even if this means going outside the | 2152 | * subset of cpu_online_mask, even if this means going outside the |
2186 | * tasks cpuset. | 2153 | * tasks cpuset. |
2187 | **/ | 2154 | **/ |
2188 | 2155 | ||
@@ -2195,10 +2162,9 @@ void cpuset_cpus_allowed(struct task_struct *tsk, struct cpumask *pmask) | |||
2195 | mutex_unlock(&callback_mutex); | 2162 | mutex_unlock(&callback_mutex); |
2196 | } | 2163 | } |
2197 | 2164 | ||
2198 | int cpuset_cpus_allowed_fallback(struct task_struct *tsk) | 2165 | void cpuset_cpus_allowed_fallback(struct task_struct *tsk) |
2199 | { | 2166 | { |
2200 | const struct cpuset *cs; | 2167 | const struct cpuset *cs; |
2201 | int cpu; | ||
2202 | 2168 | ||
2203 | rcu_read_lock(); | 2169 | rcu_read_lock(); |
2204 | cs = task_cs(tsk); | 2170 | cs = task_cs(tsk); |
@@ -2219,22 +2185,10 @@ int cpuset_cpus_allowed_fallback(struct task_struct *tsk) | |||
2219 | * changes in tsk_cs()->cpus_allowed. Otherwise we can temporary | 2185 | * changes in tsk_cs()->cpus_allowed. Otherwise we can temporary |
2220 | * set any mask even if it is not right from task_cs() pov, | 2186 | * set any mask even if it is not right from task_cs() pov, |
2221 | * the pending set_cpus_allowed_ptr() will fix things. | 2187 | * the pending set_cpus_allowed_ptr() will fix things. |
2188 | * | ||
2189 | * select_fallback_rq() will fix things ups and set cpu_possible_mask | ||
2190 | * if required. | ||
2222 | */ | 2191 | */ |
2223 | |||
2224 | cpu = cpumask_any_and(&tsk->cpus_allowed, cpu_active_mask); | ||
2225 | if (cpu >= nr_cpu_ids) { | ||
2226 | /* | ||
2227 | * Either tsk->cpus_allowed is wrong (see above) or it | ||
2228 | * is actually empty. The latter case is only possible | ||
2229 | * if we are racing with remove_tasks_in_empty_cpuset(). | ||
2230 | * Like above we can temporary set any mask and rely on | ||
2231 | * set_cpus_allowed_ptr() as synchronization point. | ||
2232 | */ | ||
2233 | do_set_cpus_allowed(tsk, cpu_possible_mask); | ||
2234 | cpu = cpumask_any(cpu_active_mask); | ||
2235 | } | ||
2236 | |||
2237 | return cpu; | ||
2238 | } | 2192 | } |
2239 | 2193 | ||
2240 | void cpuset_init_current_mems_allowed(void) | 2194 | void cpuset_init_current_mems_allowed(void) |