Re: [PATCHv2 02/10] kernel: Provide READ_ONCE and ASSIGN_ONCE

From: Paul E. McKenney
Date: Tue Nov 25 2014 - 12:50:47 EST


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@xxxxxxxxxxxxxxxxxx> 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

--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/