aboutsummaryrefslogtreecommitdiffstats
path: root/kernel/sched
diff options
context:
space:
mode:
authorTejun Heo <tj@kernel.org>2013-08-08 20:11:23 -0400
committerTejun Heo <tj@kernel.org>2013-08-08 20:11:23 -0400
commiteb95419b023abacb415e2a18fea899023ce7624d (patch)
tree705284469b67cbe440b86c6cb81e1cf27648eba9 /kernel/sched
parent6387698699afd72d6304566fb6ccf84bffe07c56 (diff)
cgroup: pass around cgroup_subsys_state instead of cgroup in subsystem methods
cgroup is currently in the process of transitioning to using struct cgroup_subsys_state * as the primary handle instead of struct cgroup * in subsystem implementations for the following reasons. * With unified hierarchy, subsystems will be dynamically bound and unbound from cgroups and thus css's (cgroup_subsys_state) may be created and destroyed dynamically over the lifetime of a cgroup, which is different from the current state where all css's are allocated and destroyed together with the associated cgroup. This in turn means that cgroup_css() should be synchronized and may return NULL, making it more cumbersome to use. * Differing levels of per-subsystem granularity in the unified hierarchy means that the task and descendant iterators should behave differently depending on the specific subsystem the iteration is being performed for. * In majority of the cases, subsystems only care about its part in the cgroup hierarchy - ie. the hierarchy of css's. Subsystem methods often obtain the matching css pointer from the cgroup and don't bother with the cgroup pointer itself. Passing around css fits much better. This patch converts all cgroup_subsys methods to take @css instead of @cgroup. The conversions are mostly straight-forward. A few noteworthy changes are * ->css_alloc() now takes css of the parent cgroup rather than the pointer to the new cgroup as the css for the new cgroup doesn't exist yet. Knowing the parent css is enough for all the existing subsystems. * In kernel/cgroup.c::offline_css(), unnecessary open coded css dereference is replaced with local variable access. This patch shouldn't cause any behavior differences. v2: Unnecessary explicit cgrp->subsys[] deref in css_online() replaced with local variable @css as suggested by Li Zefan. Rebased on top of new for-3.12 which includes for-3.11-fixes so that ->css_free() invocation added by da0a12caff ("cgroup: fix a leak when percpu_ref_init() fails") is converted too. Suggested by Li Zefan. Signed-off-by: Tejun Heo <tj@kernel.org> Acked-by: Li Zefan <lizefan@huawei.com> Acked-by: Michal Hocko <mhocko@suse.cz> Acked-by: Vivek Goyal <vgoyal@redhat.com> Acked-by: Aristeu Rozanski <aris@redhat.com> Acked-by: Daniel Wagner <daniel.wagner@bmw-carit.de> Cc: Peter Zijlstra <peterz@infradead.org> Cc: Ingo Molnar <mingo@redhat.com> Cc: Johannes Weiner <hannes@cmpxchg.org> Cc: Balbir Singh <bsingharora@gmail.com> Cc: Matt Helsley <matthltc@us.ibm.com> Cc: Jens Axboe <axboe@kernel.dk> Cc: Steven Rostedt <rostedt@goodmis.org>
Diffstat (limited to 'kernel/sched')
-rw-r--r--kernel/sched/core.c39
-rw-r--r--kernel/sched/cpuacct.c9
2 files changed, 25 insertions, 23 deletions
diff --git a/kernel/sched/core.c b/kernel/sched/core.c
index 7a10742b389a..622b7efc5ade 100644
--- a/kernel/sched/core.c
+++ b/kernel/sched/core.c
@@ -7094,16 +7094,17 @@ static inline struct task_group *cgroup_tg(struct cgroup *cgrp)
7094 return css_tg(cgroup_css(cgrp, cpu_cgroup_subsys_id)); 7094 return css_tg(cgroup_css(cgrp, cpu_cgroup_subsys_id));
7095} 7095}
7096 7096
7097static struct cgroup_subsys_state *cpu_cgroup_css_alloc(struct cgroup *cgrp) 7097static struct cgroup_subsys_state *
7098cpu_cgroup_css_alloc(struct cgroup_subsys_state *parent_css)
7098{ 7099{
7099 struct task_group *tg, *parent; 7100 struct task_group *parent = css_tg(parent_css);
7101 struct task_group *tg;
7100 7102
7101 if (!cgrp->parent) { 7103 if (!parent) {
7102 /* This is early initialization for the top cgroup */ 7104 /* This is early initialization for the top cgroup */
7103 return &root_task_group.css; 7105 return &root_task_group.css;
7104 } 7106 }
7105 7107
7106 parent = cgroup_tg(cgrp->parent);
7107 tg = sched_create_group(parent); 7108 tg = sched_create_group(parent);
7108 if (IS_ERR(tg)) 7109 if (IS_ERR(tg))
7109 return ERR_PTR(-ENOMEM); 7110 return ERR_PTR(-ENOMEM);
@@ -7111,38 +7112,38 @@ static struct cgroup_subsys_state *cpu_cgroup_css_alloc(struct cgroup *cgrp)
7111 return &tg->css; 7112 return &tg->css;
7112} 7113}
7113 7114
7114static int cpu_cgroup_css_online(struct cgroup *cgrp) 7115static int cpu_cgroup_css_online(struct cgroup_subsys_state *css)
7115{ 7116{
7116 struct task_group *tg = cgroup_tg(cgrp); 7117 struct task_group *tg = css_tg(css);
7117 struct task_group *parent = css_tg(css_parent(&tg->css)); 7118 struct task_group *parent = css_tg(css_parent(css));
7118 7119
7119 if (parent) 7120 if (parent)
7120 sched_online_group(tg, parent); 7121 sched_online_group(tg, parent);
7121 return 0; 7122 return 0;
7122} 7123}
7123 7124
7124static void cpu_cgroup_css_free(struct cgroup *cgrp) 7125static void cpu_cgroup_css_free(struct cgroup_subsys_state *css)
7125{ 7126{
7126 struct task_group *tg = cgroup_tg(cgrp); 7127 struct task_group *tg = css_tg(css);
7127 7128
7128 sched_destroy_group(tg); 7129 sched_destroy_group(tg);
7129} 7130}
7130 7131
7131static void cpu_cgroup_css_offline(struct cgroup *cgrp) 7132static void cpu_cgroup_css_offline(struct cgroup_subsys_state *css)
7132{ 7133{
7133 struct task_group *tg = cgroup_tg(cgrp); 7134 struct task_group *tg = css_tg(css);
7134 7135
7135 sched_offline_group(tg); 7136 sched_offline_group(tg);
7136} 7137}
7137 7138
7138static int cpu_cgroup_can_attach(struct cgroup *cgrp, 7139static int cpu_cgroup_can_attach(struct cgroup_subsys_state *css,
7139 struct cgroup_taskset *tset) 7140 struct cgroup_taskset *tset)
7140{ 7141{
7141 struct task_struct *task; 7142 struct task_struct *task;
7142 7143
7143 cgroup_taskset_for_each(task, cgrp, tset) { 7144 cgroup_taskset_for_each(task, css->cgroup, tset) {
7144#ifdef CONFIG_RT_GROUP_SCHED 7145#ifdef CONFIG_RT_GROUP_SCHED
7145 if (!sched_rt_can_attach(cgroup_tg(cgrp), task)) 7146 if (!sched_rt_can_attach(css_tg(css), task))
7146 return -EINVAL; 7147 return -EINVAL;
7147#else 7148#else
7148 /* We don't support RT-tasks being in separate groups */ 7149 /* We don't support RT-tasks being in separate groups */
@@ -7153,18 +7154,18 @@ static int cpu_cgroup_can_attach(struct cgroup *cgrp,
7153 return 0; 7154 return 0;
7154} 7155}
7155 7156
7156static void cpu_cgroup_attach(struct cgroup *cgrp, 7157static void cpu_cgroup_attach(struct cgroup_subsys_state *css,
7157 struct cgroup_taskset *tset) 7158 struct cgroup_taskset *tset)
7158{ 7159{
7159 struct task_struct *task; 7160 struct task_struct *task;
7160 7161
7161 cgroup_taskset_for_each(task, cgrp, tset) 7162 cgroup_taskset_for_each(task, css->cgroup, tset)
7162 sched_move_task(task); 7163 sched_move_task(task);
7163} 7164}
7164 7165
7165static void 7166static void cpu_cgroup_exit(struct cgroup_subsys_state *css,
7166cpu_cgroup_exit(struct cgroup *cgrp, struct cgroup *old_cgrp, 7167 struct cgroup_subsys_state *old_css,
7167 struct task_struct *task) 7168 struct task_struct *task)
7168{ 7169{
7169 /* 7170 /*
7170 * cgroup_exit() is called in the copy_process() failure path. 7171 * cgroup_exit() is called in the copy_process() failure path.
diff --git a/kernel/sched/cpuacct.c b/kernel/sched/cpuacct.c
index f6926a149a71..1b784d9b3630 100644
--- a/kernel/sched/cpuacct.c
+++ b/kernel/sched/cpuacct.c
@@ -62,11 +62,12 @@ static struct cpuacct root_cpuacct = {
62}; 62};
63 63
64/* create a new cpu accounting group */ 64/* create a new cpu accounting group */
65static struct cgroup_subsys_state *cpuacct_css_alloc(struct cgroup *cgrp) 65static struct cgroup_subsys_state *
66cpuacct_css_alloc(struct cgroup_subsys_state *parent_css)
66{ 67{
67 struct cpuacct *ca; 68 struct cpuacct *ca;
68 69
69 if (!cgrp->parent) 70 if (!parent_css)
70 return &root_cpuacct.css; 71 return &root_cpuacct.css;
71 72
72 ca = kzalloc(sizeof(*ca), GFP_KERNEL); 73 ca = kzalloc(sizeof(*ca), GFP_KERNEL);
@@ -92,9 +93,9 @@ out:
92} 93}
93 94
94/* destroy an existing cpu accounting group */ 95/* destroy an existing cpu accounting group */
95static void cpuacct_css_free(struct cgroup *cgrp) 96static void cpuacct_css_free(struct cgroup_subsys_state *css)
96{ 97{
97 struct cpuacct *ca = cgroup_ca(cgrp); 98 struct cpuacct *ca = css_ca(css);
98 99
99 free_percpu(ca->cpustat); 100 free_percpu(ca->cpustat);
100 free_percpu(ca->cpuusage); 101 free_percpu(ca->cpuusage);