summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTejun Heo <tj@kernel.org>2011-12-12 18:12:22 -0800
committerTejun Heo <tj@kernel.org>2011-12-12 18:12:22 -0800
commit94196f51c1ee5bbad674de28c682b17d78adb8e6 (patch)
treea4965645000e9766f06ee7b5eb2bab098cde0f8c
parentbb9d97b6dffa10cec5e1ce9adbce60f3c2b5eabc (diff)
downloadlwn-94196f51c1ee5bbad674de28c682b17d78adb8e6.tar.gz
lwn-94196f51c1ee5bbad674de28c682b17d78adb8e6.zip
cgroup, cpuset: don't use ss->pre_attach()
->pre_attach() is supposed to be called before migration, which is observed during process migration but task migration does it the other way around. The only ->pre_attach() user is cpuset which can do the same operaitons in ->can_attach(). Collapse cpuset_pre_attach() into cpuset_can_attach(). -v2: Patch contamination from later patch removed. Spotted by Paul Menage. Signed-off-by: Tejun Heo <tj@kernel.org> Reviewed-by: Frederic Weisbecker <fweisbec@gmail.com> Acked-by: Paul Menage <paul@paulmenage.org> Cc: Li Zefan <lizf@cn.fujitsu.com>
-rw-r--r--kernel/cpuset.c29
1 files changed, 12 insertions, 17 deletions
diff --git a/kernel/cpuset.c b/kernel/cpuset.c
index 9a8a61301524..42e568306382 100644
--- a/kernel/cpuset.c
+++ b/kernel/cpuset.c
@@ -1370,6 +1370,15 @@ static int fmeter_getrate(struct fmeter *fmp)
return val;
}
+/*
+ * Protected by cgroup_lock. The nodemasks must be stored globally because
+ * dynamically allocating them is not allowed in can_attach, and they must
+ * persist until attach.
+ */
+static cpumask_var_t cpus_attach;
+static nodemask_t cpuset_attach_nodemask_from;
+static nodemask_t cpuset_attach_nodemask_to;
+
/* Called by cgroups to determine if a cpuset is usable; cgroup_mutex held */
static int cpuset_can_attach(struct cgroup_subsys *ss, struct cgroup *cgrp,
struct cgroup_taskset *tset)
@@ -1396,29 +1405,16 @@ static int cpuset_can_attach(struct cgroup_subsys *ss, struct cgroup *cgrp,
if ((ret = security_task_setscheduler(task)))
return ret;
}
- return 0;
-}
-
-/*
- * Protected by cgroup_lock. The nodemasks must be stored globally because
- * dynamically allocating them is not allowed in pre_attach, and they must
- * persist among pre_attach, and attach.
- */
-static cpumask_var_t cpus_attach;
-static nodemask_t cpuset_attach_nodemask_from;
-static nodemask_t cpuset_attach_nodemask_to;
-
-/* Set-up work for before attaching each task. */
-static void cpuset_pre_attach(struct cgroup *cont)
-{
- struct cpuset *cs = cgroup_cs(cont);
+ /* prepare for attach */
if (cs == &top_cpuset)
cpumask_copy(cpus_attach, cpu_possible_mask);
else
guarantee_online_cpus(cs, cpus_attach);
guarantee_online_mems(cs, &cpuset_attach_nodemask_to);
+
+ return 0;
}
static void cpuset_attach(struct cgroup_subsys *ss, struct cgroup *cgrp,
@@ -1904,7 +1900,6 @@ struct cgroup_subsys cpuset_subsys = {
.create = cpuset_create,
.destroy = cpuset_destroy,
.can_attach = cpuset_can_attach,
- .pre_attach = cpuset_pre_attach,
.attach = cpuset_attach,
.populate = cpuset_populate,
.post_clone = cpuset_post_clone,