> From: Philip Guenther <guent...@gmail.com>
> Date: Thu, 20 May 2021 23:32:17 -0900
> 
> On Wed, May 19, 2021 at 5:19 AM Mark Kettenis <mark.kette...@xs4all.nl>
> wrote:
> 
>  > Date: Tue, 18 May 2021 13:24:42 +0200
>  > From: Martin Pieuchot <m...@openbsd.org>
> 
> ... 
> 
>  > There's only a couple of 'volatile' usages in sys/sys.  These
>  annotations
>  > do not explicitly indicate which piece of code requires it.  Maybe it
>  would
>  > be clearer to use a cast or a macro where necessary.  This might help
>  us
>  > understand why and where "volatile" is needed.
> 
>  There are the READ_ONCE() and WRITE_ONCE() macros.  I'm not a big fan
>  of those (since they add clutter) but they do take care of dependency
>  ordering issues that exist in the alpha memory model.  Must admit that
>  I only vaguely understand that issue, but I think it involves ordered
>  access to two atomic variables which doesn't seem to be the case.
> 
>  On non-alpha systems, READ_ONCE() and WRITE_ONCE() just do a volatile
>  pointer cast.
> 
> READ/WRITE_ONCE() are 99% about keeping the compiler from deciding to
> rearrange code such that the indicated variable is read/written more than
> once.  To point to Linus posts from 2008/2009, when it was still ACCESS_ONCE
> ():
>      https://yarchive.net/comp/linux/ACCESS_ONCE.html

But that pretty much overlaps with the requirements for atomic access
and the current Linux kernel uses them for that purpose extensively.

> ISTR a paper by Ousterhout describing this same problem to the C standard
> committee(?) in the early 90's, which kinda opened the "memory model"
> rathole.
> 
> If the variable is actually being protected by a lock then these are indeed
> noise/pessimization; it's the lock-less accesses where the compiler can pull
> a rabbit from its hat and stab you with it.

And volatile is the stab-proof vest that might protect you from that.
But more on that in the reply to your next mail...

Reply via email to