diff options
author | Eric Dumazet <dada1@cosmosbay.com> | 2007-11-16 05:29:24 -0500 |
---|---|---|
committer | David S. Miller <davem@sunset.davemloft.net> | 2007-11-18 21:47:38 -0500 |
commit | 483b23ffa3a5f44767038b0a676d757e0668437e (patch) | |
tree | 0d3e90fba6499af90077e01ba3c4da48a7c9b1d8 /net/ipv4 | |
parent | b242e891c218162cfbae064b1a9136cdbed5ee53 (diff) |
[NET]: Corrects a bug in ip_rt_acct_read()
It seems that stats of cpu 0 are counted twice, since
for_each_possible_cpu() is looping on all possible cpus, including 0
Before percpu conversion of ip_rt_acct, we should also remove the
assumption that CPU 0 is online (or even possible)
Signed-off-by: Eric Dumazet <dada1@cosmosbay.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'net/ipv4')
-rw-r--r-- | net/ipv4/route.c | 8 |
1 files changed, 2 insertions, 6 deletions
diff --git a/net/ipv4/route.c b/net/ipv4/route.c index 1bff9ed349ff..c426dec6d579 100644 --- a/net/ipv4/route.c +++ b/net/ipv4/route.c | |||
@@ -2888,18 +2888,14 @@ static int ip_rt_acct_read(char *buffer, char **start, off_t offset, | |||
2888 | offset /= sizeof(u32); | 2888 | offset /= sizeof(u32); |
2889 | 2889 | ||
2890 | if (length > 0) { | 2890 | if (length > 0) { |
2891 | u32 *src = ((u32 *) IP_RT_ACCT_CPU(0)) + offset; | ||
2892 | u32 *dst = (u32 *) buffer; | 2891 | u32 *dst = (u32 *) buffer; |
2893 | 2892 | ||
2894 | /* Copy first cpu. */ | ||
2895 | *start = buffer; | 2893 | *start = buffer; |
2896 | memcpy(dst, src, length); | 2894 | memset(dst, 0, length); |
2897 | 2895 | ||
2898 | /* Add the other cpus in, one int at a time */ | ||
2899 | for_each_possible_cpu(i) { | 2896 | for_each_possible_cpu(i) { |
2900 | unsigned int j; | 2897 | unsigned int j; |
2901 | 2898 | u32 *src = ((u32 *) IP_RT_ACCT_CPU(i)) + offset; | |
2902 | src = ((u32 *) IP_RT_ACCT_CPU(i)) + offset; | ||
2903 | 2899 | ||
2904 | for (j = 0; j < length/4; j++) | 2900 | for (j = 0; j < length/4; j++) |
2905 | dst[j] += src[j]; | 2901 | dst[j] += src[j]; |