Patchwork net: add POLLPRI to sock_def_readable()

login
register
mail settings
Submitter Eric Dumazet
Date Jan. 6, 2011, 5:44 p.m.
Message ID <1294335897.3074.83.camel@edumazet-laptop>
Download mbox | patch
Permalink /patch/77747/
State Accepted
Delegated to: David Miller
Headers show

Comments

Eric Dumazet - Jan. 6, 2011, 5:44 p.m.
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>
---
 net/core/sock.c |    2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)



--
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
David Miller - Jan. 6, 2011, 6:55 p.m.
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

Patch

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();