Subject: Re: [PATCH] net/sched/sch_hfsc.c: initialize parent's cl_cfmin properly in init_vf()

From: Patrick McHardy <[email-masked]>
Date: Wed, 15 Sep 2010 19:54:49 +0200

Am 01.09.2010 23:30, schrieb David Miller:
> From: Michal Soltys <[email-masked]>
> Date: Mon, 30 Aug 2010 23:34:10 +0200
> 
>> This patch fixes init_vf() function, so on each new backlog period parent's
>> cl_cfmin is properly updated (including further propgation towards the root),
>> even if the activated leaf has no upperlimit curve defined.
>>
>> Signed-off-by: Michal Soltys <[email-masked]>
> 
> Applied, thanks.

For the record, the patch seems fine to me. The root cause seems to be
an optimization I introduced (pre-git, even history.git unfortunately)
in vttree_get_minvt() that wasn't present in the original version:

static struct hfsc_class *
vttree_get_minvt(struct hfsc_class *cl, u64 cur_time)
{
        /* if root-class's cfmin is bigger than cur_time nothing to do */
        if (cl->cl_cfmin > cur_time)
                return NULL;

I'd prefer to remove this check since it's obviously not correct and
might cause other problems. Michal, could you please test whether this
patch fixes the problem as well? Thanks!
diff --git a/net/sched/sch_hfsc.c b/net/sched/sch_hfsc.c
index 4749609..466518e 100644
--- a/net/sched/sch_hfsc.c
+++ b/net/sched/sch_hfsc.c
@@ -312,10 +312,6 @@ vttree_firstfit(struct hfsc_class *cl, u64 cur_time)
 static struct hfsc_class *
 vttree_get_minvt(struct hfsc_class *cl, u64 cur_time)
 {
-	/* if root-class's cfmin is bigger than cur_time nothing to do */
-	if (cl->cl_cfmin > cur_time)
-		return NULL;
-
 	while (cl->level > 0) {
 		cl = vttree_firstfit(cl, cur_time);
 		if (cl == NULL)