Messages in this thread Patch in this message | | | Date | Wed, 12 Dec 2007 22:34:53 -0800 | From | Greg KH <> | Subject | [patch 19/36] NET: Corrects a bug in ip_rt_acct_read() |
| |
2.6.22-stable review patch. If anyone has any objections, please let us know.
------------------ From: Eric Dumazet <dada1@cosmosbay.com>
[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>
--- net/ipv4/route.c | 8 ++------ 1 file changed, 2 insertions(+), 6 deletions(-)
--- a/net/ipv4/route.c +++ b/net/ipv4/route.c @@ -3150,18 +3150,14 @@ static int ip_rt_acct_read(char *buffer, 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]; --
| |