aboutsummaryrefslogtreecommitdiffstats
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
commita7c6d554aa01236ac2a9f851ab0f75704f76dfa2 (patch)
treefe62d07283a589daa39f843deaefafd11c572b84
parent72c97e54e0f043d33b246d7460ae0a36c4b8c643 (diff)
cgroup: add/update accessors which obtain subsys specific data from css
css (cgroup_subsys_state) is usually embedded in a subsys specific data structure. Subsystems either use container_of() directly to cast from css to such data structure or has an accessor function wrapping such cast. As cgroup as whole is moving towards using css as the main interface handle, add and update such accessors to ease dealing with css's. All accessors explicitly handle NULL input and return NULL in those cases. While this looks like an extra branch in the code, as all controllers specific data structures have css as the first field, the casting doesn't involve any offsetting and the compiler can trivially optimize out the branch. * blkio, freezer, cpuset, cpu, cpuacct and net_cls didn't have such accessor. Added. * memory, hugetlb and devices already had one but didn't explicitly handle NULL input. Updated. Signed-off-by: Tejun Heo <tj@kernel.org> Acked-by: Li Zefan <lizefan@huawei.com>
-rw-r--r--block/blk-cgroup.h12
-rw-r--r--kernel/cgroup_freezer.c11
-rw-r--r--kernel/cpuset.c11
-rw-r--r--kernel/sched/core.c8
-rw-r--r--kernel/sched/cpuacct.c11
-rw-r--r--mm/hugetlb_cgroup.c2
-rw-r--r--mm/memcontrol.c2
-rw-r--r--net/sched/cls_cgroup.c11
-rw-r--r--security/device_cgroup.c2
9 files changed, 45 insertions, 25 deletions
diff --git a/block/blk-cgroup.h b/block/blk-cgroup.h
index 628e50f6f8a8..8e5863e900bf 100644
--- a/block/blk-cgroup.h
+++ b/block/blk-cgroup.h
@@ -179,21 +179,25 @@ int blkg_conf_prep(struct blkcg *blkcg, const struct blkcg_policy *pol,
179void blkg_conf_finish(struct blkg_conf_ctx *ctx); 179void blkg_conf_finish(struct blkg_conf_ctx *ctx);
180 180
181 181
182static inline struct blkcg *css_to_blkcg(struct cgroup_subsys_state *css)
183{
184 return css ? container_of(css, struct blkcg, css) : NULL;
185}
186
182static inline struct blkcg *cgroup_to_blkcg(struct cgroup *cgroup) 187static inline struct blkcg *cgroup_to_blkcg(struct cgroup *cgroup)
183{ 188{
184 return container_of(cgroup_css(cgroup, blkio_subsys_id), 189 return css_to_blkcg(cgroup_css(cgroup, blkio_subsys_id));
185 struct blkcg, css);
186} 190}
187 191
188static inline struct blkcg *task_blkcg(struct task_struct *tsk) 192static inline struct blkcg *task_blkcg(struct task_struct *tsk)
189{ 193{
190 return container_of(task_css(tsk, blkio_subsys_id), struct blkcg, css); 194 return css_to_blkcg(task_css(tsk, blkio_subsys_id));
191} 195}
192 196
193static inline struct blkcg *bio_blkcg(struct bio *bio) 197static inline struct blkcg *bio_blkcg(struct bio *bio)
194{ 198{
195 if (bio && bio->bi_css) 199 if (bio && bio->bi_css)
196 return container_of(bio->bi_css, struct blkcg, css); 200 return css_to_blkcg(bio->bi_css);
197 return task_blkcg(current); 201 return task_blkcg(current);
198} 202}
199 203
diff --git a/kernel/cgroup_freezer.c b/kernel/cgroup_freezer.c
index 9d3f61566fec..1db686e47a22 100644
--- a/kernel/cgroup_freezer.c
+++ b/kernel/cgroup_freezer.c
@@ -45,16 +45,19 @@ struct freezer {
45 spinlock_t lock; 45 spinlock_t lock;
46}; 46};
47 47
48static inline struct freezer *css_freezer(struct cgroup_subsys_state *css)
49{
50 return css ? container_of(css, struct freezer, css) : NULL;
51}
52
48static inline struct freezer *cgroup_freezer(struct cgroup *cgroup) 53static inline struct freezer *cgroup_freezer(struct cgroup *cgroup)
49{ 54{
50 return container_of(cgroup_css(cgroup, freezer_subsys_id), 55 return css_freezer(cgroup_css(cgroup, freezer_subsys_id));
51 struct freezer, css);
52} 56}
53 57
54static inline struct freezer *task_freezer(struct task_struct *task) 58static inline struct freezer *task_freezer(struct task_struct *task)
55{ 59{
56 return container_of(task_css(task, freezer_subsys_id), 60 return css_freezer(task_css(task, freezer_subsys_id));
57 struct freezer, css);
58} 61}
59 62
60static struct freezer *parent_freezer(struct freezer *freezer) 63static struct freezer *parent_freezer(struct freezer *freezer)
diff --git a/kernel/cpuset.c b/kernel/cpuset.c
index f7371341d42a..6e9cbdde25bd 100644
--- a/kernel/cpuset.c
+++ b/kernel/cpuset.c
@@ -114,18 +114,21 @@ struct cpuset {
114 int relax_domain_level; 114 int relax_domain_level;
115}; 115};
116 116
117static inline struct cpuset *css_cs(struct cgroup_subsys_state *css)
118{
119 return css ? container_of(css, struct cpuset, css) : NULL;
120}
121
117/* Retrieve the cpuset for a cgroup */ 122/* Retrieve the cpuset for a cgroup */
118static inline struct cpuset *cgroup_cs(struct cgroup *cgrp) 123static inline struct cpuset *cgroup_cs(struct cgroup *cgrp)
119{ 124{
120 return container_of(cgroup_css(cgrp, cpuset_subsys_id), 125 return css_cs(cgroup_css(cgrp, cpuset_subsys_id));
121 struct cpuset, css);
122} 126}
123 127
124/* Retrieve the cpuset for a task */ 128/* Retrieve the cpuset for a task */
125static inline struct cpuset *task_cs(struct task_struct *task) 129static inline struct cpuset *task_cs(struct task_struct *task)
126{ 130{
127 return container_of(task_css(task, cpuset_subsys_id), 131 return css_cs(task_css(task, cpuset_subsys_id));
128 struct cpuset, css);
129} 132}
130 133
131static inline struct cpuset *parent_cs(struct cpuset *cs) 134static inline struct cpuset *parent_cs(struct cpuset *cs)
diff --git a/kernel/sched/core.c b/kernel/sched/core.c
index 323d907eac1a..5bccb0277129 100644
--- a/kernel/sched/core.c
+++ b/kernel/sched/core.c
@@ -7083,11 +7083,15 @@ int sched_rt_handler(struct ctl_table *table, int write,
7083 7083
7084#ifdef CONFIG_CGROUP_SCHED 7084#ifdef CONFIG_CGROUP_SCHED
7085 7085
7086static inline struct task_group *css_tg(struct cgroup_subsys_state *css)
7087{
7088 return css ? container_of(css, struct task_group, css) : NULL;
7089}
7090
7086/* return corresponding task_group object of a cgroup */ 7091/* return corresponding task_group object of a cgroup */
7087static inline struct task_group *cgroup_tg(struct cgroup *cgrp) 7092static inline struct task_group *cgroup_tg(struct cgroup *cgrp)
7088{ 7093{
7089 return container_of(cgroup_css(cgrp, cpu_cgroup_subsys_id), 7094 return css_tg(cgroup_css(cgrp, cpu_cgroup_subsys_id));
7090 struct task_group, css);
7091} 7095}
7092 7096
7093static struct cgroup_subsys_state *cpu_cgroup_css_alloc(struct cgroup *cgrp) 7097static struct cgroup_subsys_state *cpu_cgroup_css_alloc(struct cgroup *cgrp)
diff --git a/kernel/sched/cpuacct.c b/kernel/sched/cpuacct.c
index 4a210faaab77..8ccfa10cc89f 100644
--- a/kernel/sched/cpuacct.c
+++ b/kernel/sched/cpuacct.c
@@ -33,18 +33,21 @@ struct cpuacct {
33 struct kernel_cpustat __percpu *cpustat; 33 struct kernel_cpustat __percpu *cpustat;
34}; 34};
35 35
36static inline struct cpuacct *css_ca(struct cgroup_subsys_state *css)
37{
38 return css ? container_of(css, struct cpuacct, css) : NULL;
39}
40
36/* return cpu accounting group corresponding to this container */ 41/* return cpu accounting group corresponding to this container */
37static inline struct cpuacct *cgroup_ca(struct cgroup *cgrp) 42static inline struct cpuacct *cgroup_ca(struct cgroup *cgrp)
38{ 43{
39 return container_of(cgroup_css(cgrp, cpuacct_subsys_id), 44 return css_ca(cgroup_css(cgrp, cpuacct_subsys_id));
40 struct cpuacct, css);
41} 45}
42 46
43/* return cpu accounting group to which this task belongs */ 47/* return cpu accounting group to which this task belongs */
44static inline struct cpuacct *task_ca(struct task_struct *tsk) 48static inline struct cpuacct *task_ca(struct task_struct *tsk)
45{ 49{
46 return container_of(task_css(tsk, cpuacct_subsys_id), 50 return css_ca(task_css(tsk, cpuacct_subsys_id));
47 struct cpuacct, css);
48} 51}
49 52
50static inline struct cpuacct *__parent_ca(struct cpuacct *ca) 53static inline struct cpuacct *__parent_ca(struct cpuacct *ca)
diff --git a/mm/hugetlb_cgroup.c b/mm/hugetlb_cgroup.c
index d2f9fc0b186e..95585a0b9c8d 100644
--- a/mm/hugetlb_cgroup.c
+++ b/mm/hugetlb_cgroup.c
@@ -36,7 +36,7 @@ static struct hugetlb_cgroup *root_h_cgroup __read_mostly;
36static inline 36static inline
37struct hugetlb_cgroup *hugetlb_cgroup_from_css(struct cgroup_subsys_state *s) 37struct hugetlb_cgroup *hugetlb_cgroup_from_css(struct cgroup_subsys_state *s)
38{ 38{
39 return container_of(s, struct hugetlb_cgroup, css); 39 return s ? container_of(s, struct hugetlb_cgroup, css) : NULL;
40} 40}
41 41
42static inline 42static inline
diff --git a/mm/memcontrol.c b/mm/memcontrol.c
index b47bd3ad3c2b..11d659e3b08e 100644
--- a/mm/memcontrol.c
+++ b/mm/memcontrol.c
@@ -486,7 +486,7 @@ static DEFINE_MUTEX(memcg_create_mutex);
486static inline 486static inline
487struct mem_cgroup *mem_cgroup_from_css(struct cgroup_subsys_state *s) 487struct mem_cgroup *mem_cgroup_from_css(struct cgroup_subsys_state *s)
488{ 488{
489 return container_of(s, struct mem_cgroup, css); 489 return s ? container_of(s, struct mem_cgroup, css) : NULL;
490} 490}
491 491
492/* Some nice accessors for the vmpressure. */ 492/* Some nice accessors for the vmpressure. */
diff --git a/net/sched/cls_cgroup.c b/net/sched/cls_cgroup.c
index 5ee72a001df0..af412ab2b477 100644
--- a/net/sched/cls_cgroup.c
+++ b/net/sched/cls_cgroup.c
@@ -23,16 +23,19 @@
23#include <net/sock.h> 23#include <net/sock.h>
24#include <net/cls_cgroup.h> 24#include <net/cls_cgroup.h>
25 25
26static inline struct cgroup_cls_state *css_cls_state(struct cgroup_subsys_state *css)
27{
28 return css ? container_of(css, struct cgroup_cls_state, css) : NULL;
29}
30
26static inline struct cgroup_cls_state *cgrp_cls_state(struct cgroup *cgrp) 31static inline struct cgroup_cls_state *cgrp_cls_state(struct cgroup *cgrp)
27{ 32{
28 return container_of(cgroup_css(cgrp, net_cls_subsys_id), 33 return css_cls_state(cgroup_css(cgrp, net_cls_subsys_id));
29 struct cgroup_cls_state, css);
30} 34}
31 35
32static inline struct cgroup_cls_state *task_cls_state(struct task_struct *p) 36static inline struct cgroup_cls_state *task_cls_state(struct task_struct *p)
33{ 37{
34 return container_of(task_css(p, net_cls_subsys_id), 38 return css_cls_state(task_css(p, net_cls_subsys_id));
35 struct cgroup_cls_state, css);
36} 39}
37 40
38static struct cgroup_subsys_state *cgrp_css_alloc(struct cgroup *cgrp) 41static struct cgroup_subsys_state *cgrp_css_alloc(struct cgroup *cgrp)
diff --git a/security/device_cgroup.c b/security/device_cgroup.c
index 87a0a037fbd6..90953648c643 100644
--- a/security/device_cgroup.c
+++ b/security/device_cgroup.c
@@ -53,7 +53,7 @@ struct dev_cgroup {
53 53
54static inline struct dev_cgroup *css_to_devcgroup(struct cgroup_subsys_state *s) 54static inline struct dev_cgroup *css_to_devcgroup(struct cgroup_subsys_state *s)
55{ 55{
56 return container_of(s, struct dev_cgroup, css); 56 return s ? container_of(s, struct dev_cgroup, css) : NULL;
57} 57}
58 58
59static inline struct dev_cgroup *cgroup_to_devcgroup(struct cgroup *cgroup) 59static inline struct dev_cgroup *cgroup_to_devcgroup(struct cgroup *cgroup)