On Mon, 25 Mar 2024 at 06:57, Philipp Stanner <pstanner@xxxxxxxxxx> wrote: > > On Fri, 2024-03-22 at 17:36 -0700, Linus Torvalds wrote: > > > > It's kind of like our "volatile" usage. If you read the C (and C++) > > standards, you'll find that you should use "volatile" on data types. > > That's almost *never* what the kernel does. The kernel uses > > "volatile" > > in _code_ (ie READ_ONCE() etc), and uses it by casting etc. > > > > Compiler people don't tend to really like those kinds of things. > > Just for my understanding: Why don't they like it? So I actually think most compiler people are perfectly fine with the kernel model of mostly doing 'volatile' not on the data structures themselves, but as accesses through casts. It's very traditional C, and there's actually nothing particularly odd about it. Not even from a compiler standpoint. In fact, I personally will argue that it is fundamentally wrong to think that the underlying data has to be volatile. A variable may be entirely stable in some cases (ie locks held), but not in others. So it's not the *variable* (aka "object") that is 'volatile', it's the *context* that makes a particular access volatile. That explains why the kernel has basically zero actual volatile objects, and 99% of all volatile accesses are done through accessor functions that use a cast to mark a particular access volatile. But I've had negative comments from compiler people who read the standards as language lawyers (which honestly, I despise - it's always possible to try to argue what the meaning of some wording is), and particularly C++ people used to be very very antsy about "volatile". They had some truly _serious_ problems with volatile. The C++ people spent absolutely insane amounts of time arguing about "volatile objects" vs "accesses", and how an access through a cast didn't make the underlying object volatile etc. There were endless discussions because a lvalue isn't supposed to be an access (an lvalue is something that is being acted on, and it shouldn't imply an access because an access will then cause other things in C++). So a statement expression that was just an lvalue shouldn't imply an access in C++ originally, but obviously when the thing was volatile it *had* to do so, and there was gnashing of teeth over this all. And all of it was purely semantic nitpicking about random wording. The C++ people finally tried to save face by claiming that it was always the C (not C++) rules that were unclear, and introduced the notion of "glvalue", and it's all good now, but there's literally decades of language lawyering and pointless nitpicking about the difference between "objects" and "accesses". Sane people didn't care, but if you reported a compiler bug about volatile use, you had better be ready to sit back and be flamed for how your volatile pointer cast wasn't an "object" and that the compiler that clearly generated wrong code was technically correct, and that your mother was a hamster. It's a bit like the NULL debacle. Another thing that took the C++ people a couple of decades to admit they were wrong all along, and that NULL isn't actually 'integer zero' in any sane language that claims to care deeply about types. [ And again, to save face, at no point did they say "ok, '(void *)0' is fine" - they introduced a new __nullptr thing just so that they wouldn't have to admit that their decades of arguing was just them being wrong. You'll find another decade of arguments explaining the finer details about _that_ difference ] It turns out that the people who are language-lawyering nitpickers are then happy to be "proven right" by adding some more pointless syntacting language-lawyering language. Which I guess makes sense, but to the rest of us it all looks a bit pointless. Linus