On Fri, Nov 8, 2019 at 9:53 AM Eric Dumazet <edumazet@xxxxxxxxxx> wrote: > > I personally like WRITE_ONCE() since it adds zero overhead on generated code, > and is the facto accessor we used for many years (before KCSAN was conceived) So I generally prefer WRITE_ONCE() over adding "volatile" to random data structure members. Because volatile *does* have potentially absolutely horrendous overhead on generated code. It just happens to be ok for the simple case of writing once to a variable. In fact, you bring that up yourself in your next email when you ask for "ADD_ONCE()". Exactly because gcc generates absolutely horrendous garbage for volatiles, for no actual good reason. Gcc *could* generate a single add-to-memory instruction. But no, that's not at all what gcc does. So for the kernel, we've generally had the rule to avoid 'volatile' data structures as much as humanly possible, because it actually does something much worse than it could do, and the source code _looks_ simple when the volatile is hidden in the data structures. Which is why we have READ_ONCE/WRITE_ONCE - it puts the volatile in the code, and makes it clear not only what is going on, but also the impact it has on code generation. But at the same time, I don't love WRITE_ONCE() when it's not actually about writing once. It might be better to have another way to show "this variable is a flag that we set to a single value". Even if maybe the implementation is then the same (ie we use a 'volatile' assignment to make KCSAN happy). > Hmm, which questionable optimization are you referring to? The "avoid dirty cacheline" one by adding a read and a conditional. Yes, it can be an optimization. And it might not be. Linus