RE: [PATCH net-next 3/5] be2net: fix erx->rx_drops_no_frags wrap around
From: Eric Dumazet <hidden>
Date: 2011-08-22 12:44:46
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.