[PATCH] sch_red: fix weighted average calculation

Subsystems: networking [general], the rest

STALE5102d

4 messages, 3 authors, 2012-09-14 · open the first message on its own page

[PATCH] sch_red: fix weighted average calculation

From: Cyril Chemparathy <hidden>
Date: 2012-09-13 13:43:56

This patch fixes an apparent bug in the running weighted average calculation
used in the RED algorithm.

Going by the described formula:
	   qavg = qavg*(1-W) + backlog*W
	=> qavg = qavg + (backlog - qavg) * W

... with W converted to a pre-calculated shift, this then becomes:
	qavg = qavg + (backlog - qavg) >> logW

... giving the modified expression introduced by this patch.

Signed-off-by: John Dowdal <redacted>
---
 include/net/red.h |    2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/include/net/red.h b/include/net/red.h
index ef46058..05960a4 100644
--- a/include/net/red.h
+++ b/include/net/red.h
@@ -287,7 +287,7 @@ static inline unsigned long red_calc_qavg_no_idle_time(const struct red_parms *p
 	 *
 	 * --ANK (980924)
 	 */
-	return v->qavg + (backlog - (v->qavg >> p->Wlog));
+	return v->qavg + (backlog - v->qavg) >> p->Wlog;
 }
 
 static inline unsigned long red_calc_qavg(const struct red_parms *p,
-- 
1.7.9.5

Re: [PATCH] sch_red: fix weighted average calculation

From: Eric Dumazet <hidden>
Date: 2012-09-13 13:54:00

On Thu, 2012-09-13 at 09:43 -0400, Cyril Chemparathy wrote:
quoted hunk
This patch fixes an apparent bug in the running weighted average calculation
used in the RED algorithm.

Going by the described formula:
	   qavg = qavg*(1-W) + backlog*W
	=> qavg = qavg + (backlog - qavg) * W

... with W converted to a pre-calculated shift, this then becomes:
	qavg = qavg + (backlog - qavg) >> logW

... giving the modified expression introduced by this patch.

Signed-off-by: John Dowdal <redacted>
---
 include/net/red.h |    2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/include/net/red.h b/include/net/red.h
index ef46058..05960a4 100644
--- a/include/net/red.h
+++ b/include/net/red.h
@@ -287,7 +287,7 @@ static inline unsigned long red_calc_qavg_no_idle_time(const struct red_parms *p
 	 *
 	 * --ANK (980924)
 	 */
-	return v->qavg + (backlog - (v->qavg >> p->Wlog));
+	return v->qavg + (backlog - v->qavg) >> p->Wlog;
 }
 
 static inline unsigned long red_calc_qavg(const struct red_parms *p,
This is going to be a FPP (Frequently Posted Patch)

Current formulae is fine.

Thats because backlog, at start of red_calc_qavg_no_idle_time() is not
yet scaled by p->Wlog. v->avg is scaled, but not backlog.

Have you tested RED after your patch ?

RE: [PATCH] sch_red: fix weighted average calculation

From: Dowdal, John <hidden>
Date: 2012-09-14 13:01:23

Eric, thank you for reviewing the code.  I now see the problem with the patch since backlog is an integer and qavg is a fixed point number at logW.  

We are considering another patch to update the comments to this code (with the actual C code change reverted) to stop the FPP by showing the derivation of the equation in the comments.  Does this sound good?


-----Original Message-----
From: Eric Dumazet [mailto:eric.dumazet@gmail.com] 
Sent: Thursday, September 13, 2012 9:54 AM
To: Chemparathy, Cyril
Cc: linux-kernel@vger.kernel.org; netdev@vger.kernel.org; davem@davemloft.net; david.ward@ll.mit.edu; Dowdal, John; paul.gortmaker@windriver.com
Subject: Re: [PATCH] sch_red: fix weighted average calculation

On Thu, 2012-09-13 at 09:43 -0400, Cyril Chemparathy wrote:
quoted hunk
This patch fixes an apparent bug in the running weighted average calculation
used in the RED algorithm.

Going by the described formula:
	   qavg = qavg*(1-W) + backlog*W
	=> qavg = qavg + (backlog - qavg) * W

... with W converted to a pre-calculated shift, this then becomes:
	qavg = qavg + (backlog - qavg) >> logW

... giving the modified expression introduced by this patch.

Signed-off-by: John Dowdal <redacted>
---
 include/net/red.h |    2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/include/net/red.h b/include/net/red.h
index ef46058..05960a4 100644
--- a/include/net/red.h
+++ b/include/net/red.h
@@ -287,7 +287,7 @@ static inline unsigned long red_calc_qavg_no_idle_time(const struct red_parms *p
 	 *
 	 * --ANK (980924)
 	 */
-	return v->qavg + (backlog - (v->qavg >> p->Wlog));
+	return v->qavg + (backlog - v->qavg) >> p->Wlog;
 }
 
 static inline unsigned long red_calc_qavg(const struct red_parms *p,
This is going to be a FPP (Frequently Posted Patch)

Current formulae is fine.

Thats because backlog, at start of red_calc_qavg_no_idle_time() is not
yet scaled by p->Wlog. v->avg is scaled, but not backlog.

Have you tested RED after your patch ?

RE: [PATCH] sch_red: fix weighted average calculation

From: Eric Dumazet <hidden>
Date: 2012-09-14 13:13:26

On Fri, 2012-09-14 at 13:01 +0000, Dowdal, John wrote:
Eric, thank you for reviewing the code.  I now see the problem with
the patch since backlog is an integer and qavg is a fixed point number
at logW.  

We are considering another patch to update the comments to this code
(with the actual C code change reverted) to stop the FPP by showing
the derivation of the equation in the comments.  Does this sound good?
This would be good, please do so.

Thanks
Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help