cgroups: net_cls as module
Allows the net_cls cgroup subsystem to be compiled as a module This patch modifies net/sched/cls_cgroup.c to allow the net_cls subsystem to be optionally compiled as a module instead of builtin. The cgroup_subsys struct is moved around a bit to allow the subsys_id to be either declared as a compile-time constant by the cgroup_subsys.h include in cgroup.h, or, if it's a module, initialized within the struct by cgroup_load_subsys. Signed-off-by: Ben Blum <bblum@andrew.cmu.edu> Acked-by: Li Zefan <lizf@cn.fujitsu.com> Cc: Paul Menage <menage@google.com> Cc: "David S. Miller" <davem@davemloft.net> Cc: KAMEZAWA Hiroyuki <kamezawa.hiroyu@jp.fujitsu.com> Cc: Lai Jiangshan <laijs@cn.fujitsu.com> Signed-off-by: Andrew Morton <akpm@linux-foundation.org> Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
committed by
David S. Miller
parent
688328c7ec
commit
8e039d84b3
@@ -328,13 +328,16 @@ config NET_CLS_FLOW
|
|||||||
module will be called cls_flow.
|
module will be called cls_flow.
|
||||||
|
|
||||||
config NET_CLS_CGROUP
|
config NET_CLS_CGROUP
|
||||||
bool "Control Group Classifier"
|
tristate "Control Group Classifier"
|
||||||
select NET_CLS
|
select NET_CLS
|
||||||
depends on CGROUPS
|
depends on CGROUPS
|
||||||
---help---
|
---help---
|
||||||
Say Y here if you want to classify packets based on the control
|
Say Y here if you want to classify packets based on the control
|
||||||
cgroup of their process.
|
cgroup of their process.
|
||||||
|
|
||||||
|
To compile this code as a module, choose M here: the
|
||||||
|
module will be called cls_cgroup.
|
||||||
|
|
||||||
config NET_EMATCH
|
config NET_EMATCH
|
||||||
bool "Extended Matches"
|
bool "Extended Matches"
|
||||||
select NET_CLS
|
select NET_CLS
|
||||||
|
@@ -24,6 +24,25 @@ struct cgroup_cls_state
|
|||||||
u32 classid;
|
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)
|
static inline struct cgroup_cls_state *cgrp_cls_state(struct cgroup *cgrp)
|
||||||
{
|
{
|
||||||
return container_of(cgroup_subsys_state(cgrp, net_cls_subsys_id),
|
return container_of(cgroup_subsys_state(cgrp, net_cls_subsys_id),
|
||||||
@@ -79,14 +98,6 @@ static int cgrp_populate(struct cgroup_subsys *ss, struct cgroup *cgrp)
|
|||||||
return cgroup_add_files(cgrp, ss, ss_files, ARRAY_SIZE(ss_files));
|
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
|
struct cls_cgroup_head
|
||||||
{
|
{
|
||||||
u32 handle;
|
u32 handle;
|
||||||
@@ -277,12 +288,19 @@ static struct tcf_proto_ops cls_cgroup_ops __read_mostly = {
|
|||||||
|
|
||||||
static int __init init_cgroup_cls(void)
|
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)
|
static void __exit exit_cgroup_cls(void)
|
||||||
{
|
{
|
||||||
unregister_tcf_proto_ops(&cls_cgroup_ops);
|
unregister_tcf_proto_ops(&cls_cgroup_ops);
|
||||||
|
cgroup_unload_subsys(&net_cls_subsys);
|
||||||
}
|
}
|
||||||
|
|
||||||
module_init(init_cgroup_cls);
|
module_init(init_cgroup_cls);
|
||||||
|
Reference in New Issue
Block a user