diff options
author | Eric Dumazet <dada1@cosmosbay.com> | 2007-11-29 23:07:57 +1100 |
---|---|---|
committer | Greg Kroah-Hartman <gregkh@suse.de> | 2007-12-14 09:51:03 -0800 |
commit | c2f1eef5597779c7111747f51aa9d76945a8cee0 (patch) | |
tree | 2b4ff3ade9a2bc28af64debb9e9b4288372e37fd | |
parent | 823bf28de362bbb396c652988a5cf4b3bc31ea85 (diff) |
NET: Corrects a bug in ip_rt_acct_read()
[NET]: Corrects a bug in ip_rt_acct_read()
[ Upstream commit: 483b23ffa3a5f44767038b0a676d757e0668437e ]
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>
Cc: Herbert Xu <herbert@gondor.apana.org.au>
Signed-off-by: David S. Miller <davem@davemloft.net>
Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
-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 c7ca94bd152..198b7322d16 100644 --- a/net/ipv4/route.c +++ b/net/ipv4/route.c @@ -2913,18 +2913,14 @@ static int ip_rt_acct_read(char *buffer, char **start, off_t offset, offset /= sizeof(u32); if (length > 0) { - u32 *src = ((u32 *) IP_RT_ACCT_CPU(0)) + offset; u32 *dst = (u32 *) buffer; - /* Copy first cpu. */ *start = buffer; - memcpy(dst, src, length); + memset(dst, 0, length); - /* Add the other cpus in, one int at a time */ for_each_possible_cpu(i) { unsigned int j; - - src = ((u32 *) IP_RT_ACCT_CPU(i)) + offset; + u32 *src = ((u32 *) IP_RT_ACCT_CPU(i)) + offset; for (j = 0; j < length/4; j++) dst[j] += src[j]; |