netdev.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* [PATCH 20/31]: pkt_sched: Perform bulk of qdisc destruction in RCU.
@ 2008-07-17 12:17 David Miller
       [not found] ` <20080717.051726.226040470.davem-fT/PcQaiUtIeIZ0/mPfg9Q@public.gmane.org>
  0 siblings, 1 reply; 58+ messages in thread
From: David Miller @ 2008-07-17 12:17 UTC (permalink / raw)
  To: netdev-u79uwXL29TY76Z2rM5mHXA
  Cc: kaber-dcUjhNyLwpNeoWH0uzbU5w, johannes-cdvu00un1VgdHxzADdlk8Q,
	linux-wireless-u79uwXL29TY76Z2rM5mHXA


This allows less strict control of access to the qdisc attached to a
netdev_queue.  It is even allowed to enqueue into a qdisc which is
in the process of being destroyed.  The RCU handler will toss out
those packets.

We will need this to handle sharing of a qdisc amongst multiple
TX queues.  In such a setup the lock has to be shared, so will
be inside of the qdisc itself.  At which point the netdev_queue
lock cannot be used to hard synchronize access to the ->qdisc
pointer.

One operation we have to keep inside of qdisc_destroy() is the list
deletion.  It is the only piece of state visible after the RCU quiesce
period, so we have to undo it early and under the appropriate locking.

The operations in the RCU handler do not need any looking because the
qdisc tree is no longer visible to anything at that point.

Signed-off-by: David S. Miller <davem-fT/PcQaiUtIeIZ0/mPfg9Q@public.gmane.org>
---
 net/sched/sch_generic.c |   20 +++++++++++---------
 1 files changed, 11 insertions(+), 9 deletions(-)

diff --git a/net/sched/sch_generic.c b/net/sched/sch_generic.c
index 7e078c5..082db8a 100644
--- a/net/sched/sch_generic.c
+++ b/net/sched/sch_generic.c
@@ -545,6 +545,17 @@ EXPORT_SYMBOL(qdisc_reset);
 static void __qdisc_destroy(struct rcu_head *head)
 {
 	struct Qdisc *qdisc = container_of(head, struct Qdisc, q_rcu);
+	const struct Qdisc_ops  *ops = qdisc->ops;
+
+	gen_kill_estimator(&qdisc->bstats, &qdisc->rate_est);
+	if (ops->reset)
+		ops->reset(qdisc);
+	if (ops->destroy)
+		ops->destroy(qdisc);
+
+	module_put(ops->owner);
+	dev_put(qdisc_dev(qdisc));
+
 	kfree((char *) qdisc - qdisc->padded);
 }
 
@@ -552,21 +563,12 @@ static void __qdisc_destroy(struct rcu_head *head)
 
 void qdisc_destroy(struct Qdisc *qdisc)
 {
-	const struct Qdisc_ops  *ops = qdisc->ops;

^ permalink raw reply related	[flat|nested] 58+ messages in thread

end of thread, other threads:[~2008-08-22 13:52 UTC | newest]

Thread overview: 58+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2008-07-17 12:17 [PATCH 20/31]: pkt_sched: Perform bulk of qdisc destruction in RCU David Miller
     [not found] ` <20080717.051726.226040470.davem-fT/PcQaiUtIeIZ0/mPfg9Q@public.gmane.org>
2008-07-17 13:03   ` Patrick McHardy
     [not found]     ` <487F4327.1000107-dcUjhNyLwpNeoWH0uzbU5w@public.gmane.org>
2008-07-17 13:12       ` David Miller
2008-07-17 13:48         ` Patrick McHardy
     [not found]           ` <487F4DA6.6010009-dcUjhNyLwpNeoWH0uzbU5w@public.gmane.org>
2008-07-17 22:36             ` David Miller
     [not found]               ` <20080717.153609.142867331.davem-fT/PcQaiUtIeIZ0/mPfg9Q@public.gmane.org>
2008-07-17 23:58                 ` Patrick McHardy
2008-07-17 13:35       ` jamal
2008-07-17 14:02         ` Patrick McHardy
     [not found]           ` <487F50EC.80008-dcUjhNyLwpNeoWH0uzbU5w@public.gmane.org>
2008-07-17 22:24             ` David Miller
     [not found]               ` <20080717.152447.89672084.davem-fT/PcQaiUtIeIZ0/mPfg9Q@public.gmane.org>
2008-07-17 23:48                 ` Patrick McHardy
2008-07-18 13:10                   ` jamal
2008-07-18 13:27                     ` jamal
2008-07-18 21:05                       ` David Miller
2008-07-20 15:16                         ` jamal
2008-07-20 17:25                           ` David Miller
     [not found]                             ` <20080720.102534.246150854.davem-fT/PcQaiUtIeIZ0/mPfg9Q@public.gmane.org>
2008-07-20 17:34                               ` Tomas Winkler
     [not found]                                 ` <1ba2fa240807201034u1fbe3343tdcc858f7772d2b39-JsoAwUIsXosN+BqQ9rBEUg@public.gmane.org>
2008-07-20 17:35                                   ` David Miller
2008-07-20 22:32                               ` jamal
2008-07-20 23:59                                 ` David Miller
2008-07-21  2:20                                   ` jamal
2008-07-21 11:20                                     ` jamal
2008-07-21 16:45                                       ` David Miller
2008-07-21 11:58                                     ` Herbert Xu
     [not found]                                       ` <E1KKu2D-0002kd-00-XQvu0L+U/CjiRBuR/1fSEKKkPtS2pBon@public.gmane.org>
2008-07-21 13:08                                         ` jamal
2008-07-21 13:19                                           ` Herbert Xu
2008-07-21 13:56                                             ` jamal
2008-07-21 13:58                                               ` Herbert Xu
     [not found]                                                 ` <20080721135846.GA11543-lOAM2aK0SrRLBo1qDEOMRrpzq4S04n8Q@public.gmane.org>
2008-07-21 15:09                                                   ` David Miller
     [not found]                                                     ` <20080721.080901.214889979.davem-fT/PcQaiUtIeIZ0/mPfg9Q@public.gmane.org>
2008-07-21 15:22                                                       ` Herbert Xu
2008-07-21 15:26                                                         ` David Miller
     [not found]                                                           ` <20080721.082627.128593651.davem-fT/PcQaiUtIeIZ0/mPfg9Q@public.gmane.org>
2008-07-21 16:16                                                             ` Herbert Xu
     [not found]                                                               ` <20080721161616.GA12938-lOAM2aK0SrRLBo1qDEOMRrpzq4S04n8Q@public.gmane.org>
2008-07-21 16:25                                                                 ` David Miller
2008-07-21 16:43                                                                   ` Herbert Xu
2008-07-21 16:51                                                                     ` David Miller
     [not found]                                                                       ` <20080721.095124.89249903.davem-fT/PcQaiUtIeIZ0/mPfg9Q@public.gmane.org>
2008-07-21 17:02                                                                         ` Herbert Xu
     [not found]                                                                           ` <20080721170233.GA13417-lOAM2aK0SrRLBo1qDEOMRrpzq4S04n8Q@public.gmane.org>
2008-07-21 17:08                                                                             ` David Miller
     [not found]                                                                               ` <20080721.100821.38432201.davem-fT/PcQaiUtIeIZ0/mPfg9Q@public.gmane.org>
2008-07-21 17:11                                                                                 ` Herbert Xu
2008-08-22  6:56                                                                                   ` Herbert Xu
2008-08-22  7:16                                                                                     ` David Miller
     [not found]                                                                                       ` <20080822.001620.141235108.davem-fT/PcQaiUtIeIZ0/mPfg9Q@public.gmane.org>
2008-08-22  7:41                                                                                         ` Herbert Xu
     [not found]                                                                                           ` <20080822074115.GB25615-lOAM2aK0SrRLBo1qDEOMRrpzq4S04n8Q@public.gmane.org>
2008-08-22 10:42                                                                                             ` David Miller
     [not found]                                                                                               ` <20080822.034217.135152551.davem-fT/PcQaiUtIeIZ0/mPfg9Q@public.gmane.org>
2008-08-22 10:47                                                                                                 ` Herbert Xu
2008-08-22 13:52                                                                                                 ` jamal
     [not found]                                                                                     ` <20080822065655.GA18471-lOAM2aK0SrRLBo1qDEOMRrpzq4S04n8Q@public.gmane.org>
2008-08-22 13:43                                                                                       ` jamal
2008-07-21 17:35                                         ` David Miller
2008-07-18 17:10                     ` Roland Dreier
     [not found]                       ` <adaljzz6ruq.fsf-FYB4Gu1CFyUAvxtiuMwx3w@public.gmane.org>
2008-07-20 14:58                         ` jamal
2008-07-20 14:32               ` Herbert Xu
2008-07-20 17:20                 ` David Miller
2008-07-20 14:20         ` Herbert Xu
     [not found]           ` <E1KKZmE-0000ty-00-XQvu0L+U/CjiRBuR/1fSEKKkPtS2pBon@public.gmane.org>
2008-07-20 15:35             ` jamal
2008-07-21  0:11               ` Herbert Xu
     [not found]                 ` <20080721001119.GA6515-lOAM2aK0SrRLBo1qDEOMRrpzq4S04n8Q@public.gmane.org>
2008-07-21  2:33                   ` jamal
2008-07-21  3:17                     ` Herbert Xu
2008-07-21 11:14                       ` jamal
2008-07-21 11:36                         ` Herbert Xu
     [not found]                           ` <20080721113600.GA10322-lOAM2aK0SrRLBo1qDEOMRrpzq4S04n8Q@public.gmane.org>
2008-07-21 11:39                             ` jamal
2008-07-19  3:59     ` David Miller

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).