netdev.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* [PATCH] [RESEND] iproute2 : invalid burst/cburst calculation with hrtimers
@ 2009-02-02 17:26 Denys Fedoryschenko
  2009-02-02 18:07 ` Stephen Hemminger
  0 siblings, 1 reply; 13+ messages in thread
From: Denys Fedoryschenko @ 2009-02-02 17:26 UTC (permalink / raw)
  To: Stephen Hemminger; +Cc: netdev

[-- Attachment #1: Type: text/plain, Size: 707 bytes --]

------------->
iproute2 : invalid burst/cburst calculation with hrtimers

If hrtimers on, /proc/net/psched shows 4th variable 
as 1000000000
Because burst calculated by division rate to this variable, 
it will be almost always zero. As result, we will get higher system 
load on low rates, and on high rates shaper will not able to process 
data. So it is kind of critical bugfix for systems with hrtimers.
It is checked and proved. Core 2 Quad was not able to 
shape 200Mbps, and gave only 180-190. It is more safe to set it 
to 1000HZ. If user wants, he can set custom "env" HZ variable.

Signed-off-by: Denys Fedoryschenko <denys@visp.net.lb>
---

-------------------------------------------------------

[-- Attachment #2: iproute2-htb-gethz-invalid.patch --]
[-- Type: text/x-diff, Size: 1261 bytes --]

diff -Naur iproute2/tc/q_htb.c iproute2-new/tc/q_htb.c
--- iproute2/tc/q_htb.c	2009-01-22 11:10:36.000000000 +0200
+++ iproute2-new/tc/q_htb.c	2009-01-22 11:31:40.000000000 +0200
@@ -110,6 +110,7 @@
 	unsigned mtu;
 	unsigned short mpu = 0;
 	unsigned short overhead = 0;
+	unsigned int bursthz;
 	unsigned int linklayer  = LINKLAYER_ETHERNET; /* Assume ethernet */
 	struct rtattr *tail;
 
@@ -209,9 +210,16 @@
 	if (!opt.ceil.rate) opt.ceil = opt.rate;
 
 	/* compute minimal allowed burst from rate; mtu is added here to make
-	   sute that buffer is larger than mtu and to have some safeguard space */
-	if (!buffer) buffer = opt.rate.rate / get_hz() + mtu;
-	if (!cbuffer) cbuffer = opt.ceil.rate / get_hz() + mtu;
+	   sure that buffer is larger than mtu and to have some safeguard space 
+	   With hrtimers enabled, hz variable gets too high resolution. If we
+	   use it for computing burst, burst will be too low. In worst case 
+	   we will not reach specified rate/ceil, in best - load will be too 
+	   high.
+	*/
+	bursthz = get_hz() == 1000000000 ? 1000 : get_hz();	
+
+	if (!buffer) buffer = opt.rate.rate / bursthz + mtu;
+	if (!cbuffer) cbuffer = opt.ceil.rate / bursthz + mtu;
 
 	opt.ceil.overhead = overhead;
 	opt.rate.overhead = overhead;

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

end of thread, other threads:[~2009-02-05 11:56 UTC | newest]

Thread overview: 13+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2009-02-02 17:26 [PATCH] [RESEND] iproute2 : invalid burst/cburst calculation with hrtimers Denys Fedoryschenko
2009-02-02 18:07 ` Stephen Hemminger
2009-02-02 18:21   ` Denys Fedoryschenko
2009-02-04 21:20     ` Jarek Poplawski
2009-02-04 21:53       ` Jarek Poplawski
2009-02-04 22:26         ` Denys Fedoryschenko
2009-02-04 22:49           ` Jarek Poplawski
2009-02-04 23:24             ` Denys Fedoryschenko
2009-02-05  7:38               ` Jarek Poplawski
2009-02-05  9:01                 ` Denys Fedoryschenko
2009-02-05 10:08                   ` Jarek Poplawski
2009-02-05 11:09                     ` Denys Fedoryschenko
2009-02-05 11:56                       ` Jarek Poplawski

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).