ACCESS_ONCE is nonstandard due to typeof. That's not too bad for the kernel because developers only expect it to be compilable by gcc anyway.
The use of a cast is fine.
I'm suggesting the variable be declared volatile for safety reasons and temporaries be used to explicitly avoid pessimizing code when developers know it is safe. That way things are safe by default and explicitly and obviously optimized when possible.