aboutsummaryrefslogtreecommitdiffstats
path: root/kernel/cpuset.c
diff options
context:
space:
mode:
authorLi Zefan <lizefan@huawei.com>2014-07-09 04:48:32 -0400
committerTejun Heo <tj@kernel.org>2014-07-09 15:56:17 -0400
commitae1c802382f7af60aa54879fb4f5920a9df1ff48 (patch)
tree90a1cc5209552ab0046b423d64b58d6a8cdc5eab /kernel/cpuset.c
parent39bd0d15eca5af15ee1492964f317ecdb024a9d6 (diff)
cpuset: apply cs->effective_{cpus,mems}
Now we can use cs->effective_{cpus,mems} as effective masks. It's used whenever: - we update tasks' cpus_allowed/mems_allowed, - we want to retrieve tasks_cs(tsk)'s cpus_allowed/mems_allowed. They actually replace effective_{cpu,node}mask_cpuset(). effective_mask == configured_mask & parent effective_mask except when the reault is empty, in which case it inherits parent effective_mask. The result equals the mask computed from effective_{cpu,node}mask_cpuset(). This won't affect the original legacy hierarchy, because in this case we make sure the effective masks are always the same with user-configured masks. Signed-off-by: Li Zefan <lizefan@huawei.com> Signed-off-by: Tejun Heo <tj@kernel.org>
Diffstat (limited to 'kernel/cpuset.c')
-rw-r--r--kernel/cpuset.c83
1 files changed, 14 insertions, 69 deletions
diff --git a/kernel/cpuset.c b/kernel/cpuset.c
index e4c31e6b8716..820870a715f8 100644
--- a/kernel/cpuset.c
+++ b/kernel/cpuset.c
@@ -313,9 +313,9 @@ static struct file_system_type cpuset_fs_type = {
313 */ 313 */
314static void guarantee_online_cpus(struct cpuset *cs, struct cpumask *pmask) 314static void guarantee_online_cpus(struct cpuset *cs, struct cpumask *pmask)
315{ 315{
316 while (!cpumask_intersects(cs->cpus_allowed, cpu_online_mask)) 316 while (!cpumask_intersects(cs->effective_cpus, cpu_online_mask))
317 cs = parent_cs(cs); 317 cs = parent_cs(cs);
318 cpumask_and(pmask, cs->cpus_allowed, cpu_online_mask); 318 cpumask_and(pmask, cs->effective_cpus, cpu_online_mask);
319} 319}
320 320
321/* 321/*
@@ -331,9 +331,9 @@ static void guarantee_online_cpus(struct cpuset *cs, struct cpumask *pmask)
331 */ 331 */
332static void guarantee_online_mems(struct cpuset *cs, nodemask_t *pmask) 332static void guarantee_online_mems(struct cpuset *cs, nodemask_t *pmask)
333{ 333{
334 while (!nodes_intersects(cs->mems_allowed, node_states[N_MEMORY])) 334 while (!nodes_intersects(cs->effective_mems, node_states[N_MEMORY]))
335 cs = parent_cs(cs); 335 cs = parent_cs(cs);
336 nodes_and(*pmask, cs->mems_allowed, node_states[N_MEMORY]); 336 nodes_and(*pmask, cs->effective_mems, node_states[N_MEMORY]);
337} 337}
338 338
339/* 339/*
@@ -795,45 +795,6 @@ void rebuild_sched_domains(void)
795 mutex_unlock(&cpuset_mutex); 795 mutex_unlock(&cpuset_mutex);
796} 796}
797 797
798/*
799 * effective_cpumask_cpuset - return nearest ancestor with non-empty cpus
800 * @cs: the cpuset in interest
801 *
802 * A cpuset's effective cpumask is the cpumask of the nearest ancestor
803 * with non-empty cpus. We use effective cpumask whenever:
804 * - we update tasks' cpus_allowed. (they take on the ancestor's cpumask
805 * if the cpuset they reside in has no cpus)
806 * - we want to retrieve task_cs(tsk)'s cpus_allowed.
807 *
808 * Called with cpuset_mutex held. cpuset_cpus_allowed_fallback() is an
809 * exception. See comments there.
810 */
811static struct cpuset *effective_cpumask_cpuset(struct cpuset *cs)
812{
813 while (cpumask_empty(cs->cpus_allowed))
814 cs = parent_cs(cs);
815 return cs;
816}
817
818/*
819 * effective_nodemask_cpuset - return nearest ancestor with non-empty mems
820 * @cs: the cpuset in interest
821 *
822 * A cpuset's effective nodemask is the nodemask of the nearest ancestor
823 * with non-empty memss. We use effective nodemask whenever:
824 * - we update tasks' mems_allowed. (they take on the ancestor's nodemask
825 * if the cpuset they reside in has no mems)
826 * - we want to retrieve task_cs(tsk)'s mems_allowed.
827 *
828 * Called with cpuset_mutex held.
829 */
830static struct cpuset *effective_nodemask_cpuset(struct cpuset *cs)
831{
832 while (nodes_empty(cs->mems_allowed))
833 cs = parent_cs(cs);
834 return cs;
835}
836
837/** 798/**
838 * update_tasks_cpumask - Update the cpumasks of tasks in the cpuset. 799 * update_tasks_cpumask - Update the cpumasks of tasks in the cpuset.
839 * @cs: the cpuset in which each task's cpus_allowed mask needs to be changed 800 * @cs: the cpuset in which each task's cpus_allowed mask needs to be changed
@@ -844,13 +805,12 @@ static struct cpuset *effective_nodemask_cpuset(struct cpuset *cs)
844 */ 805 */
845static void update_tasks_cpumask(struct cpuset *cs) 806static void update_tasks_cpumask(struct cpuset *cs)
846{ 807{
847 struct cpuset *cpus_cs = effective_cpumask_cpuset(cs);
848 struct css_task_iter it; 808 struct css_task_iter it;
849 struct task_struct *task; 809 struct task_struct *task;
850 810
851 css_task_iter_start(&cs->css, &it); 811 css_task_iter_start(&cs->css, &it);
852 while ((task = css_task_iter_next(&it))) 812 while ((task = css_task_iter_next(&it)))
853 set_cpus_allowed_ptr(task, cpus_cs->cpus_allowed); 813 set_cpus_allowed_ptr(task, cs->effective_cpus);
854 css_task_iter_end(&it); 814 css_task_iter_end(&it);
855} 815}
856 816
@@ -988,15 +948,13 @@ static void cpuset_migrate_mm(struct mm_struct *mm, const nodemask_t *from,
988 const nodemask_t *to) 948 const nodemask_t *to)
989{ 949{
990 struct task_struct *tsk = current; 950 struct task_struct *tsk = current;
991 struct cpuset *mems_cs;
992 951
993 tsk->mems_allowed = *to; 952 tsk->mems_allowed = *to;
994 953
995 do_migrate_pages(mm, from, to, MPOL_MF_MOVE_ALL); 954 do_migrate_pages(mm, from, to, MPOL_MF_MOVE_ALL);
996 955
997 rcu_read_lock(); 956 rcu_read_lock();
998 mems_cs = effective_nodemask_cpuset(task_cs(tsk)); 957 guarantee_online_mems(task_cs(tsk), &tsk->mems_allowed);
999 guarantee_online_mems(mems_cs, &tsk->mems_allowed);
1000 rcu_read_unlock(); 958 rcu_read_unlock();
1001} 959}
1002 960
@@ -1065,13 +1023,12 @@ static void *cpuset_being_rebound;
1065static void update_tasks_nodemask(struct cpuset *cs) 1023static void update_tasks_nodemask(struct cpuset *cs)
1066{ 1024{
1067 static nodemask_t newmems; /* protected by cpuset_mutex */ 1025 static nodemask_t newmems; /* protected by cpuset_mutex */
1068 struct cpuset *mems_cs = effective_nodemask_cpuset(cs);
1069 struct css_task_iter it; 1026 struct css_task_iter it;
1070 struct task_struct *task; 1027 struct task_struct *task;
1071 1028
1072 cpuset_being_rebound = cs; /* causes mpol_dup() rebind */ 1029 cpuset_being_rebound = cs; /* causes mpol_dup() rebind */
1073 1030
1074 guarantee_online_mems(mems_cs, &newmems); 1031 guarantee_online_mems(cs, &newmems);
1075 1032
1076 /* 1033 /*
1077 * The mpol_rebind_mm() call takes mmap_sem, which we couldn't 1034 * The mpol_rebind_mm() call takes mmap_sem, which we couldn't
@@ -1497,8 +1454,6 @@ static void cpuset_attach(struct cgroup_subsys_state *css,
1497 struct task_struct *leader = cgroup_taskset_first(tset); 1454 struct task_struct *leader = cgroup_taskset_first(tset);
1498 struct cpuset *cs = css_cs(css); 1455 struct cpuset *cs = css_cs(css);
1499 struct cpuset *oldcs = cpuset_attach_old_cs; 1456 struct cpuset *oldcs = cpuset_attach_old_cs;
1500 struct cpuset *cpus_cs = effective_cpumask_cpuset(cs);
1501 struct cpuset *mems_cs = effective_nodemask_cpuset(cs);
1502 1457
1503 mutex_lock(&cpuset_mutex); 1458 mutex_lock(&cpuset_mutex);
1504 1459
@@ -1506,9 +1461,9 @@ static void cpuset_attach(struct cgroup_subsys_state *css,
1506 if (cs == &top_cpuset) 1461 if (cs == &top_cpuset)
1507 cpumask_copy(cpus_attach, cpu_possible_mask); 1462 cpumask_copy(cpus_attach, cpu_possible_mask);
1508 else 1463 else
1509 guarantee_online_cpus(cpus_cs, cpus_attach); 1464 guarantee_online_cpus(cs, cpus_attach);
1510 1465
1511 guarantee_online_mems(mems_cs, &cpuset_attach_nodemask_to); 1466 guarantee_online_mems(cs, &cpuset_attach_nodemask_to);
1512 1467
1513 cgroup_taskset_for_each(task, tset) { 1468 cgroup_taskset_for_each(task, tset) {
1514 /* 1469 /*
@@ -1525,11 +1480,9 @@ static void cpuset_attach(struct cgroup_subsys_state *css,
1525 * Change mm, possibly for multiple threads in a threadgroup. This is 1480 * Change mm, possibly for multiple threads in a threadgroup. This is
1526 * expensive and may sleep. 1481 * expensive and may sleep.
1527 */ 1482 */
1528 cpuset_attach_nodemask_to = cs->mems_allowed; 1483 cpuset_attach_nodemask_to = cs->effective_mems;
1529 mm = get_task_mm(leader); 1484 mm = get_task_mm(leader);
1530 if (mm) { 1485 if (mm) {
1531 struct cpuset *mems_oldcs = effective_nodemask_cpuset(oldcs);
1532
1533 mpol_rebind_mm(mm, &cpuset_attach_nodemask_to); 1486 mpol_rebind_mm(mm, &cpuset_attach_nodemask_to);
1534 1487
1535 /* 1488 /*
@@ -1540,7 +1493,7 @@ static void cpuset_attach(struct cgroup_subsys_state *css,
1540 * mm from. 1493 * mm from.
1541 */ 1494 */
1542 if (is_memory_migrate(cs)) { 1495 if (is_memory_migrate(cs)) {
1543 cpuset_migrate_mm(mm, &mems_oldcs->old_mems_allowed, 1496 cpuset_migrate_mm(mm, &oldcs->old_mems_allowed,
1544 &cpuset_attach_nodemask_to); 1497 &cpuset_attach_nodemask_to);
1545 } 1498 }
1546 mmput(mm); 1499 mmput(mm);
@@ -2331,23 +2284,17 @@ void __init cpuset_init_smp(void)
2331 2284
2332void cpuset_cpus_allowed(struct task_struct *tsk, struct cpumask *pmask) 2285void cpuset_cpus_allowed(struct task_struct *tsk, struct cpumask *pmask)
2333{ 2286{
2334 struct cpuset *cpus_cs;
2335
2336 mutex_lock(&callback_mutex); 2287 mutex_lock(&callback_mutex);
2337 rcu_read_lock(); 2288 rcu_read_lock();
2338 cpus_cs = effective_cpumask_cpuset(task_cs(tsk)); 2289 guarantee_online_cpus(task_cs(tsk), pmask);
2339 guarantee_online_cpus(cpus_cs, pmask);
2340 rcu_read_unlock(); 2290 rcu_read_unlock();
2341 mutex_unlock(&callback_mutex); 2291 mutex_unlock(&callback_mutex);
2342} 2292}
2343 2293
2344void cpuset_cpus_allowed_fallback(struct task_struct *tsk) 2294void cpuset_cpus_allowed_fallback(struct task_struct *tsk)
2345{ 2295{
2346 struct cpuset *cpus_cs;
2347
2348 rcu_read_lock(); 2296 rcu_read_lock();
2349 cpus_cs = effective_cpumask_cpuset(task_cs(tsk)); 2297 do_set_cpus_allowed(tsk, task_cs(tsk)->effective_cpus);
2350 do_set_cpus_allowed(tsk, cpus_cs->cpus_allowed);
2351 rcu_read_unlock(); 2298 rcu_read_unlock();
2352 2299
2353 /* 2300 /*
@@ -2386,13 +2333,11 @@ void cpuset_init_current_mems_allowed(void)
2386 2333
2387nodemask_t cpuset_mems_allowed(struct task_struct *tsk) 2334nodemask_t cpuset_mems_allowed(struct task_struct *tsk)
2388{ 2335{
2389 struct cpuset *mems_cs;
2390 nodemask_t mask; 2336 nodemask_t mask;
2391 2337
2392 mutex_lock(&callback_mutex); 2338 mutex_lock(&callback_mutex);
2393 rcu_read_lock(); 2339 rcu_read_lock();
2394 mems_cs = effective_nodemask_cpuset(task_cs(tsk)); 2340 guarantee_online_mems(task_cs(tsk), &mask);
2395 guarantee_online_mems(mems_cs, &mask);
2396 rcu_read_unlock(); 2341 rcu_read_unlock();
2397 mutex_unlock(&callback_mutex); 2342 mutex_unlock(&callback_mutex);
2398 2343