On Tue, Aug 04, 2020 at 10:48:41AM -0400, Mathieu Desnoyers wrote: > Here is the scenario I have in mind: > Userspace variables: > > int x = 0, y = 0; > > CPU 0 CPU 1 > Thread A Thread B > (in thread group A) (in thread group B) > > x = 1 > barrier() > y = 1 > exit() > exit_mm() > current->mm = NULL; > r1 = load y > membarrier() > skips CPU 0 (no IPI) because its current mm is NULL > r2 = load x > BUG_ON(r1 == 1 && r2 == 0) > Ah, yes of course. We really should have a bunch of these scenarios in membarrier.c. Now, the above cannot happen because we have an unconditional atomic_dec_and_test() in do_exit() before exit_mm(), but I'm sure relying on that is a wee bit dodgy.