network statistics in SMP

Ulrich Spörlein uqs at spoerlein.net
Sat Dec 19 21:09:11 UTC 2009


On Sat, 19.12.2009 at 15:56:38 +0100, Harti Brandt wrote:
> On Sat, 19 Dec 2009, Ulrich Sprlein wrote:
> 
> >On Tue, 15.12.2009 at 13:13:28 -0500, John Baldwin wrote:
> >> On Tuesday 15 December 2009 12:45:13 pm Harti Brandt wrote:
> >> > I see. I was also thinking along these lines, but was not sure whether it 
> >> > is worth the trouble. I suppose this does not help to implement 64-bit 
> >> > counters on 32-bit architectures, though, because you cannot read them 
> >> > reliably without locking to sum them up, right?
> >> 
> >> Either that or you just accept that you have a small race since it is only stats. :)
> >
> >This might be stupid, but can we not easily *read* 64bit counters
> >on 32bit machines like this:
> >
> >do {
> >    h1 = read_upper_32bits;
> >    l1 = read_lower_32bits;
> >    h2 = read_upper_32bits;
> >    l2 = read_lower_32bits; /* not needed */
> >} while (h1 != h2);
> >
> >sum64 = (h1<<32) + l1;
> >
> >or something like that? If h2 does not change between readings, no
> >wrap-around has occured. If l1 was read in between the readings of h1
> >and h2, the code above is sound. Right?
> 
> I suppose this works only if it would be guaranteed that the CPU modifying 
> the 64-bit value does this somehow faster than the CPU reading the data:
> 
> CPU1                    CPU2
> ----                    ----
> write new h
> 			read h1 (new h)
> 			read l1 (old l)
> 			read h2 (new h)
> write new l
> 
> It doesn't work too when the CPU first writes L and the H.

To be honest, I didn't even think about the 64 bit writes being
non-atomic, too. So, of course my suggestion was way too naive.

Also thanks to Bruce for re-iterating the whole write/read ordering
stuff yet again. :)

Regards,
Uli


More information about the freebsd-arch mailing list