net_sched: make qdisc_reset() smaller
authorEric Dumazet <edumazet@google.com>
Thu, 14 Apr 2022 01:10:04 +0000 (18:10 -0700)
committerJakub Kicinski <kuba@kernel.org>
Fri, 15 Apr 2022 21:04:56 +0000 (14:04 -0700)
For some unknown reason qdisc_reset() is using
a convoluted way of freeing two lists of skbs.

Use __skb_queue_purge() instead.

Signed-off-by: Eric Dumazet <edumazet@google.com>
Acked-by: Jamal Hadi Salim <jhs@mojatatu.com>
Link: https://lore.kernel.org/r/20220414011004.2378350-1-eric.dumazet@gmail.com
Signed-off-by: Jakub Kicinski <kuba@kernel.org>
net/sched/sch_generic.c

index 5bab9f8..dba0b3e 100644 (file)
@@ -1019,22 +1019,14 @@ EXPORT_SYMBOL(qdisc_create_dflt);
 void qdisc_reset(struct Qdisc *qdisc)
 {
        const struct Qdisc_ops *ops = qdisc->ops;
-       struct sk_buff *skb, *tmp;
 
        trace_qdisc_reset(qdisc);
 
        if (ops->reset)
                ops->reset(qdisc);
 
-       skb_queue_walk_safe(&qdisc->gso_skb, skb, tmp) {
-               __skb_unlink(skb, &qdisc->gso_skb);
-               kfree_skb_list(skb);
-       }
-
-       skb_queue_walk_safe(&qdisc->skb_bad_txq, skb, tmp) {
-               __skb_unlink(skb, &qdisc->skb_bad_txq);
-               kfree_skb_list(skb);
-       }
+       __skb_queue_purge(&qdisc->gso_skb);
+       __skb_queue_purge(&qdisc->skb_bad_txq);
 
        qdisc->q.qlen = 0;
        qdisc->qstats.backlog = 0;