diff mbox series

[iproute2,v3] tc: Fix rounding in tc_calc_xmittime and tc_calc_xmitsize.

Message ID 952BE2E8-CE07-4D82-A47D-D181C229720A@8x8.com (mailing list archive)
State Changes Requested
Delegated to: David Ahern
Headers show
Series [iproute2,v3] tc: Fix rounding in tc_calc_xmittime and tc_calc_xmitsize. | expand

Checks

Context Check Description
netdev/tree_selection success Not a local patch

Commit Message

Jonathan Lennox Feb. 24, 2025, 6:42 p.m. UTC
Currently, tc_calc_xmittime and tc_calc_xmitsize round from double to
int three times — once when they call tc_core_time2tick /
tc_core_tick2time (whose argument is int), once when those functions
return (their return value is int), and then finally when the tc_calc_*
functions return.  This leads to extremely granular and inaccurate
conversions.

As a result, for example, on my test system (where tick_in_usec=15.625,
clock_factor=1, and hz=1000000000) for a bitrate of 1Gbps, all tc htb
burst values between 0 and 999 bytes get encoded as 0 ticks; all values
between 1000 and 1999 bytes get encoded as 15 ticks (equivalent to 960
bytes); all values between 2000 and 2999 bytes as 31 ticks (1984 bytes);
etc.

The patch changes the code so these calculations are done internally in
floating-point, and only rounded to integer values when the value is
returned. It also changes tc_calc_xmittime to round its calculated value
up, rather than down, to ensure that the calculated time is actually
sufficient for the requested size.

Signed-off-by: Jonathan Lennox <jonathan.lennox@8x8.com>
---
tc/tc_core.c | 6 +++---
tc/tc_core.h | 2 +-
2 files changed, 4 insertions(+), 4 deletions(-)

Comments

David Ahern Feb. 26, 2025, 4:06 p.m. UTC | #1
On 2/24/25 11:42 AM, Jonathan Lennox wrote:
> diff --git a/tc/tc_core.c b/tc/tc_core.c
> index 37547e9b..32fd094f 100644
> --- a/tc/tc_core.c
> +++ b/tc/tc_core.c
> @@ -23,12 +23,12 @@
> static double tick_in_usec = 1;
> static double clock_factor = 1;
> 
> -static unsigned int tc_core_time2tick(unsigned int time)
> +static double tc_core_time2tick(double time)
> {
> 	return time * tick_in_usec;
> }
> 
> -unsigned int tc_core_tick2time(unsigned int tick)
> +double tc_core_tick2time(double tick)
> {
> 	return tick / tick_in_usec;
> }
> @@ -45,7 +45,7 @@ unsigned int tc_core_ktime2time(unsigned int ktime)
> 
> unsigned int tc_calc_xmittime(__u64 rate, unsigned int size)
> {
> -	return tc_core_time2tick(TIME_UNITS_PER_SEC*((double)size/(double)rate));
> +	return ceil(tc_core_time2tick(TIME_UNITS_PER_SEC*((double)size/(double)rate)));
> }
> 
> unsigned int tc_calc_xmitsize(__u64 rate, unsigned int ticks)
> diff --git a/tc/tc_core.h b/tc/tc_core.h
> index 7a986ac2..c0fb7481 100644
> --- a/tc/tc_core.h
> +++ b/tc/tc_core.h
> @@ -12,7 +12,7 @@ enum link_layer {
> };
> 
> 
> -unsigned tc_core_tick2time(unsigned tick);
> +double tc_core_tick2time(double tick);
> unsigned tc_core_time2ktime(unsigned time);
> unsigned tc_core_ktime2time(unsigned ktime);
> unsigned tc_calc_xmittime(__u64 rate, unsigned size);


git am (and patch for that matter) is not liking your patch. Please make
sure the patch is against iproute2-next and top of tree.

You should also try sending the patch to yourself, saving to a file and
applying using `git am`.
Jonathan Lennox Feb. 26, 2025, 6:55 p.m. UTC | #2
> On Feb 26, 2025, at 11:06 AM, David Ahern <dsahern@kernel.org> wrote:
> 
> git am (and patch for that matter) is not liking your patch. Please make
> sure the patch is against iproute2-next and top of tree.
> 
> You should also try sending the patch to yourself, saving to a file and
> applying using `git am`.

Sorry, my mailer was mangling the patch (adding quoted-printable) and I couldn’t get
git send-email to work with my corporate e-mail. I’ve resent it from my personal gmail account.
diff mbox series

Patch

diff --git a/tc/tc_core.c b/tc/tc_core.c
index 37547e9b..32fd094f 100644
--- a/tc/tc_core.c
+++ b/tc/tc_core.c
@@ -23,12 +23,12 @@ 
static double tick_in_usec = 1;
static double clock_factor = 1;

-static unsigned int tc_core_time2tick(unsigned int time)
+static double tc_core_time2tick(double time)
{
	return time * tick_in_usec;
}

-unsigned int tc_core_tick2time(unsigned int tick)
+double tc_core_tick2time(double tick)
{
	return tick / tick_in_usec;
}
@@ -45,7 +45,7 @@  unsigned int tc_core_ktime2time(unsigned int ktime)

unsigned int tc_calc_xmittime(__u64 rate, unsigned int size)
{
-	return tc_core_time2tick(TIME_UNITS_PER_SEC*((double)size/(double)rate));
+	return ceil(tc_core_time2tick(TIME_UNITS_PER_SEC*((double)size/(double)rate)));
}

unsigned int tc_calc_xmitsize(__u64 rate, unsigned int ticks)
diff --git a/tc/tc_core.h b/tc/tc_core.h
index 7a986ac2..c0fb7481 100644
--- a/tc/tc_core.h
+++ b/tc/tc_core.h
@@ -12,7 +12,7 @@  enum link_layer {
};


-unsigned tc_core_tick2time(unsigned tick);
+double tc_core_tick2time(double tick);
unsigned tc_core_time2ktime(unsigned time);
unsigned tc_core_ktime2time(unsigned ktime);
unsigned tc_calc_xmittime(__u64 rate, unsigned size);