net: fix length computation in rt_check_expire()
authorEric Dumazet <dada1@cosmosbay.com>
Tue, 19 May 2009 18:54:22 +0000 (18:54 +0000)
committerDavid S. Miller <davem@davemloft.net>
Thu, 21 May 2009 00:18:01 +0000 (17:18 -0700)
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>
net/ipv4/route.c

index c4c60e9f068acc221cb47079178df40299e3ef20..869cf1c44b78c6f643d7ffa03ab52238a014d757 100644 (file)
@@ -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)) {