diff options
| -rw-r--r-- | include/net/tc_act/tc_sample.h | 1 | ||||
| -rw-r--r-- | net/sched/act_sample.c | 14 |
2 files changed, 3 insertions, 12 deletions
diff --git a/include/net/tc_act/tc_sample.h b/include/net/tc_act/tc_sample.h index 524cee4f4c81..01dbfea32672 100644 --- a/include/net/tc_act/tc_sample.h +++ b/include/net/tc_act/tc_sample.h | |||
| @@ -14,7 +14,6 @@ struct tcf_sample { | |||
| 14 | struct psample_group __rcu *psample_group; | 14 | struct psample_group __rcu *psample_group; |
| 15 | u32 psample_group_num; | 15 | u32 psample_group_num; |
| 16 | struct list_head tcfm_list; | 16 | struct list_head tcfm_list; |
| 17 | struct rcu_head rcu; | ||
| 18 | }; | 17 | }; |
| 19 | #define to_sample(a) ((struct tcf_sample *)a) | 18 | #define to_sample(a) ((struct tcf_sample *)a) |
| 20 | 19 | ||
diff --git a/net/sched/act_sample.c b/net/sched/act_sample.c index 8b5abcd2f32f..9438969290a6 100644 --- a/net/sched/act_sample.c +++ b/net/sched/act_sample.c | |||
| @@ -96,23 +96,16 @@ static int tcf_sample_init(struct net *net, struct nlattr *nla, | |||
| 96 | return ret; | 96 | return ret; |
| 97 | } | 97 | } |
| 98 | 98 | ||
| 99 | static void tcf_sample_cleanup_rcu(struct rcu_head *rcu) | 99 | static void tcf_sample_cleanup(struct tc_action *a, int bind) |
| 100 | { | 100 | { |
| 101 | struct tcf_sample *s = container_of(rcu, struct tcf_sample, rcu); | 101 | struct tcf_sample *s = to_sample(a); |
| 102 | struct psample_group *psample_group; | 102 | struct psample_group *psample_group; |
| 103 | 103 | ||
| 104 | psample_group = rcu_dereference_protected(s->psample_group, 1); | 104 | psample_group = rtnl_dereference(s->psample_group); |
| 105 | RCU_INIT_POINTER(s->psample_group, NULL); | 105 | RCU_INIT_POINTER(s->psample_group, NULL); |
| 106 | psample_group_put(psample_group); | 106 | psample_group_put(psample_group); |
| 107 | } | 107 | } |
| 108 | 108 | ||
| 109 | static void tcf_sample_cleanup(struct tc_action *a, int bind) | ||
| 110 | { | ||
| 111 | struct tcf_sample *s = to_sample(a); | ||
| 112 | |||
| 113 | call_rcu(&s->rcu, tcf_sample_cleanup_rcu); | ||
| 114 | } | ||
| 115 | |||
| 116 | static bool tcf_sample_dev_ok_push(struct net_device *dev) | 109 | static bool tcf_sample_dev_ok_push(struct net_device *dev) |
| 117 | { | 110 | { |
| 118 | switch (dev->type) { | 111 | switch (dev->type) { |
| @@ -264,7 +257,6 @@ static int __init sample_init_module(void) | |||
| 264 | 257 | ||
| 265 | static void __exit sample_cleanup_module(void) | 258 | static void __exit sample_cleanup_module(void) |
| 266 | { | 259 | { |
| 267 | rcu_barrier(); | ||
| 268 | tcf_unregister_action(&act_sample_ops, &sample_net_ops); | 260 | tcf_unregister_action(&act_sample_ops, &sample_net_ops); |
| 269 | } | 261 | } |
| 270 | 262 | ||
