On Fri, Aug 24, 2018 at 10:54:31PM +0000, Eric Wong wrote: > The pipe_poll function does not use locks, and adding an entry > to the waitqueue is not guaranteed to happen before pipe->nrbufs > (or other fields) are read, leading to missed wakeups. > > Looking at Ruby CI build logs and backtraces, I've noticed > occasional instances where processes are stuck in select(2) or > ppoll(2) with a pipe. > > I don't have access to the systems where this is happening to > test/reproduce the problem, and haven't been able to reproduce > it locally on less-powerful hardware, either. However, it seems > like a problem based on similar comments in > fs/eventfd.c::eventfd_poll made by Paolo. You are misinterpreting those comments. That load *can't* migrate to anything earlier than taking queue lock, since that acts as an acquire barrier. READ_ONCE in eventfd_poll() is not to prevent compiler reordering - it's to prevent insane compiler doing multiple loads on possibly changing variable (ctx->count there).