On Tue, Sep 11, 2018 at 02:41:29PM +0900, Sergey Senozhatsky wrote: > On (09/11/18 14:04), Sergey Senozhatsky wrote: > > > for (;;) { > > > set_current_state(TASK_UNINTERRUPTIBLE); > > > > I think that set_current_state() also executes memory barrier. Just > > because it accesses task state. > > > > > - if (!waiter.task) > > > + if (!READ_ONCE(waiter.task)) > > > break; > > > if (!timeout) > > > break; > > This READ_ONCE(waiter.task) looks interesting. Maybe could be moved > to a loop condition > > while (!READ_ONCE(waiter.task)) { > ... > } No, it must be after set_current_state(). See that same comment.