Merge tag 'please-pull-pstore' of git://git.kernel.org/pub/scm/linux/kernel/git/aegl...
[firefly-linux-kernel-4.4.55.git] / net / sched / sch_dsmark.c
index 49d6ef338b558ee338163826b1a8a8966093637b..227114f27f9408b6010c9c537236ce9f7cb484d9 100644 (file)
@@ -37,7 +37,7 @@
 
 struct dsmark_qdisc_data {
        struct Qdisc            *q;
-       struct tcf_proto        *filter_list;
+       struct tcf_proto __rcu  *filter_list;
        u8                      *mask;  /* "owns" the array */
        u8                      *value;
        u16                     indices;
@@ -186,8 +186,8 @@ ignore:
        }
 }
 
-static inline struct tcf_proto **dsmark_find_tcf(struct Qdisc *sch,
-                                                unsigned long cl)
+static inline struct tcf_proto __rcu **dsmark_find_tcf(struct Qdisc *sch,
+                                                      unsigned long cl)
 {
        struct dsmark_qdisc_data *p = qdisc_priv(sch);
        return &p->filter_list;
@@ -229,7 +229,8 @@ static int dsmark_enqueue(struct sk_buff *skb, struct Qdisc *sch)
                skb->tc_index = TC_H_MIN(skb->priority);
        else {
                struct tcf_result res;
-               int result = tc_classify(skb, p->filter_list, &res);
+               struct tcf_proto *fl = rcu_dereference_bh(p->filter_list);
+               int result = tc_classify(skb, fl, &res);
 
                pr_debug("result %d class 0x%04x\n", result, res.classid);
 
@@ -257,7 +258,7 @@ static int dsmark_enqueue(struct sk_buff *skb, struct Qdisc *sch)
        err = qdisc_enqueue(skb, p->q);
        if (err != NET_XMIT_SUCCESS) {
                if (net_xmit_drop_count(err))
-                       sch->qstats.drops++;
+                       qdisc_qstats_drop(sch);
                return err;
        }