Message ID | 1242178490.11389.20.camel@merlyn |
---|---|
State | Accepted, archived |
Delegated to: | David Miller |
Headers | show |
John Dykstra a écrit : > On Thu, 2009-05-07 at 19:20 +0200, Eric Dumazet wrote: >> We can avoid waking up tasks not interested in receive notifications, >> using wake_up_interruptible_poll() instead of wake_up_interruptible() > > Is there any reason why we shouldn't do the same thing on the write > side? No special reason, apart that this event is not so frequent. (For tcp, sock_wfree() doesnt call ->sk_write_space()) I wonder if sk_stream_write_space() is actually called at all, I never got it in profiles :) I see it is called from setsockopt(SO_SNFBUF), and from tcp_new_space() only if SOCK_NOSPACE was set. To see a benefit of this patch, we would need two threads, one blocked in a recv(), one blocked in a send() on same socket (or a poll/epoll user with same bi-directional trafic) Acked-by: Eric Dumazet <dada1@cosmosbay.com> > > Compile-tested only. > > -- John > > --- > [PATCH net-next-2.6] tcp: Don't wake up reading threads on write space > > 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> > --- > net/core/stream.c | 3 ++- > 1 files changed, 2 insertions(+), 1 deletions(-) > > diff --git a/net/core/stream.c b/net/core/stream.c > index 8727cea..a37debf 100644 > --- a/net/core/stream.c > +++ b/net/core/stream.c > @@ -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); > } -- 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
On Wed, 2009-05-13 at 05:28 +0200, Eric Dumazet wrote: > To see a benefit of this patch, we would need two threads, one blocked > in a recv(), > one blocked in a send() on same socket (or a poll/epoll user with same > bi-directional trafic) Agreed. -- John -- 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
From: John Dykstra <john.dykstra1@gmail.com> Date: Wed, 13 May 2009 10:05:07 -0500 > On Wed, 2009-05-13 at 05:28 +0200, Eric Dumazet wrote: > >> To see a benefit of this patch, we would need two threads, one blocked >> in a recv(), >> one blocked in a send() on same socket (or a poll/epoll user with same >> bi-directional trafic) > > Agreed. I've applied this to net-next-2.6, thanks. -- 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/stream.c b/net/core/stream.c index 8727cea..a37debf 100644 --- a/net/core/stream.c +++ b/net/core/stream.c @@ -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); }