netdev.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* [PATCH net] tcp: purge write queue upon RST
@ 2018-02-27 23:32 Soheil Hassas Yeganeh
  2018-02-28 16:42 ` David Miller
  0 siblings, 1 reply; 3+ messages in thread
From: Soheil Hassas Yeganeh @ 2018-02-27 23:32 UTC (permalink / raw)
  To: davem, netdev
  Cc: edumazet, willemb, Soheil Hassas Yeganeh, Yuchung Cheng,
	Neal Cardwell

From: Soheil Hassas Yeganeh <soheil@google.com>

When the connection is reset, there is no point in
keeping the packets on the write queue until the connection
is closed.

RFC 793 (page 70) and RFC 793-bis (page 64) both suggest
purging the write queue upon RST:
https://tools.ietf.org/html/draft-ietf-tcpm-rfc793bis-07

Moreover, this is essential for a correct MSG_ZEROCOPY
implementation, because userspace cannot call close(fd)
before receiving zerocopy signals even when the connection
is reset.

Fixes: f214f915e7db ("tcp: enable MSG_ZEROCOPY")
Signed-off-by: Soheil Hassas Yeganeh <soheil@google.com>
Reviewed-by: Eric Dumazet <edumazet@google.com>
Signed-off-by: Yuchung Cheng <ycheng@google.com>
Signed-off-by: Neal Cardwell <ncardwell@google.com>
---
 net/ipv4/tcp_input.c | 1 +
 1 file changed, 1 insertion(+)

diff --git a/net/ipv4/tcp_input.c b/net/ipv4/tcp_input.c
index 06b9c4765f42..b17fac2629c3 100644
--- a/net/ipv4/tcp_input.c
+++ b/net/ipv4/tcp_input.c
@@ -3998,6 +3998,7 @@ void tcp_reset(struct sock *sk)
 	/* This barrier is coupled with smp_rmb() in tcp_poll() */
 	smp_wmb();
 
+	tcp_write_queue_purge(sk);
 	tcp_done(sk);
 
 	if (!sock_flag(sk, SOCK_DEAD))
-- 
2.16.2.395.g2e18187dfd-goog

^ permalink raw reply related	[flat|nested] 3+ messages in thread

* Re: [PATCH net] tcp: purge write queue upon RST
  2018-02-27 23:32 [PATCH net] tcp: purge write queue upon RST Soheil Hassas Yeganeh
@ 2018-02-28 16:42 ` David Miller
  2018-02-28 16:46   ` Eric Dumazet
  0 siblings, 1 reply; 3+ messages in thread
From: David Miller @ 2018-02-28 16:42 UTC (permalink / raw)
  To: soheil.kdev; +Cc: netdev, edumazet, willemb, soheil, ycheng, ncardwell

From: Soheil Hassas Yeganeh <soheil.kdev@gmail.com>
Date: Tue, 27 Feb 2018 18:32:18 -0500

> From: Soheil Hassas Yeganeh <soheil@google.com>
> 
> When the connection is reset, there is no point in
> keeping the packets on the write queue until the connection
> is closed.
> 
> RFC 793 (page 70) and RFC 793-bis (page 64) both suggest
> purging the write queue upon RST:
> https://tools.ietf.org/html/draft-ietf-tcpm-rfc793bis-07
> 
> Moreover, this is essential for a correct MSG_ZEROCOPY
> implementation, because userspace cannot call close(fd)
> before receiving zerocopy signals even when the connection
> is reset.
> 
> Fixes: f214f915e7db ("tcp: enable MSG_ZEROCOPY")
> Signed-off-by: Soheil Hassas Yeganeh <soheil@google.com>
> Reviewed-by: Eric Dumazet <edumazet@google.com>
> Signed-off-by: Yuchung Cheng <ycheng@google.com>
> Signed-off-by: Neal Cardwell <ncardwell@google.com>

This is one of those "yeah, why have we been doing this all of
this time?" kind of situation.

Let's hope there isn't some subtle side effect, but indeed this
current behavior is broken for MSG_ZEROCOPY.

Applied and queued up for -stable, thanks!

^ permalink raw reply	[flat|nested] 3+ messages in thread

* Re: [PATCH net] tcp: purge write queue upon RST
  2018-02-28 16:42 ` David Miller
@ 2018-02-28 16:46   ` Eric Dumazet
  0 siblings, 0 replies; 3+ messages in thread
From: Eric Dumazet @ 2018-02-28 16:46 UTC (permalink / raw)
  To: David Miller
  Cc: Soheil Hassas Yeganeh, netdev, Willem de Bruijn,
	Soheil Hassas Yeganeh, Yuchung Cheng, Neal Cardwell

On Wed, Feb 28, 2018 at 8:42 AM, David Miller <davem@davemloft.net> wrote:
> From: Soheil Hassas Yeganeh <soheil.kdev@gmail.com>
> Date: Tue, 27 Feb 2018 18:32:18 -0500
>
>> From: Soheil Hassas Yeganeh <soheil@google.com>
>>
>> When the connection is reset, there is no point in
>> keeping the packets on the write queue until the connection
>> is closed.
>>
>> RFC 793 (page 70) and RFC 793-bis (page 64) both suggest
>> purging the write queue upon RST:
>> https://tools.ietf.org/html/draft-ietf-tcpm-rfc793bis-07
>>
>> Moreover, this is essential for a correct MSG_ZEROCOPY
>> implementation, because userspace cannot call close(fd)
>> before receiving zerocopy signals even when the connection
>> is reset.
>>
>> Fixes: f214f915e7db ("tcp: enable MSG_ZEROCOPY")
>> Signed-off-by: Soheil Hassas Yeganeh <soheil@google.com>
>> Reviewed-by: Eric Dumazet <edumazet@google.com>
>> Signed-off-by: Yuchung Cheng <ycheng@google.com>
>> Signed-off-by: Neal Cardwell <ncardwell@google.com>
>
> This is one of those "yeah, why have we been doing this all of
> this time?" kind of situation.
>
> Let's hope there isn't some subtle side effect, but indeed this
> current behavior is broken for MSG_ZEROCOPY.
>

One of the effect is that for very large queues (more than 100 MB), queue purge
might take a lot of time, in BH context (while handling one RST)

But even before the patch, this could also happen from BH context anyway.

We might use work queue (s) in the future to handle the purge in the
background in process context.
But really this is not urgent.

> Applied and queued up for -stable, thanks!

Thanks David.

^ permalink raw reply	[flat|nested] 3+ messages in thread

end of thread, other threads:[~2018-02-28 16:46 UTC | newest]

Thread overview: 3+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2018-02-27 23:32 [PATCH net] tcp: purge write queue upon RST Soheil Hassas Yeganeh
2018-02-28 16:42 ` David Miller
2018-02-28 16:46   ` Eric Dumazet

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).