cgroup: add/update accessors which obtain subsys specific data from css
authorTejun Heo <tj@kernel.org>
Fri, 9 Aug 2013 00:11:23 +0000 (20:11 -0400)
committerTejun Heo <tj@kernel.org>
Fri, 9 Aug 2013 00:11:23 +0000 (20:11 -0400)
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>
block/blk-cgroup.h
kernel/cgroup_freezer.c
kernel/cpuset.c
kernel/sched/core.c
kernel/sched/cpuacct.c
mm/hugetlb_cgroup.c
mm/memcontrol.c
net/sched/cls_cgroup.c
security/device_cgroup.c

index 628e50f6f8a88092d2c41c075291edceb1b54f9e..8e5863e900bf1a2cc2f4c18dca0b2e2703f74e42 100644 (file)
@@ -179,21 +179,25 @@ int blkg_conf_prep(struct blkcg *blkcg, const struct blkcg_policy *pol,
 void blkg_conf_finish(struct blkg_conf_ctx *ctx);
 
 
+static inline struct blkcg *css_to_blkcg(struct cgroup_subsys_state *css)
+{
+       return css ? container_of(css, struct blkcg, css) : NULL;
+}
+
 static inline struct blkcg *cgroup_to_blkcg(struct cgroup *cgroup)
 {
-       return container_of(cgroup_css(cgroup, blkio_subsys_id),
-                           struct blkcg, css);
+       return css_to_blkcg(cgroup_css(cgroup, blkio_subsys_id));
 }
 
 static inline struct blkcg *task_blkcg(struct task_struct *tsk)
 {
-       return container_of(task_css(tsk, blkio_subsys_id), struct blkcg, css);
+       return css_to_blkcg(task_css(tsk, blkio_subsys_id));
 }
 
 static inline struct blkcg *bio_blkcg(struct bio *bio)
 {
        if (bio && bio->bi_css)
-               return container_of(bio->bi_css, struct blkcg, css);
+               return css_to_blkcg(bio->bi_css);
        return task_blkcg(current);
 }
 
index 9d3f61566fecab2b035acf15741a853f6f7b4f25..1db686e47a22a24eafe322e4249bbd983aeef76a 100644 (file)
@@ -45,16 +45,19 @@ struct freezer {
        spinlock_t                      lock;
 };
 
+static inline struct freezer *css_freezer(struct cgroup_subsys_state *css)
+{
+       return css ? container_of(css, struct freezer, css) : NULL;
+}
+
 static inline struct freezer *cgroup_freezer(struct cgroup *cgroup)
 {
-       return container_of(cgroup_css(cgroup, freezer_subsys_id),
-                           struct freezer, css);
+       return css_freezer(cgroup_css(cgroup, freezer_subsys_id));
 }
 
 static inline struct freezer *task_freezer(struct task_struct *task)
 {
-       return container_of(task_css(task, freezer_subsys_id),
-                           struct freezer, css);
+       return css_freezer(task_css(task, freezer_subsys_id));
 }
 
 static struct freezer *parent_freezer(struct freezer *freezer)
index f7371341d42a8305292680b51e8eb19f2569278d..6e9cbdde25bd61e994ca395dd0f131c857a7aeaf 100644 (file)
@@ -114,18 +114,21 @@ struct cpuset {
        int relax_domain_level;
 };
 
+static inline struct cpuset *css_cs(struct cgroup_subsys_state *css)
+{
+       return css ? container_of(css, struct cpuset, css) : NULL;
+}
+
 /* Retrieve the cpuset for a cgroup */
 static inline struct cpuset *cgroup_cs(struct cgroup *cgrp)
 {
-       return container_of(cgroup_css(cgrp, cpuset_subsys_id),
-                           struct cpuset, css);
+       return css_cs(cgroup_css(cgrp, cpuset_subsys_id));
 }
 
 /* Retrieve the cpuset for a task */
 static inline struct cpuset *task_cs(struct task_struct *task)
 {
-       return container_of(task_css(task, cpuset_subsys_id),
-                           struct cpuset, css);
+       return css_cs(task_css(task, cpuset_subsys_id));
 }
 
 static inline struct cpuset *parent_cs(struct cpuset *cs)
index 323d907eac1ab2d310978bcc49dfb5c21c3b8006..5bccb0277129a728978a6e1ebc630cda7366ac0c 100644 (file)
@@ -7083,11 +7083,15 @@ int sched_rt_handler(struct ctl_table *table, int write,
 
 #ifdef CONFIG_CGROUP_SCHED
 
+static inline struct task_group *css_tg(struct cgroup_subsys_state *css)
+{
+       return css ? container_of(css, struct task_group, css) : NULL;
+}
+
 /* return corresponding task_group object of a cgroup */
 static inline struct task_group *cgroup_tg(struct cgroup *cgrp)
 {
-       return container_of(cgroup_css(cgrp, cpu_cgroup_subsys_id),
-                           struct task_group, css);
+       return css_tg(cgroup_css(cgrp, cpu_cgroup_subsys_id));
 }
 
 static struct cgroup_subsys_state *cpu_cgroup_css_alloc(struct cgroup *cgrp)
index 4a210faaab778b9ba0db6032a827424a8130f5f8..8ccfa10cc89ff4af0f9b4692b6f6d19129f1d4ec 100644 (file)
@@ -33,18 +33,21 @@ struct cpuacct {
        struct kernel_cpustat __percpu *cpustat;
 };
 
+static inline struct cpuacct *css_ca(struct cgroup_subsys_state *css)
+{
+       return css ? container_of(css, struct cpuacct, css) : NULL;
+}
+
 /* return cpu accounting group corresponding to this container */
 static inline struct cpuacct *cgroup_ca(struct cgroup *cgrp)
 {
-       return container_of(cgroup_css(cgrp, cpuacct_subsys_id),
-                           struct cpuacct, css);
+       return css_ca(cgroup_css(cgrp, cpuacct_subsys_id));
 }
 
 /* return cpu accounting group to which this task belongs */
 static inline struct cpuacct *task_ca(struct task_struct *tsk)
 {
-       return container_of(task_css(tsk, cpuacct_subsys_id),
-                           struct cpuacct, css);
+       return css_ca(task_css(tsk, cpuacct_subsys_id));
 }
 
 static inline struct cpuacct *__parent_ca(struct cpuacct *ca)
index d2f9fc0b186e3965cc43cb17906f348bfeefb5ce..95585a0b9c8da8b1582d2341720a944b3b47a0b7 100644 (file)
@@ -36,7 +36,7 @@ static struct hugetlb_cgroup *root_h_cgroup __read_mostly;
 static inline
 struct hugetlb_cgroup *hugetlb_cgroup_from_css(struct cgroup_subsys_state *s)
 {
-       return container_of(s, struct hugetlb_cgroup, css);
+       return s ? container_of(s, struct hugetlb_cgroup, css) : NULL;
 }
 
 static inline
index b47bd3ad3c2b6674fa7840c5251d3a5e0bf7b3ef..11d659e3b08ede8bdf7a8f5b15452e0a013d67d2 100644 (file)
@@ -486,7 +486,7 @@ static DEFINE_MUTEX(memcg_create_mutex);
 static inline
 struct mem_cgroup *mem_cgroup_from_css(struct cgroup_subsys_state *s)
 {
-       return container_of(s, struct mem_cgroup, css);
+       return s ? container_of(s, struct mem_cgroup, css) : NULL;
 }
 
 /* Some nice accessors for the vmpressure. */
index 5ee72a001df0b68c4bd25c70bfc75cf13dccc95f..af412ab2b477777f9348cc51c839681f72a42c24 100644 (file)
 #include <net/sock.h>
 #include <net/cls_cgroup.h>
 
+static inline struct cgroup_cls_state *css_cls_state(struct cgroup_subsys_state *css)
+{
+       return css ? container_of(css, struct cgroup_cls_state, css) : NULL;
+}
+
 static inline struct cgroup_cls_state *cgrp_cls_state(struct cgroup *cgrp)
 {
-       return container_of(cgroup_css(cgrp, net_cls_subsys_id),
-                           struct cgroup_cls_state, css);
+       return css_cls_state(cgroup_css(cgrp, net_cls_subsys_id));
 }
 
 static inline struct cgroup_cls_state *task_cls_state(struct task_struct *p)
 {
-       return container_of(task_css(p, net_cls_subsys_id),
-                           struct cgroup_cls_state, css);
+       return css_cls_state(task_css(p, net_cls_subsys_id));
 }
 
 static struct cgroup_subsys_state *cgrp_css_alloc(struct cgroup *cgrp)
index 87a0a037fbd655eb15e44928eb918e55e0d55d07..90953648c643e02b223a42c99fe866722a6b7d42 100644 (file)
@@ -53,7 +53,7 @@ struct dev_cgroup {
 
 static inline struct dev_cgroup *css_to_devcgroup(struct cgroup_subsys_state *s)
 {
-       return container_of(s, struct dev_cgroup, css);
+       return s ? container_of(s, struct dev_cgroup, css) : NULL;
 }
 
 static inline struct dev_cgroup *cgroup_to_devcgroup(struct cgroup *cgroup)