RE: [PATCH net-next 3/5] be2net: fix erx->rx_drops_no_frags wrap around
From: <hidden>
Date: 2011-08-22 17:26:05
OK, thanks Eric. I'll re-spin this patch series ... -Sathya ________________________________________ From: Eric Dumazet [eric.dumazet@gmail.com] Sent: Monday, August 22, 2011 6:14 PM To: Perla, Sathya Cc: netdev@vger.kernel.org Subject: RE: [PATCH net-next 3/5] be2net: fix erx->rx_drops_no_frags wrap around Le lundi 22 août 2011 à 05:15 -0700, Sathya.Perla@Emulex.Com a écrit :
quoted
-----Original Message----- From: Eric Dumazet [mailto:eric.dumazet@gmail.com] Sent: Monday, August 22, 2011 5:18 PM Le lundi 22 août 2011 à 13:43 +0200, Eric Dumazet a écrit :quoted
This adds a race for lockless SNMP readers (in be_get_stats64()) They can see the 32bit value going backward. You have to be very careful to read the *acc once, and write it once.The "write once" is the only requirement. Something like : u32 newval = hi(*acc) + val; if (wrapped) newval += 65536; ACCESS_ONCE(*acc) = newval;Eric, I'm wondering why you'd need ACCESS_ONCE() here? Wouldn't using the temp variable (newval) as you suggested, ensure that the reader doesn't see a half-baked value?
If you write :
u32 newval = hi(*acc) + val;
if (wrapped)
newval += 65536;
*acc = newval;
C compiler (gcc) is free to eliminate the temp variable and to generate
same code than :
*acc = hi(*acc) + val;
if (wrapped)
*acc += 65536;
ACCESS_ONCE() here is the clean way (and self explanatory/documented) to
keep compiler to write to *acc twice.