I think I understand the context. membar_consumer() can be omitted because forward list iteration is (happen to be) "dependent-load" (except on Alpha).
My confusion came from that I thought memory ordering of load is more flexible in general. I also didn't quite understand "dependent-load". I have been only reading NetBSD kernel code to learn memory ordering; and I believe, nothing in the tree utilize this topologycal "dependent-load". I may be missing something though. On Mon, Nov 24, 2014 at 11:21 PM, Taylor R Campbell <campbell+netbsd-tech-k...@mumble.net> wrote: > Date: Mon, 24 Nov 2014 21:44:11 +0900 > From: Masao Uebayashi <uebay...@gmail.com> > > - TAILQ_REMOVE() will work (except on Alpha) > - TAILQ_INSERT_*() will not (on Alpha and some others) > - TAILQ_INSERT_*() need membar_producer() > - TAILQ_FOREACH() needs membar_consumer() > > - TAILQ_REMOVE works as is everywhere (unless you enable QUEUEDEBUG). > - TAILQ_INSERT_* need membar_producer everywhere. > - TAILQ_FOREACH needs membar_consumer on alpha. > > To clarify this situation, I added _PSZ versions of all of these in > the patch I sent earlier that will > > (a) do the right thing everywhere, and > (b) mark where you're sharing a queue with pserialize. I'm still not sure what part is really specific to pserialize(9) or not.