diff options
Diffstat (limited to 'net/sched/cls_cgroup.c')
| -rw-r--r-- | net/sched/cls_cgroup.c | 37 | 
1 files changed, 28 insertions, 9 deletions
diff --git a/net/sched/cls_cgroup.c b/net/sched/cls_cgroup.c index e4877ca6727..221180384fd 100644 --- a/net/sched/cls_cgroup.c +++ b/net/sched/cls_cgroup.c @@ -10,6 +10,7 @@   */  #include <linux/module.h> +#include <linux/slab.h>  #include <linux/types.h>  #include <linux/string.h>  #include <linux/errno.h> @@ -24,6 +25,25 @@ struct cgroup_cls_state  	u32 classid;  }; +static struct cgroup_subsys_state *cgrp_create(struct cgroup_subsys *ss, +					       struct cgroup *cgrp); +static void cgrp_destroy(struct cgroup_subsys *ss, struct cgroup *cgrp); +static int cgrp_populate(struct cgroup_subsys *ss, struct cgroup *cgrp); + +struct cgroup_subsys net_cls_subsys = { +	.name		= "net_cls", +	.create		= cgrp_create, +	.destroy	= cgrp_destroy, +	.populate	= cgrp_populate, +#ifdef CONFIG_NET_CLS_CGROUP +	.subsys_id	= net_cls_subsys_id, +#else +#define net_cls_subsys_id net_cls_subsys.subsys_id +#endif +	.module		= THIS_MODULE, +}; + +  static inline struct cgroup_cls_state *cgrp_cls_state(struct cgroup *cgrp)  {  	return container_of(cgroup_subsys_state(cgrp, net_cls_subsys_id), @@ -79,14 +99,6 @@ static int cgrp_populate(struct cgroup_subsys *ss, struct cgroup *cgrp)  	return cgroup_add_files(cgrp, ss, ss_files, ARRAY_SIZE(ss_files));  } -struct cgroup_subsys net_cls_subsys = { -	.name		= "net_cls", -	.create		= cgrp_create, -	.destroy	= cgrp_destroy, -	.populate	= cgrp_populate, -	.subsys_id	= net_cls_subsys_id, -}; -  struct cls_cgroup_head  {  	u32			handle; @@ -277,12 +289,19 @@ static struct tcf_proto_ops cls_cgroup_ops __read_mostly = {  static int __init init_cgroup_cls(void)  { -	return register_tcf_proto_ops(&cls_cgroup_ops); +	int ret = register_tcf_proto_ops(&cls_cgroup_ops); +	if (ret) +		return ret; +	ret = cgroup_load_subsys(&net_cls_subsys); +	if (ret) +		unregister_tcf_proto_ops(&cls_cgroup_ops); +	return ret;  }  static void __exit exit_cgroup_cls(void)  {  	unregister_tcf_proto_ops(&cls_cgroup_ops); +	cgroup_unload_subsys(&net_cls_subsys);  }  module_init(init_cgroup_cls);  |