Messages in this thread | | | Date | Tue, 25 Nov 2014 09:50:36 -0800 | From | "Paul E. McKenney" <> | Subject | Re: [PATCHv2 02/10] kernel: Provide READ_ONCE and ASSIGN_ONCE |
| |
On Tue, Nov 25, 2014 at 09:28:33AM -0800, Linus Torvalds wrote: > On Tue, Nov 25, 2014 at 7:59 AM, Paul E. McKenney > <paulmck@linux.vnet.ibm.com> wrote: > > > > We really need something like this to catch invalid sizes: > > > > default: invoke_nonexistent_function(); > > Actually, I wonder if we should make the default: case actually just > do something like > > barrier(); > memcpy(res, p, size); > barrier(); > > which in no way guarantees that it's an _atomic_ access, but it does > guarantee the semantics that you get one particular value and it won't > get reloaded later.. > > That would solve the crazy sparc pte issue too.
I would be really worried about confusion due to load/store tearing, where a READ_ONCE() reads part of its value from one ASSIGN_ONCE() and the other part from some other ASSIGN_ONCE(). Don't get me wrong, there are cases where the load/store tearing is harmless, it is just that in my experience that these cases are anything but the common case.
That said, I do not claim to be familiar with more than a microscopic fraction of the Linux kernel.
Of course, one way to resolve this would be to have one variant that did the memcpy() and another that threw a build error, maybe READ_ONCE_FORCE() and ASSIGN_ONCE_FORC() or some such. I would -really- like to be informed if I do READ_ONCE() of a long long on a 32-bit system. ;-)
/me goes off to see if there are any ACCESS_ONCE() of long longs in RCU...
Thanx, Paul
| |