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 10:31:58 -0800 |
commit | e8597d874b0141dbfd9aeea4dd84c5a8a614c322 (patch) | |
tree | 59af405985eefd58cfc61e45c16884b2e1eed1e0 | |
parent | 83cbdf5b31c9d8dd0b929a95603b13a8255e2268 (diff) | |
download | lwn-e8597d874b0141dbfd9aeea4dd84c5a8a614c322.tar.gz lwn-e8597d874b0141dbfd9aeea4dd84c5a8a614c322.zip |
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 29ca63e81ced..4aa25518b60f 100644 --- a/net/ipv4/route.c +++ b/net/ipv4/route.c @@ -3150,18 +3150,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]; |