Message ID | 1294335897.3074.83.camel@edumazet-laptop |
---|---|
State | Accepted, archived |
Delegated to: | David Miller |
Headers | show |
From: Eric Dumazet <eric.dumazet@gmail.com> Date: Thu, 06 Jan 2011 18:44:57 +0100 > Leonardo Chiquitto found poll() could block forever on tcp sockets and > Urgent data was received, if the event flag only contains POLLPRI. > > He did a bisection and found commit 4938d7e0233 (poll: avoid extra > wakeups in select/poll) was the source of the problem. > > Problem is TCP sockets use standard sock_def_readable() function for > their sk_data_ready() handler, and sock_def_readable() doesnt signal > POLLPRI. > > Only TCP is affected by the problem. Adding POLLPRI to the list of flags > might trigger unnecessary schedules, but URGENT handling is such a > seldom used feature this seems a good compromise. > > Thanks a lot to Leonardo for providing the bisection result and a test > program as well. > > Reference : http://www.spinics.net/lists/netdev/msg151793.html > > Reported-and-bisected-by: Leonardo Chiquitto <leonardo.lists@gmail.com> > Signed-off-by: Eric Dumazet <eric.dumazet@gmail.com> > Tested-by: Eric Dumazet <eric.dumazet@gmail.com> Applied, thanks everyone. -- To unsubscribe from this list: send the line "unsubscribe netdev" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
diff --git a/net/core/sock.c b/net/core/sock.c index e5af8d5..7fd3541 100644 --- a/net/core/sock.c +++ b/net/core/sock.c @@ -1907,7 +1907,7 @@ static void sock_def_readable(struct sock *sk, int len) rcu_read_lock(); wq = rcu_dereference(sk->sk_wq); if (wq_has_sleeper(wq)) - wake_up_interruptible_sync_poll(&wq->wait, POLLIN | + wake_up_interruptible_sync_poll(&wq->wait, POLLIN | POLLPRI | POLLRDNORM | POLLRDBAND); sk_wake_async(sk, SOCK_WAKE_WAITD, POLL_IN); rcu_read_unlock();