From: Jiri Pirko <j...@mellanox.com>

In sch_handle_egress and sch_handle_ingress, don't use tp->q and use
dev->ingress_queue which stores the same pointer instead.

Signed-off-by: Jiri Pirko <j...@mellanox.com>
---
 net/core/dev.c | 21 +++++++++++++++------
 1 file changed, 15 insertions(+), 6 deletions(-)

diff --git a/net/core/dev.c b/net/core/dev.c
index fcddccb..cb9e5e5 100644
--- a/net/core/dev.c
+++ b/net/core/dev.c
@@ -3273,14 +3273,18 @@ EXPORT_SYMBOL(dev_loopback_xmit);
 static struct sk_buff *
 sch_handle_egress(struct sk_buff *skb, int *ret, struct net_device *dev)
 {
+       struct netdev_queue *netdev_queue =
+                               rcu_dereference_bh(dev->ingress_queue);
        struct tcf_proto *cl = rcu_dereference_bh(dev->egress_cl_list);
        struct tcf_result cl_res;
+       struct Qdisc *q;
 
-       if (!cl)
+       if (!cl || !netdev_queue)
                return skb;
+       q = netdev_queue->qdisc;
 
        /* qdisc_skb_cb(skb)->pkt_len was already set by the caller. */
-       qdisc_bstats_cpu_update(cl->q, skb);
+       qdisc_bstats_cpu_update(q, skb);
 
        switch (tcf_classify(skb, cl, &cl_res, false)) {
        case TC_ACT_OK:
@@ -3288,7 +3292,7 @@ sch_handle_egress(struct sk_buff *skb, int *ret, struct 
net_device *dev)
                skb->tc_index = TC_H_MIN(cl_res.classid);
                break;
        case TC_ACT_SHOT:
-               qdisc_qstats_cpu_drop(cl->q);
+               qdisc_qstats_cpu_drop(q);
                *ret = NET_XMIT_DROP;
                kfree_skb(skb);
                return NULL;
@@ -4188,16 +4192,21 @@ sch_handle_ingress(struct sk_buff *skb, struct 
packet_type **pt_prev, int *ret,
                   struct net_device *orig_dev)
 {
 #ifdef CONFIG_NET_CLS_ACT
+       struct netdev_queue *netdev_queue =
+                               rcu_dereference_bh(skb->dev->ingress_queue);
        struct tcf_proto *cl = rcu_dereference_bh(skb->dev->ingress_cl_list);
        struct tcf_result cl_res;
+       struct Qdisc *q;
 
        /* If there's at least one ingress present somewhere (so
         * we get here via enabled static key), remaining devices
         * that are not configured with an ingress qdisc will bail
         * out here.
         */
-       if (!cl)
+       if (!cl || !netdev_queue)
                return skb;
+       q = netdev_queue->qdisc;
+
        if (*pt_prev) {
                *ret = deliver_skb(skb, *pt_prev, orig_dev);
                *pt_prev = NULL;
@@ -4205,7 +4214,7 @@ sch_handle_ingress(struct sk_buff *skb, struct 
packet_type **pt_prev, int *ret,
 
        qdisc_skb_cb(skb)->pkt_len = skb->len;
        skb->tc_at_ingress = 1;
-       qdisc_bstats_cpu_update(cl->q, skb);
+       qdisc_bstats_cpu_update(q, skb);
 
        switch (tcf_classify(skb, cl, &cl_res, false)) {
        case TC_ACT_OK:
@@ -4213,7 +4222,7 @@ sch_handle_ingress(struct sk_buff *skb, struct 
packet_type **pt_prev, int *ret,
                skb->tc_index = TC_H_MIN(cl_res.classid);
                break;
        case TC_ACT_SHOT:
-               qdisc_qstats_cpu_drop(cl->q);
+               qdisc_qstats_cpu_drop(q);
                kfree_skb(skb);
                return NULL;
        case TC_ACT_STOLEN:
-- 
2.9.5

Reply via email to