On 9/11/18 8:41 AM, 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)) { > ... > } We can't reorder event check and set_current_state(), because this will lead to missing of wakeup: Documentation/memory-barriers.txt Also, it looks like READ_ONCE() is not need. In case of compiler had optimized this, then all wait_event() in kernel w/o READ_ONCE would have not worked like expected, wouldn't they? Kirill