OSDN Git Service

net: sched: prio: delay destroying child qdiscs on change
authorJakub Kicinski <jakub.kicinski@netronome.com>
Thu, 8 Nov 2018 01:33:40 +0000 (17:33 -0800)
committerDavid S. Miller <davem@davemloft.net>
Fri, 9 Nov 2018 00:19:48 +0000 (16:19 -0800)
Move destroying of the old child qdiscs outside of the sch_tree_lock()
section.  This should improve the software qdisc replace but is even
more important for offloads.  Calling offloads under a spin lock is
best avoided, and child's destroy would be called under sch_tree_lock().

Signed-off-by: Jakub Kicinski <jakub.kicinski@netronome.com>
Reviewed-by: John Hurley <john.hurley@netronome.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
net/sched/sch_prio.c

index 63a90c5..cdf6870 100644 (file)
@@ -220,7 +220,6 @@ static int prio_tune(struct Qdisc *sch, struct nlattr *opt,
 
                qdisc_tree_reduce_backlog(child, child->q.qlen,
                                          child->qstats.backlog);
-               qdisc_put(child);
        }
 
        for (i = oldbands; i < q->bands; i++) {
@@ -230,6 +229,9 @@ static int prio_tune(struct Qdisc *sch, struct nlattr *opt,
        }
 
        sch_tree_unlock(sch);
+
+       for (i = q->bands; i < oldbands; i++)
+               qdisc_put(q->queues[i]);
        return 0;
 }