NET : Corrects a bug in ip_rt_acct_read()
Subsystems (3)
PATCH 1/1 NET : Corrects a bug in ip_rt_acct_read()
Hi David
Before the patch to convert ip_rt_acct to percpu storage, I believe this bug should be corrected.
(against net-2.6.25 but might apply on previous kernels as well)
Thank you
[PATCH] 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)
net/ipv4/route.c +2 -6
@@ -2884,18 +2884,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];
From: Eric Dumazet <[email protected]>
Date: Fri, 16 Nov 2007 11:25:19 +0100
Quoted 10 lines
[PATCH] 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 0Before 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 <[email protected]>
Applied, good catch Eric.
To make things easier for you I've applied it to both net-2.6 and net-2.6.25
It seems like the code was trying to avoid that initial memset, grabbing the first cpu explicitly and then copying along the way. But the loop iterator wasn't adjusted correctly and of course the zero-cpu-assumption you noticed as well plays into this :-)