diff options
Diffstat (limited to 'net/sched/sch_multiq.c')
-rw-r--r-- | net/sched/sch_multiq.c | 8 |
1 files changed, 5 insertions, 3 deletions
diff --git a/net/sched/sch_multiq.c b/net/sched/sch_multiq.c index afb050a735fa..c0466c1840f3 100644 --- a/net/sched/sch_multiq.c +++ b/net/sched/sch_multiq.c | |||
@@ -31,7 +31,7 @@ struct multiq_sched_data { | |||
31 | u16 bands; | 31 | u16 bands; |
32 | u16 max_bands; | 32 | u16 max_bands; |
33 | u16 curband; | 33 | u16 curband; |
34 | struct tcf_proto *filter_list; | 34 | struct tcf_proto __rcu *filter_list; |
35 | struct Qdisc **queues; | 35 | struct Qdisc **queues; |
36 | }; | 36 | }; |
37 | 37 | ||
@@ -42,10 +42,11 @@ multiq_classify(struct sk_buff *skb, struct Qdisc *sch, int *qerr) | |||
42 | struct multiq_sched_data *q = qdisc_priv(sch); | 42 | struct multiq_sched_data *q = qdisc_priv(sch); |
43 | u32 band; | 43 | u32 band; |
44 | struct tcf_result res; | 44 | struct tcf_result res; |
45 | struct tcf_proto *fl = rcu_dereference_bh(q->filter_list); | ||
45 | int err; | 46 | int err; |
46 | 47 | ||
47 | *qerr = NET_XMIT_SUCCESS | __NET_XMIT_BYPASS; | 48 | *qerr = NET_XMIT_SUCCESS | __NET_XMIT_BYPASS; |
48 | err = tc_classify(skb, q->filter_list, &res); | 49 | err = tc_classify(skb, fl, &res); |
49 | #ifdef CONFIG_NET_CLS_ACT | 50 | #ifdef CONFIG_NET_CLS_ACT |
50 | switch (err) { | 51 | switch (err) { |
51 | case TC_ACT_STOLEN: | 52 | case TC_ACT_STOLEN: |
@@ -388,7 +389,8 @@ static void multiq_walk(struct Qdisc *sch, struct qdisc_walker *arg) | |||
388 | } | 389 | } |
389 | } | 390 | } |
390 | 391 | ||
391 | static struct tcf_proto **multiq_find_tcf(struct Qdisc *sch, unsigned long cl) | 392 | static struct tcf_proto __rcu **multiq_find_tcf(struct Qdisc *sch, |
393 | unsigned long cl) | ||
392 | { | 394 | { |
393 | struct multiq_sched_data *q = qdisc_priv(sch); | 395 | struct multiq_sched_data *q = qdisc_priv(sch); |
394 | 396 | ||