diff options
| author | Eric Dumazet <dada1@cosmosbay.com> | 2009-05-19 14:54:22 -0400 |
|---|---|---|
| committer | David S. Miller <davem@davemloft.net> | 2009-05-20 20:18:01 -0400 |
| commit | cf8da764fc6959b7efb482f375dfef9830e98205 (patch) | |
| tree | 701e4c42f6563cdb50153485015f0c4b439294ec | |
| parent | bc8a5397433e4effbaddfa7e462d10b3c060cabb (diff) | |
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>
| -rw-r--r-- | net/ipv4/route.c | 5 |
1 files changed, 3 insertions, 2 deletions
diff --git a/net/ipv4/route.c b/net/ipv4/route.c index c4c60e9f068a..869cf1c44b78 100644 --- a/net/ipv4/route.c +++ b/net/ipv4/route.c | |||
| @@ -785,7 +785,7 @@ static void rt_check_expire(void) | |||
| 785 | static unsigned int rover; | 785 | static unsigned int rover; |
| 786 | unsigned int i = rover, goal; | 786 | unsigned int i = rover, goal; |
| 787 | struct rtable *rth, **rthp; | 787 | struct rtable *rth, **rthp; |
| 788 | unsigned long length = 0, samples = 0; | 788 | unsigned long samples = 0; |
| 789 | unsigned long sum = 0, sum2 = 0; | 789 | unsigned long sum = 0, sum2 = 0; |
| 790 | u64 mult; | 790 | u64 mult; |
| 791 | 791 | ||
| @@ -795,9 +795,9 @@ static void rt_check_expire(void) | |||
| 795 | goal = (unsigned int)mult; | 795 | goal = (unsigned int)mult; |
| 796 | if (goal > rt_hash_mask) | 796 | if (goal > rt_hash_mask) |
| 797 | goal = rt_hash_mask + 1; | 797 | goal = rt_hash_mask + 1; |
| 798 | length = 0; | ||
| 799 | for (; goal > 0; goal--) { | 798 | for (; goal > 0; goal--) { |
| 800 | unsigned long tmo = ip_rt_gc_timeout; | 799 | unsigned long tmo = ip_rt_gc_timeout; |
| 800 | unsigned long length; | ||
| 801 | 801 | ||
| 802 | i = (i + 1) & rt_hash_mask; | 802 | i = (i + 1) & rt_hash_mask; |
| 803 | rthp = &rt_hash_table[i].chain; | 803 | rthp = &rt_hash_table[i].chain; |
| @@ -809,6 +809,7 @@ static void rt_check_expire(void) | |||
| 809 | 809 | ||
| 810 | if (*rthp == NULL) | 810 | if (*rthp == NULL) |
| 811 | continue; | 811 | continue; |
| 812 | length = 0; | ||
| 812 | spin_lock_bh(rt_hash_lock_addr(i)); | 813 | spin_lock_bh(rt_hash_lock_addr(i)); |
| 813 | while ((rth = *rthp) != NULL) { | 814 | while ((rth = *rthp) != NULL) { |
| 814 | if (rt_is_expired(rth)) { | 815 | if (rt_is_expired(rth)) { |
