mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/next/linux-next.git
synced 2025-01-11 08:18:47 +00:00
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: Eric Dumazet <dada1@cosmosbay.com> Acked-by: Neil Horman <nhorman@tuxdriver.com> Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
parent
bc8a539743
commit
cf8da764fc
@ -785,7 +785,7 @@ static void rt_check_expire(void)
|
|||||||
static unsigned int rover;
|
static unsigned int rover;
|
||||||
unsigned int i = rover, goal;
|
unsigned int i = rover, goal;
|
||||||
struct rtable *rth, **rthp;
|
struct rtable *rth, **rthp;
|
||||||
unsigned long length = 0, samples = 0;
|
unsigned long samples = 0;
|
||||||
unsigned long sum = 0, sum2 = 0;
|
unsigned long sum = 0, sum2 = 0;
|
||||||
u64 mult;
|
u64 mult;
|
||||||
|
|
||||||
@ -795,9 +795,9 @@ static void rt_check_expire(void)
|
|||||||
goal = (unsigned int)mult;
|
goal = (unsigned int)mult;
|
||||||
if (goal > rt_hash_mask)
|
if (goal > rt_hash_mask)
|
||||||
goal = rt_hash_mask + 1;
|
goal = rt_hash_mask + 1;
|
||||||
length = 0;
|
|
||||||
for (; goal > 0; goal--) {
|
for (; goal > 0; goal--) {
|
||||||
unsigned long tmo = ip_rt_gc_timeout;
|
unsigned long tmo = ip_rt_gc_timeout;
|
||||||
|
unsigned long length;
|
||||||
|
|
||||||
i = (i + 1) & rt_hash_mask;
|
i = (i + 1) & rt_hash_mask;
|
||||||
rthp = &rt_hash_table[i].chain;
|
rthp = &rt_hash_table[i].chain;
|
||||||
@ -809,6 +809,7 @@ static void rt_check_expire(void)
|
|||||||
|
|
||||||
if (*rthp == NULL)
|
if (*rthp == NULL)
|
||||||
continue;
|
continue;
|
||||||
|
length = 0;
|
||||||
spin_lock_bh(rt_hash_lock_addr(i));
|
spin_lock_bh(rt_hash_lock_addr(i));
|
||||||
while ((rth = *rthp) != NULL) {
|
while ((rth = *rthp) != NULL) {
|
||||||
if (rt_is_expired(rth)) {
|
if (rt_is_expired(rth)) {
|
||||||
|
Loading…
x
Reference in New Issue
Block a user