On 5/10/24 10:08 AM, Paul E. McKenney wrote:
To see that, consider a variable that is supposed to be accessed only under a lock (aside from the debugging/statistical access). Under RCU's KCSAN rules, marking those debugging/statistical accesses with READ_ONCE() would require all the updates to be marked with WRITE_ONCE(). Which would prevent KCSAN from noticing a buggy lockless WRITE_ONCE() update of that variable. In contrast, if we use data_race() for the debugging/statistical accesses and leave the normal lock-protected accesses unmarked (as normal C-language accesses), then KCSAN will complain about buggy lockless accesses, even if they are marked with READ_ONCE() or WRITE_ONCE(). Does that help, or am I missing your point?
Thanks, that's very helpful. Has it been considered to add this explanation as a comment above the data_race() macro definition? There may be other kernel developers who are wondering about when to use data_race() and when to use READ_ONCE(). Thanks, Bart.