File tree Expand file tree Collapse file tree 1 file changed +18
-4
lines changed Expand file tree Collapse file tree 1 file changed +18
-4
lines changed Original file line number Diff line number Diff line change @@ -23,7 +23,10 @@ struct cls_cgroup_head {
23
23
struct tcf_exts exts ;
24
24
struct tcf_ematch_tree ematches ;
25
25
struct tcf_proto * tp ;
26
- struct rcu_head rcu ;
26
+ union {
27
+ struct work_struct work ;
28
+ struct rcu_head rcu ;
29
+ };
27
30
};
28
31
29
32
static int cls_cgroup_classify (struct sk_buff * skb , const struct tcf_proto * tp ,
@@ -57,15 +60,26 @@ static const struct nla_policy cgroup_policy[TCA_CGROUP_MAX + 1] = {
57
60
[TCA_CGROUP_EMATCHES ] = { .type = NLA_NESTED },
58
61
};
59
62
63
+ static void cls_cgroup_destroy_work (struct work_struct * work )
64
+ {
65
+ struct cls_cgroup_head * head = container_of (work ,
66
+ struct cls_cgroup_head ,
67
+ work );
68
+ rtnl_lock ();
69
+ tcf_exts_destroy (& head -> exts );
70
+ tcf_em_tree_destroy (& head -> ematches );
71
+ kfree (head );
72
+ rtnl_unlock ();
73
+ }
74
+
60
75
static void cls_cgroup_destroy_rcu (struct rcu_head * root )
61
76
{
62
77
struct cls_cgroup_head * head = container_of (root ,
63
78
struct cls_cgroup_head ,
64
79
rcu );
65
80
66
- tcf_exts_destroy (& head -> exts );
67
- tcf_em_tree_destroy (& head -> ematches );
68
- kfree (head );
81
+ INIT_WORK (& head -> work , cls_cgroup_destroy_work );
82
+ tcf_queue_work (& head -> work );
69
83
}
70
84
71
85
static int cls_cgroup_change (struct net * net , struct sk_buff * in_skb ,
You can’t perform that action at this time.
0 commit comments