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(). Thanks, drew