All of lore.kernel.org
 help / color / mirror / Atom feed
From: Jarek Poplawski <jarkao2@o2.pl>
To: netdev@vger.kernel.org
Cc: Patrick McHardy <kaber@trash.net>, Martin Devera <devik@cdi.cz>
Subject: [PATCH][NET_SCHED] sch_htb: turn intermediate classes into leaves
Date: Mon, 27 Nov 2006 08:04:02 +0100	[thread overview]
Message-ID: <20061127070401.GA1886@ff.dom.local> (raw)

Here is a trial to do something suggested by Patrick McHardy. 

[NET_SCHED] sch_htb:

- turn intermediate classes into leaves again when their last child is deleted
  (qdisc of deleted class is reused; struct htb_class changed)
  
- sch_tree_lock added in htb_put before htb_destroy_class
  (for consistency with htb_delete and htb_destroy) - my own suggestion

PS: qdisc_reset added to htb_delete by P. McHardy's patch: "perform qlen
adjustment immediately in ->delete" should be reconsidered.


Signed-off-by: Jarek Poplawski <jarkao2@o2.pl>
---

diff -Nurp linux-2.6.19-rc6-/net/sched/sch_htb.c linux-2.6.19-rc6/net/sched/sch_htb.c
--- linux-2.6.19-rc6-/net/sched/sch_htb.c	2006-11-16 20:46:08.000000000 +0100
+++ linux-2.6.19-rc6/net/sched/sch_htb.c	2006-11-26 22:54:15.000000000 +0100
@@ -147,6 +147,10 @@ struct htb_class {
 	psched_tdiff_t mbuffer;	/* max wait time */
 	long tokens, ctokens;	/* current number of tokens */
 	psched_time_t t_c;	/* checkpoint time */
+	
+	int prio;		/* For parent to leaf return possible here */
+	int quantum;		/* we do backup. Finally full replacement  */
+				/* of un.leaf originals should be done. */
 };
 
 /* TODO: maybe compute rate when size is too large .. or drop ? */
@@ -1266,6 +1270,37 @@ static void htb_destroy_filters(struct t
 	}
 }
 
+static void htb_parent_to_leaf(struct htb_sched *q, struct htb_class *cl)
+{
+	struct htb_class *parent = cl->parent;
+
+	if (!parent)
+		/* the root class */
+		return;
+
+	BUG_TRAP(!cl->level && cl->un.leaf.q && !cl->prio_activity);
+
+	if (!(parent->children.next == &cl->sibling &&
+		parent->children.prev == &cl->sibling))
+		/* not the last child */
+		return;	
+
+	parent->level = 0;
+	memset(&parent->un.inner, 0, sizeof(parent->un.inner));
+	INIT_LIST_HEAD(&parent->un.leaf.drop_list);
+	parent->un.leaf.q = cl->un.leaf.q;
+	cl->un.leaf.q = &noop_qdisc;
+	parent->un.leaf.quantum = parent->quantum;
+	parent->un.leaf.prio = parent->prio;
+	parent->tokens = parent->buffer;
+	parent->ctokens = parent->cbuffer;
+	PSCHED_GET_TIME(parent->t_c);
+	parent->cmode = HTB_CAN_SEND;
+
+	if (parent->un.leaf.q->q.qlen)
+		htb_activate(q, parent);
+}
+
 static void htb_destroy_class(struct Qdisc *sch, struct htb_class *cl)
 {
 	struct htb_sched *q = qdisc_priv(sch);
@@ -1337,6 +1372,9 @@ static int htb_delete(struct Qdisc *sch,
 	if (cl->prio_activity)
 		htb_deactivate(q, cl);
 
+	if (!cl->level)
+		htb_parent_to_leaf(q, cl);
+		
 	if (--cl->refcnt == 0)
 		htb_destroy_class(sch, cl);
 
@@ -1348,8 +1386,11 @@ static void htb_put(struct Qdisc *sch, u
 {
 	struct htb_class *cl = (struct htb_class *)arg;
 
-	if (--cl->refcnt == 0)
+	if (--cl->refcnt == 0) {
+		sch_tree_lock(sch);
 		htb_destroy_class(sch, cl);
+		sch_tree_unlock(sch);
+	}
 }
 
 static int htb_change_class(struct Qdisc *sch, u32 classid,
@@ -1468,6 +1509,10 @@ static int htb_change_class(struct Qdisc
 			cl->un.leaf.quantum = hopt->quantum;
 		if ((cl->un.leaf.prio = hopt->prio) >= TC_HTB_NUMPRIO)
 			cl->un.leaf.prio = TC_HTB_NUMPRIO - 1;
+
+		/* backup for htb_parent_to_leaf */
+		cl->quantum = cl->un.leaf.quantum;
+		cl->prio = cl->un.leaf.prio;
 	}
 
 	cl->buffer = hopt->buffer;

             reply	other threads:[~2006-11-27  6:57 UTC|newest]

Thread overview: 8+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2006-11-27  7:04 Jarek Poplawski [this message]
2006-11-27 10:12 ` [PATCH][NET_SCHED] sch_htb: turn intermediate classes into leaves Patrick McHardy
2006-11-27 11:38   ` Jarek Poplawski
2006-11-28  6:39   ` Jarek Poplawski
2006-11-30 12:26     ` Patrick McHardy
2006-11-30 12:50       ` Jarek Poplawski
2006-11-30 13:12         ` Patrick McHardy
2006-12-08  8:27           ` David Miller

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20061127070401.GA1886@ff.dom.local \
    --to=jarkao2@o2.pl \
    --cc=devik@cdi.cz \
    --cc=kaber@trash.net \
    --cc=netdev@vger.kernel.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.