OSDN Git Service

tcp: tcp_prequeue() can use keyed wakeups
authorJohn Dykstra <john.dykstra1@gmail.com>
Tue, 12 May 2009 15:34:50 +0000 (15:34 +0000)
committerDavid S. Miller <davem@davemloft.net>
Mon, 18 May 2009 03:44:43 +0000 (20:44 -0700)
When TCP frees up write buffer space, avoid waking up tasks that have
done a poll() or select() on the same socket specifying read-side
events.

This is an extension of a read-side patch by Eric Dumazet.

Signed-off-by: John Dykstra <john.dykstra1@gmail.com>
Acked-by: Eric Dumazet <dada1@cosmosbay.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
net/core/stream.c

index 8727cea..a37debf 100644 (file)
@@ -33,7 +33,8 @@ void sk_stream_write_space(struct sock *sk)
                clear_bit(SOCK_NOSPACE, &sock->flags);
 
                if (sk->sk_sleep && waitqueue_active(sk->sk_sleep))
-                       wake_up_interruptible(sk->sk_sleep);
+                       wake_up_interruptible_poll(sk->sk_sleep, POLLOUT |
+                                               POLLWRNORM | POLLWRBAND);
                if (sock->fasync_list && !(sk->sk_shutdown & SEND_SHUTDOWN))
                        sock_wake_async(sock, SOCK_WAKE_SPACE, POLL_OUT);
        }