Patchwork tcp: tcp_prequeue() can use keyed wakeups

login
register
mail settings
Submitter John Dykstra
Date May 13, 2009, 1:34 a.m.
Message ID <1242178490.11389.20.camel@merlyn>
Download mbox | patch
Permalink /patch/27147/
State Accepted
Delegated to: David Miller
Headers show

Comments

John Dykstra - May 13, 2009, 1:34 a.m.
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?

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(-)
Eric Dumazet - May 13, 2009, 3:28 a.m.
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
John Dykstra - May 13, 2009, 3:05 p.m.
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
David Miller - May 18, 2009, 3:45 a.m.
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

Patch

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