From: Jakub Kicinski Date: Thu, 8 Nov 2018 01:33:40 +0000 (-0800) Subject: net: sched: prio: delay destroying child qdiscs on change X-Git-Url: http://git.maquefel.me/?a=commitdiff_plain;h=7b8e0b6e659983154c8d7e756cdb833d89a3d4d7;p=linux.git net: sched: prio: delay destroying child qdiscs on change 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 Reviewed-by: John Hurley Signed-off-by: David S. Miller --- diff --git a/net/sched/sch_prio.c b/net/sched/sch_prio.c index 63a90c5055ee4..cdf68706e40fe 100644 --- a/net/sched/sch_prio.c +++ b/net/sched/sch_prio.c @@ -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; }