Thread (25 messages) 25 messages, 7 authors, 2009-06-29

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

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.
Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help