Re: [PATCH 11/18] seqcount: Introduce raw_write_seqcount_barrier()

Peter Zijlstra
2015-06-17T15:11:20Z

On Wed, Jun 17, 2015 at 07:57:12AM -0700, Paul E. McKenney wrote:
> On Wed, Jun 17, 2015 at 02:29:24PM +0200, Peter Zijlstra wrote:
> > I did leave off the READ/WRITE ONCE stuff, because I could not come up
> > with a scenario where it makes a difference -- I appreciate paranoia,
> > but I also think we should not overdo the thing.
>
> I can only conclude that you have not read this document:
>
> http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2015/n4455.html

This would be correct.

> Specifically, please keep in mind that unless you mark either the variable
> or the memory access, the compiler is within its rights to assume that
> there are no concurrent accesses to that variable. For but one example,
> if you do a normal store to a given variable, then the compiler is
> within its rights to use that variable as temporary storage prior to
> that store. And yes, you can reasonably argue that no sane compiler
> would store something else to s->sequence given that it could free up
> a register by storing the incremented value, but the fact remains that
> you have given it permission to do so if it wants.

Argh *grmbl*, that's bloody insane!

So I get the re-loading, I get the tearing, but this random intermittent
values (somewhat related to stores out of thin air) is completely
bonkers.

I would very much prefer a compiler switch that instructs the compiler
to not do bloody stupid things like this instead of marking every other
load/store in the kernel with volatile.

Note that if GCC were to actually do something like this, the kernel
would already be broken, because I'm very sure we did not consider/audit
it for this.