I understand Linus' reasoning but I don't agree with it. He's right that usually you want to mark an access as, "get this from memory always." However, C doesn't have a defined way to do that (ACCESS_ONCE is nonstandard). The real solution is to introduce a new keyword (not called "volatile") that can mark object access expressions.
Lacking that, it should be sufficient to load the volatile-qualified name into a temporary and use the temporary to allow optimization. This way code is safe by default (no need to remember to use ACCESS_ONCE) and can be optimized explicitly where developers know it is safe.