Re: [PATCH] net: fix race in the receive/select
From: Oleg Nesterov <oleg@redhat.com>
Date: 2009-06-26 17:12:30
Also in:
lkml
From: Oleg Nesterov <oleg@redhat.com>
Date: 2009-06-26 17:12:30
Also in:
lkml
On 06/25, Davide Libenzi wrote:
Not all the code that uses add_wait_queue() does need to have the MB,
like code that does the most common pattern:
xxx_poll(...) {
poll_wait(...);
lock();
flags = calc_flags(->status);
unlock();
return flags;
}
xxx_update(...) {
lock();
->status = ...;
unlock();
if (waitqueue_active())
wake_up();
}
It's the code that does the lockless flags calculation in ->poll that
might need it.And if we remove waitqueue_active() in xxx_update(), then lock/unlock is not needed too. If xxx_poll() takes q->lock first, it can safely miss the changes in ->status and schedule(): xxx_update() will take q->lock, notice the sleeper and wake it up (ok, it will set ->triggered but this doesn't matter). If xxx_update() takes q->lock first, xxx_poll() must see the changes in status after poll_wait()->unlock(&q->lock) (in fact, after lock, not unlock). Oleg.