diff options
Diffstat (limited to 'net/sched/cls_cgroup.c')
-rw-r--r-- | net/sched/cls_cgroup.c | 50 |
1 files changed, 16 insertions, 34 deletions
diff --git a/net/sched/cls_cgroup.c b/net/sched/cls_cgroup.c index 78ef2c5e130b..221180384fd7 100644 --- a/net/sched/cls_cgroup.c +++ b/net/sched/cls_cgroup.c @@ -16,11 +16,14 @@ #include <linux/errno.h> #include <linux/skbuff.h> #include <linux/cgroup.h> -#include <linux/rcupdate.h> #include <net/rtnetlink.h> #include <net/pkt_cls.h> -#include <net/sock.h> -#include <net/cls_cgroup.h> + +struct cgroup_cls_state +{ + struct cgroup_subsys_state css; + u32 classid; +}; static struct cgroup_subsys_state *cgrp_create(struct cgroup_subsys *ss, struct cgroup *cgrp); @@ -109,10 +112,6 @@ static int cls_cgroup_classify(struct sk_buff *skb, struct tcf_proto *tp, struct cls_cgroup_head *head = tp->root; u32 classid; - rcu_read_lock(); - classid = task_cls_state(current)->classid; - rcu_read_unlock(); - /* * Due to the nature of the classifier it is required to ignore all * packets originating from softirq context as accessing `current' @@ -123,12 +122,12 @@ static int cls_cgroup_classify(struct sk_buff *skb, struct tcf_proto *tp, * calls by looking at the number of nested bh disable calls because * softirqs always disables bh. */ - if (softirq_count() != SOFTIRQ_OFFSET) { - /* If there is an sk_classid we'll use that. */ - if (!skb->sk) - return -1; - classid = skb->sk->sk_classid; - } + if (softirq_count() != SOFTIRQ_OFFSET) + return -1; + + rcu_read_lock(); + classid = task_cls_state(current)->classid; + rcu_read_unlock(); if (!classid) return -1; @@ -290,35 +289,18 @@ static struct tcf_proto_ops cls_cgroup_ops __read_mostly = { static int __init init_cgroup_cls(void) { - int ret; - - ret = cgroup_load_subsys(&net_cls_subsys); + int ret = register_tcf_proto_ops(&cls_cgroup_ops); if (ret) - goto out; - -#ifndef CONFIG_NET_CLS_CGROUP - /* We can't use rcu_assign_pointer because this is an int. */ - smp_wmb(); - net_cls_subsys_id = net_cls_subsys.subsys_id; -#endif - - ret = register_tcf_proto_ops(&cls_cgroup_ops); + return ret; + ret = cgroup_load_subsys(&net_cls_subsys); if (ret) - cgroup_unload_subsys(&net_cls_subsys); - -out: + unregister_tcf_proto_ops(&cls_cgroup_ops); return ret; } static void __exit exit_cgroup_cls(void) { unregister_tcf_proto_ops(&cls_cgroup_ops); - -#ifndef CONFIG_NET_CLS_CGROUP - net_cls_subsys_id = -1; - synchronize_rcu(); -#endif - cgroup_unload_subsys(&net_cls_subsys); } |