On Thu, Jun 16, 2022 at 09:54:16PM +0000, David Laight wrote:
From: oliver.upton@xxxxxxxxx
Sent: 16 June 2022 19:45
June 16, 2022 11:48 AM, "David Laight" <David.Laight@xxxxxxxxxx> 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.
Indeed, since the magic write is actually a guest MMIO write, then
it should be using writeq().