On Mon, Sep 25, 2017 at 08:10:54PM +0800, Boqun Feng wrote: > > static void membarrier_register_private_expedited(void) > > { > > struct task_struct *p = current; > > > > if (READ_ONCE(p->mm->membarrier_private_expedited)) > > return; > > membarrier_arch_register_private_expedited(p); Should we not then also do: barrier(); > > WRITE_ONCE(p->mm->membarrier_private_expedited, 1); > > } to avoid the compiler lifting that store?