Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit cf8da764 authored by Eric Dumazet's avatar Eric Dumazet Committed by David S. Miller
Browse files

net: fix length computation in rt_check_expire()



rt_check_expire() computes average and standard deviation of chain lengths,
but not correclty reset length to 0 at beginning of each chain.
This probably gives overflows for sum2 (and sum) on loaded machines instead
of meaningful results.

Signed-off-by: default avatarEric Dumazet <dada1@cosmosbay.com>
Acked-by: default avatarNeil Horman <nhorman@tuxdriver.com>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent bc8a5397
Loading
Loading
Loading
Loading
+3 −2
Original line number Diff line number Diff line
@@ -785,7 +785,7 @@ static void rt_check_expire(void)
	static unsigned int rover;
	unsigned int i = rover, goal;
	struct rtable *rth, **rthp;
	unsigned long length = 0, samples = 0;
	unsigned long samples = 0;
	unsigned long sum = 0, sum2 = 0;
	u64 mult;

@@ -795,9 +795,9 @@ static void rt_check_expire(void)
	goal = (unsigned int)mult;
	if (goal > rt_hash_mask)
		goal = rt_hash_mask + 1;
	length = 0;
	for (; goal > 0; goal--) {
		unsigned long tmo = ip_rt_gc_timeout;
		unsigned long length;

		i = (i + 1) & rt_hash_mask;
		rthp = &rt_hash_table[i].chain;
@@ -809,6 +809,7 @@ static void rt_check_expire(void)

		if (*rthp == NULL)
			continue;
		length = 0;
		spin_lock_bh(rt_hash_lock_addr(i));
		while ((rth = *rthp) != NULL) {
			if (rt_is_expired(rth)) {