From: oliver.upton@linux.dev
Sent: 16 June 2022 19:45
June 16, 2022 11:48 AM, "David Laight" David.Laight@aculab.com wrote:
No wonder I was confused. It's not surprising the compiler optimises it all away.
It doesn't seem right to be 'abusing' WRITE_ONCE() here. Just adding barrier() should be enough and much more descriptive.
I had the same thought, although I do not believe barrier() is sufficient on its own. barrier_data() with a pointer to uc passed through is required to keep clang from eliminating the dead store.
A barrier() (full memory clobber) ought to be stronger than the partial one than barrier_data() generates.
I can't quite decide whether you need a barrier() both sides of the 'magic write'. Plausibly the compiler could discard the on-stack data after the barrier() and before the 'magic write'.
Certainly putting the 'magic write' inside a asm block that has a memory clobber is a more correct solution.
David
- Registered Address Lakeside, Bramley Road, Mount Farm, Milton Keynes, MK1 1PT, UK Registration No: 1397386 (Wales)