net: sched: check for frozen queue before skb_bad_txq check
authorJohn Fastabend <john.fastabend@gmail.com>
Thu, 7 Dec 2017 17:56:42 +0000 (09:56 -0800)
committerDavid S. Miller <davem@davemloft.net>
Fri, 8 Dec 2017 18:32:26 +0000 (13:32 -0500)
I can not think of any reason to pull the bad txq skb off the qdisc if
the txq we plan to send this on is still frozen. So check for frozen
queue first and abort before dequeuing either skb_bad_txq skb or
normal qdisc dequeue() skb.

Signed-off-by: John Fastabend <john.fastabend@gmail.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
net/sched/sch_generic.c

index 84cef0570862bcf45d1fffcc9de53f283c2e4549..5ff93c2b5b993e0a0a7b4746a8c248e40c05e85c 100644 (file)
@@ -204,7 +204,7 @@ static struct sk_buff *dequeue_skb(struct Qdisc *q, bool *validate,
                                   int *packets)
 {
        const struct netdev_queue *txq = q->dev_queue;
-       struct sk_buff *skb;
+       struct sk_buff *skb = NULL;
 
        *packets = 1;
        if (unlikely(!skb_queue_empty(&q->gso_skb))) {
@@ -248,12 +248,15 @@ static struct sk_buff *dequeue_skb(struct Qdisc *q, bool *validate,
        }
 validate:
        *validate = true;
+
+       if ((q->flags & TCQ_F_ONETXQUEUE) &&
+           netif_xmit_frozen_or_stopped(txq))
+               return skb;
+
        skb = qdisc_dequeue_skb_bad_txq(q);
        if (unlikely(skb))
                goto bulk;
-       if (!(q->flags & TCQ_F_ONETXQUEUE) ||
-           !netif_xmit_frozen_or_stopped(txq))
-               skb = q->dequeue(q);
+       skb = q->dequeue(q);
        if (skb) {
 bulk:
                if (qdisc_may_bulk(q))