On Thu, Mar 10, 2022 at 10:26:21PM +0000, Laurence Tratt wrote: > On Thu, Mar 10, 2022 at 09:52:27PM +0100, Mark Kettenis wrote: > > Hello Mark, > > > If you think about it, the invariants being tested by those KASSERTs should > > not depend on whether the old or the new value is read if another CPU is > > modifying that variable at the same time. Unless of course there is a > > refcounting bug. But even with the barrier we're not guaranteed to catch > > that bug. > ... > > > - KASSERT(atomic_load_int(&sc->task_refs.r_refs) == 0); > > > + KASSERT(sc->task_refs.r_refs == 0); > > Unfortunately this transformation almost certainly isn't safe: for example, > the non-atomic load can return values that were never written by any thread > (e.g. due to load/store tearing amongst other fun effects).
is that true even when care is taken to only use int/long sized variables that are naturally aligned? are compilers that pathological now?