[<prev] [next>] [<thread-prev] [thread-next>] [day] [month] [year] [list]
Message-ID: <20160823202544.14368.44444.stgit@john-Precision-Tower-5810>
Date: Tue, 23 Aug 2016 13:25:44 -0700
From: John Fastabend <john.fastabend@...il.com>
To: eric.dumazet@...il.com, jhs@...atatu.com, davem@...emloft.net,
brouer@...hat.com, xiyou.wangcong@...il.com,
alexei.starovoitov@...il.com
Cc: john.r.fastabend@...el.com, netdev@...r.kernel.org,
john.fastabend@...il.com
Subject: [net-next PATCH 07/15] net: sched: drop qdisc_reset from
dev_graft_qdisc
In qdisc_graft_qdisc a "new" qdisc is attached and the 'qdisc_destroy'
operation is called on the old qdisc. The destroy operation will wait
a rcu grace period and call qdisc_rcu_free(). At which point
gso_cpu_skb is free'd along with all stats so no need to zero stats
and gso_cpu_skb from the graft operation itself.
Further after dropping the qdisc locks we can not continue to call
qdisc_reset before waiting an rcu grace period so that the qdisc is
detached from all cpus. By removing the qdisc_reset() here we get
the correct property of waiting an rcu grace period and letting the
qdisc_destroy operation clean up the qdisc correctly.
Note, a refcnt greater than 1 would cause the destroy operation to
be aborted however if this ever happened the reference to the qdisc
would be lost and we would have a memory leak.
Signed-off-by: John Fastabend <john.r.fastabend@...el.com>
---
net/sched/sch_generic.c | 4 ----
1 file changed, 4 deletions(-)
diff --git a/net/sched/sch_generic.c b/net/sched/sch_generic.c
index c8e69a8..112d029 100644
--- a/net/sched/sch_generic.c
+++ b/net/sched/sch_generic.c
@@ -813,10 +813,6 @@ struct Qdisc *dev_graft_qdisc(struct netdev_queue *dev_queue,
root_lock = qdisc_lock(oqdisc);
spin_lock_bh(root_lock);
- /* Prune old scheduler */
- if (oqdisc && atomic_read(&oqdisc->refcnt) <= 1)
- qdisc_reset(oqdisc);
-
/* ... and graft new one */
if (qdisc == NULL)
qdisc = &noop_qdisc;
Powered by blists - more mailing lists