diff options
author | Tejun Heo <tj@kernel.org> | 2013-08-08 20:11:26 -0400 |
---|---|---|
committer | Tejun Heo <tj@kernel.org> | 2013-08-08 20:11:26 -0400 |
commit | e535837b1dae17b5a2d76ea1bc22ac1a79354624 (patch) | |
tree | 38a78ca5676a0987f00b737b36fe18e30947cf62 /kernel/cpuset.c | |
parent | c59cd3d840b1b0a8f996cbbd9132128dcaabbeb9 (diff) |
cgroup: remove struct cgroup_scanner
cgroup_scan_tasks() takes a pointer to struct cgroup_scanner as its
sole argument and the only function of that struct is packing the
arguments of the function call which are consisted of five fields.
It's not too unusual to pack parameters into a struct when the number
of arguments gets excessive or the whole set needs to be passed around
a lot, but neither holds here making it just weird.
Drop struct cgroup_scanner and pass the params directly to
cgroup_scan_tasks(). Note that struct cpuset_change_nodemask_arg was
added to cpuset.c to pass both ->cs and ->newmems pointer to
cpuset_change_nodemask() using single data pointer.
This doesn't make any functional differences.
Signed-off-by: Tejun Heo <tj@kernel.org>
Acked-by: Li Zefan <lizefan@huawei.com>
Diffstat (limited to 'kernel/cpuset.c')
-rw-r--r-- | kernel/cpuset.c | 63 |
1 files changed, 26 insertions, 37 deletions
diff --git a/kernel/cpuset.c b/kernel/cpuset.c index be4f5036ea5e..6fe23f2ac742 100644 --- a/kernel/cpuset.c +++ b/kernel/cpuset.c | |||
@@ -830,7 +830,7 @@ static struct cpuset *effective_nodemask_cpuset(struct cpuset *cs) | |||
830 | /** | 830 | /** |
831 | * cpuset_change_cpumask - make a task's cpus_allowed the same as its cpuset's | 831 | * cpuset_change_cpumask - make a task's cpus_allowed the same as its cpuset's |
832 | * @tsk: task to test | 832 | * @tsk: task to test |
833 | * @scan: struct cgroup_scanner containing the cgroup of the task | 833 | * @data: cpuset to @tsk belongs to |
834 | * | 834 | * |
835 | * Called by cgroup_scan_tasks() for each task in a cgroup whose | 835 | * Called by cgroup_scan_tasks() for each task in a cgroup whose |
836 | * cpus_allowed mask needs to be changed. | 836 | * cpus_allowed mask needs to be changed. |
@@ -838,12 +838,11 @@ static struct cpuset *effective_nodemask_cpuset(struct cpuset *cs) | |||
838 | * We don't need to re-check for the cgroup/cpuset membership, since we're | 838 | * We don't need to re-check for the cgroup/cpuset membership, since we're |
839 | * holding cpuset_mutex at this point. | 839 | * holding cpuset_mutex at this point. |
840 | */ | 840 | */ |
841 | static void cpuset_change_cpumask(struct task_struct *tsk, | 841 | static void cpuset_change_cpumask(struct task_struct *tsk, void *data) |
842 | struct cgroup_scanner *scan) | ||
843 | { | 842 | { |
844 | struct cpuset *cpus_cs; | 843 | struct cpuset *cs = data; |
844 | struct cpuset *cpus_cs = effective_cpumask_cpuset(cs); | ||
845 | 845 | ||
846 | cpus_cs = effective_cpumask_cpuset(cgroup_cs(scan->cgrp)); | ||
847 | set_cpus_allowed_ptr(tsk, cpus_cs->cpus_allowed); | 846 | set_cpus_allowed_ptr(tsk, cpus_cs->cpus_allowed); |
848 | } | 847 | } |
849 | 848 | ||
@@ -862,13 +861,8 @@ static void cpuset_change_cpumask(struct task_struct *tsk, | |||
862 | */ | 861 | */ |
863 | static void update_tasks_cpumask(struct cpuset *cs, struct ptr_heap *heap) | 862 | static void update_tasks_cpumask(struct cpuset *cs, struct ptr_heap *heap) |
864 | { | 863 | { |
865 | struct cgroup_scanner scan; | 864 | cgroup_scan_tasks(cs->css.cgroup, NULL, cpuset_change_cpumask, cs, |
866 | 865 | heap); | |
867 | scan.cgrp = cs->css.cgroup; | ||
868 | scan.test_task = NULL; | ||
869 | scan.process_task = cpuset_change_cpumask; | ||
870 | scan.heap = heap; | ||
871 | cgroup_scan_tasks(&scan); | ||
872 | } | 866 | } |
873 | 867 | ||
874 | /* | 868 | /* |
@@ -1052,20 +1046,24 @@ static void cpuset_change_task_nodemask(struct task_struct *tsk, | |||
1052 | task_unlock(tsk); | 1046 | task_unlock(tsk); |
1053 | } | 1047 | } |
1054 | 1048 | ||
1049 | struct cpuset_change_nodemask_arg { | ||
1050 | struct cpuset *cs; | ||
1051 | nodemask_t *newmems; | ||
1052 | }; | ||
1053 | |||
1055 | /* | 1054 | /* |
1056 | * Update task's mems_allowed and rebind its mempolicy and vmas' mempolicy | 1055 | * Update task's mems_allowed and rebind its mempolicy and vmas' mempolicy |
1057 | * of it to cpuset's new mems_allowed, and migrate pages to new nodes if | 1056 | * of it to cpuset's new mems_allowed, and migrate pages to new nodes if |
1058 | * memory_migrate flag is set. Called with cpuset_mutex held. | 1057 | * memory_migrate flag is set. Called with cpuset_mutex held. |
1059 | */ | 1058 | */ |
1060 | static void cpuset_change_nodemask(struct task_struct *p, | 1059 | static void cpuset_change_nodemask(struct task_struct *p, void *data) |
1061 | struct cgroup_scanner *scan) | ||
1062 | { | 1060 | { |
1063 | struct cpuset *cs = cgroup_cs(scan->cgrp); | 1061 | struct cpuset_change_nodemask_arg *arg = data; |
1062 | struct cpuset *cs = arg->cs; | ||
1064 | struct mm_struct *mm; | 1063 | struct mm_struct *mm; |
1065 | int migrate; | 1064 | int migrate; |
1066 | nodemask_t *newmems = scan->data; | ||
1067 | 1065 | ||
1068 | cpuset_change_task_nodemask(p, newmems); | 1066 | cpuset_change_task_nodemask(p, arg->newmems); |
1069 | 1067 | ||
1070 | mm = get_task_mm(p); | 1068 | mm = get_task_mm(p); |
1071 | if (!mm) | 1069 | if (!mm) |
@@ -1075,7 +1073,7 @@ static void cpuset_change_nodemask(struct task_struct *p, | |||
1075 | 1073 | ||
1076 | mpol_rebind_mm(mm, &cs->mems_allowed); | 1074 | mpol_rebind_mm(mm, &cs->mems_allowed); |
1077 | if (migrate) | 1075 | if (migrate) |
1078 | cpuset_migrate_mm(mm, &cs->old_mems_allowed, newmems); | 1076 | cpuset_migrate_mm(mm, &cs->old_mems_allowed, arg->newmems); |
1079 | mmput(mm); | 1077 | mmput(mm); |
1080 | } | 1078 | } |
1081 | 1079 | ||
@@ -1093,19 +1091,14 @@ static void *cpuset_being_rebound; | |||
1093 | static void update_tasks_nodemask(struct cpuset *cs, struct ptr_heap *heap) | 1091 | static void update_tasks_nodemask(struct cpuset *cs, struct ptr_heap *heap) |
1094 | { | 1092 | { |
1095 | static nodemask_t newmems; /* protected by cpuset_mutex */ | 1093 | static nodemask_t newmems; /* protected by cpuset_mutex */ |
1096 | struct cgroup_scanner scan; | ||
1097 | struct cpuset *mems_cs = effective_nodemask_cpuset(cs); | 1094 | struct cpuset *mems_cs = effective_nodemask_cpuset(cs); |
1095 | struct cpuset_change_nodemask_arg arg = { .cs = cs, | ||
1096 | .newmems = &newmems }; | ||
1098 | 1097 | ||
1099 | cpuset_being_rebound = cs; /* causes mpol_dup() rebind */ | 1098 | cpuset_being_rebound = cs; /* causes mpol_dup() rebind */ |
1100 | 1099 | ||
1101 | guarantee_online_mems(mems_cs, &newmems); | 1100 | guarantee_online_mems(mems_cs, &newmems); |
1102 | 1101 | ||
1103 | scan.cgrp = cs->css.cgroup; | ||
1104 | scan.test_task = NULL; | ||
1105 | scan.process_task = cpuset_change_nodemask; | ||
1106 | scan.heap = heap; | ||
1107 | scan.data = &newmems; | ||
1108 | |||
1109 | /* | 1102 | /* |
1110 | * The mpol_rebind_mm() call takes mmap_sem, which we couldn't | 1103 | * The mpol_rebind_mm() call takes mmap_sem, which we couldn't |
1111 | * take while holding tasklist_lock. Forks can happen - the | 1104 | * take while holding tasklist_lock. Forks can happen - the |
@@ -1116,7 +1109,8 @@ static void update_tasks_nodemask(struct cpuset *cs, struct ptr_heap *heap) | |||
1116 | * It's ok if we rebind the same mm twice; mpol_rebind_mm() | 1109 | * It's ok if we rebind the same mm twice; mpol_rebind_mm() |
1117 | * is idempotent. Also migrate pages in each mm to new nodes. | 1110 | * is idempotent. Also migrate pages in each mm to new nodes. |
1118 | */ | 1111 | */ |
1119 | cgroup_scan_tasks(&scan); | 1112 | cgroup_scan_tasks(cs->css.cgroup, NULL, cpuset_change_nodemask, &arg, |
1113 | heap); | ||
1120 | 1114 | ||
1121 | /* | 1115 | /* |
1122 | * All the tasks' nodemasks have been updated, update | 1116 | * All the tasks' nodemasks have been updated, update |
@@ -1263,17 +1257,18 @@ static int update_relax_domain_level(struct cpuset *cs, s64 val) | |||
1263 | /* | 1257 | /* |
1264 | * cpuset_change_flag - make a task's spread flags the same as its cpuset's | 1258 | * cpuset_change_flag - make a task's spread flags the same as its cpuset's |
1265 | * @tsk: task to be updated | 1259 | * @tsk: task to be updated |
1266 | * @scan: struct cgroup_scanner containing the cgroup of the task | 1260 | * @data: cpuset to @tsk belongs to |
1267 | * | 1261 | * |
1268 | * Called by cgroup_scan_tasks() for each task in a cgroup. | 1262 | * Called by cgroup_scan_tasks() for each task in a cgroup. |
1269 | * | 1263 | * |
1270 | * We don't need to re-check for the cgroup/cpuset membership, since we're | 1264 | * We don't need to re-check for the cgroup/cpuset membership, since we're |
1271 | * holding cpuset_mutex at this point. | 1265 | * holding cpuset_mutex at this point. |
1272 | */ | 1266 | */ |
1273 | static void cpuset_change_flag(struct task_struct *tsk, | 1267 | static void cpuset_change_flag(struct task_struct *tsk, void *data) |
1274 | struct cgroup_scanner *scan) | ||
1275 | { | 1268 | { |
1276 | cpuset_update_task_spread_flag(cgroup_cs(scan->cgrp), tsk); | 1269 | struct cpuset *cs = data; |
1270 | |||
1271 | cpuset_update_task_spread_flag(cs, tsk); | ||
1277 | } | 1272 | } |
1278 | 1273 | ||
1279 | /* | 1274 | /* |
@@ -1291,13 +1286,7 @@ static void cpuset_change_flag(struct task_struct *tsk, | |||
1291 | */ | 1286 | */ |
1292 | static void update_tasks_flags(struct cpuset *cs, struct ptr_heap *heap) | 1287 | static void update_tasks_flags(struct cpuset *cs, struct ptr_heap *heap) |
1293 | { | 1288 | { |
1294 | struct cgroup_scanner scan; | 1289 | cgroup_scan_tasks(cs->css.cgroup, NULL, cpuset_change_flag, cs, heap); |
1295 | |||
1296 | scan.cgrp = cs->css.cgroup; | ||
1297 | scan.test_task = NULL; | ||
1298 | scan.process_task = cpuset_change_flag; | ||
1299 | scan.heap = heap; | ||
1300 | cgroup_scan_tasks(&scan); | ||
1301 | } | 1290 | } |
1302 | 1291 | ||
1303 | /* | 1292 | /* |