All of lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH net-next 1/2] tcp: remove redundant rcv_nxt update
@ 2018-07-11 13:16 Yafang Shao
  2018-07-11 13:16 ` [PATCH net-next 2/2] tcp: refactor tcp_queue_rcv Yafang Shao
  2018-07-11 17:01 ` [PATCH net-next 1/2] tcp: remove redundant rcv_nxt update Eric Dumazet
  0 siblings, 2 replies; 4+ messages in thread
From: Yafang Shao @ 2018-07-11 13:16 UTC (permalink / raw)
  To: davem, edumazet; +Cc: netdev, linux-kernel, shaoyafang, Yafang Shao

tcp_rcv_nxt_update() is already executed in tcp_data_queue().
This line is redundant.

See bellow,
	tcp_queue_rcv
		tcp_rcv_nxt_update(tcp_sk(sk), TCP_SKB_CB(skb)->end_seq);
	tcp_rcv_nxt_update(tp, TCP_SKB_CB(skb)->end_seq); <<<< redundant

Signed-off-by: Yafang Shao <laoar.shao@gmail.com>
---
 net/ipv4/tcp_input.c | 1 -
 1 file changed, 1 deletion(-)

diff --git a/net/ipv4/tcp_input.c b/net/ipv4/tcp_input.c
index 814ea43..3a54faf 100644
--- a/net/ipv4/tcp_input.c
+++ b/net/ipv4/tcp_input.c
@@ -4695,7 +4695,6 @@ static void tcp_data_queue(struct sock *sk, struct sk_buff *skb)
 		}
 
 		eaten = tcp_queue_rcv(sk, skb, 0, &fragstolen);
-		tcp_rcv_nxt_update(tp, TCP_SKB_CB(skb)->end_seq);
 		if (skb->len)
 			tcp_event_data_recv(sk, skb);
 		if (TCP_SKB_CB(skb)->tcp_flags & TCPHDR_FIN)
-- 
1.8.3.1


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

* [PATCH net-next 2/2] tcp: refactor tcp_queue_rcv
  2018-07-11 13:16 [PATCH net-next 1/2] tcp: remove redundant rcv_nxt update Yafang Shao
@ 2018-07-11 13:16 ` Yafang Shao
  2018-07-11 14:56   ` Eric Dumazet
  2018-07-11 17:01 ` [PATCH net-next 1/2] tcp: remove redundant rcv_nxt update Eric Dumazet
  1 sibling, 1 reply; 4+ messages in thread
From: Yafang Shao @ 2018-07-11 13:16 UTC (permalink / raw)
  To: davem, edumazet; +Cc: netdev, linux-kernel, shaoyafang, Yafang Shao

There're are some code similar to tcp_queue_rcv() in tcp_ofo_queue(),
so refactor tcp_queue_rcv() to make it be used in tcp_ofo_queue().

After this change, skb->sk is set when skb is moved from ofo queue into
receive queue instead of when queued into ofo queue.

Signed-off-by: Yafang Shao <laoar.shao@gmail.com>
---
 net/ipv4/tcp_input.c | 52 ++++++++++++++++++++++------------------------------
 1 file changed, 22 insertions(+), 30 deletions(-)

diff --git a/net/ipv4/tcp_input.c b/net/ipv4/tcp_input.c
index 3a54faf..92d4499 100644
--- a/net/ipv4/tcp_input.c
+++ b/net/ipv4/tcp_input.c
@@ -4367,6 +4367,21 @@ static void tcp_drop(struct sock *sk, struct sk_buff *skb)
 	__kfree_skb(skb);
 }
 
+static int __must_check
+tcp_queue_rcv(struct sock *sk, struct sk_buff *skb, bool *fragstolen)
+{
+	int eaten;
+	struct sk_buff *tail = skb_peek_tail(&sk->sk_receive_queue);
+
+	eaten = tail && tcp_try_coalesce(sk, tail, skb, fragstolen);
+	tcp_rcv_nxt_update(tcp_sk(sk), TCP_SKB_CB(skb)->end_seq);
+	if (!eaten) {
+		__skb_queue_tail(&sk->sk_receive_queue, skb);
+		skb_set_owner_r(skb, sk);
+	}
+	return eaten;
+}
+
 /* This one checks to see if we can put data from the
  * out_of_order queue into the receive_queue.
  */
@@ -4375,7 +4390,7 @@ static void tcp_ofo_queue(struct sock *sk)
 	struct tcp_sock *tp = tcp_sk(sk);
 	__u32 dsack_high = tp->rcv_nxt;
 	bool fin, fragstolen, eaten;
-	struct sk_buff *skb, *tail;
+	struct sk_buff *skb;
 	struct rb_node *p;
 
 	p = rb_first(&tp->out_of_order_queue);
@@ -4402,13 +4417,9 @@ static void tcp_ofo_queue(struct sock *sk)
 			   tp->rcv_nxt, TCP_SKB_CB(skb)->seq,
 			   TCP_SKB_CB(skb)->end_seq);
 
-		tail = skb_peek_tail(&sk->sk_receive_queue);
-		eaten = tail && tcp_try_coalesce(sk, tail, skb, &fragstolen);
-		tcp_rcv_nxt_update(tp, TCP_SKB_CB(skb)->end_seq);
+		eaten = tcp_queue_rcv(sk, skb, &fragstolen);
 		fin = TCP_SKB_CB(skb)->tcp_flags & TCPHDR_FIN;
-		if (!eaten)
-			__skb_queue_tail(&sk->sk_receive_queue, skb);
-		else
+		if (eaten)
 			kfree_skb_partial(skb, fragstolen);
 
 		if (unlikely(fin)) {
@@ -4573,28 +4584,9 @@ static void tcp_data_queue_ofo(struct sock *sk, struct sk_buff *skb)
 	if (skb) {
 		tcp_grow_window(sk, skb);
 		skb_condense(skb);
-		skb_set_owner_r(skb, sk);
 	}
 }
 
-static int __must_check tcp_queue_rcv(struct sock *sk, struct sk_buff *skb, int hdrlen,
-		  bool *fragstolen)
-{
-	int eaten;
-	struct sk_buff *tail = skb_peek_tail(&sk->sk_receive_queue);
-
-	__skb_pull(skb, hdrlen);
-	eaten = (tail &&
-		 tcp_try_coalesce(sk, tail,
-				  skb, fragstolen)) ? 1 : 0;
-	tcp_rcv_nxt_update(tcp_sk(sk), TCP_SKB_CB(skb)->end_seq);
-	if (!eaten) {
-		__skb_queue_tail(&sk->sk_receive_queue, skb);
-		skb_set_owner_r(skb, sk);
-	}
-	return eaten;
-}
-
 int tcp_send_rcvq(struct sock *sk, struct msghdr *msg, size_t size)
 {
 	struct sk_buff *skb;
@@ -4634,7 +4626,7 @@ int tcp_send_rcvq(struct sock *sk, struct msghdr *msg, size_t size)
 	TCP_SKB_CB(skb)->end_seq = TCP_SKB_CB(skb)->seq + size;
 	TCP_SKB_CB(skb)->ack_seq = tcp_sk(sk)->snd_una - 1;
 
-	if (tcp_queue_rcv(sk, skb, 0, &fragstolen)) {
+	if (tcp_queue_rcv(sk, skb, &fragstolen)) {
 		WARN_ON_ONCE(fragstolen); /* should not happen */
 		__kfree_skb(skb);
 	}
@@ -4694,7 +4686,7 @@ static void tcp_data_queue(struct sock *sk, struct sk_buff *skb)
 			goto drop;
 		}
 
-		eaten = tcp_queue_rcv(sk, skb, 0, &fragstolen);
+		eaten = tcp_queue_rcv(sk, skb, &fragstolen);
 		if (skb->len)
 			tcp_event_data_recv(sk, skb);
 		if (TCP_SKB_CB(skb)->tcp_flags & TCPHDR_FIN)
@@ -5529,8 +5521,8 @@ void tcp_rcv_established(struct sock *sk, struct sk_buff *skb)
 			NET_INC_STATS(sock_net(sk), LINUX_MIB_TCPHPHITS);
 
 			/* Bulk data transfer: receiver */
-			eaten = tcp_queue_rcv(sk, skb, tcp_header_len,
-					      &fragstolen);
+			__skb_pull(skb, tcp_header_len);
+			eaten = tcp_queue_rcv(sk, skb, &fragstolen);
 
 			tcp_event_data_recv(sk, skb);
 
-- 
1.8.3.1


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

* Re: [PATCH net-next 2/2] tcp: refactor tcp_queue_rcv
  2018-07-11 13:16 ` [PATCH net-next 2/2] tcp: refactor tcp_queue_rcv Yafang Shao
@ 2018-07-11 14:56   ` Eric Dumazet
  0 siblings, 0 replies; 4+ messages in thread
From: Eric Dumazet @ 2018-07-11 14:56 UTC (permalink / raw)
  To: Yafang Shao; +Cc: David Miller, netdev, LKML, shaoyafang

Hi Yafang
On Wed, Jul 11, 2018 at 6:17 AM Yafang Shao <laoar.shao@gmail.com> wrote:
>
> There're are some code similar to tcp_queue_rcv() in tcp_ofo_queue(),
> so refactor tcp_queue_rcv() to make it be used in tcp_ofo_queue().
>
> After this change, skb->sk is set when skb is moved from ofo queue into
> receive queue instead of when queued into ofo queue.

Why would you do that ???

I urge you to test this on hosts connected to the wild Internet :/

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

* Re: [PATCH net-next 1/2] tcp: remove redundant rcv_nxt update
  2018-07-11 13:16 [PATCH net-next 1/2] tcp: remove redundant rcv_nxt update Yafang Shao
  2018-07-11 13:16 ` [PATCH net-next 2/2] tcp: refactor tcp_queue_rcv Yafang Shao
@ 2018-07-11 17:01 ` Eric Dumazet
  1 sibling, 0 replies; 4+ messages in thread
From: Eric Dumazet @ 2018-07-11 17:01 UTC (permalink / raw)
  To: Yafang Shao, davem, edumazet; +Cc: netdev, linux-kernel, shaoyafang



On 07/11/2018 06:16 AM, Yafang Shao wrote:
> tcp_rcv_nxt_update() is already executed in tcp_data_queue().
> This line is redundant.
> 
> See bellow,
> 	tcp_queue_rcv
> 		tcp_rcv_nxt_update(tcp_sk(sk), TCP_SKB_CB(skb)->end_seq);
> 	tcp_rcv_nxt_update(tp, TCP_SKB_CB(skb)->end_seq); <<<< redundant
> 
> Signed-off-by: Yafang Shao <laoar.shao@gmail.com>
> ---

This patch is fine (but not the following)

Signed-off-by: Eric Dumazet <edumazet@google.com>

Thanks.




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

end of thread, other threads:[~2018-07-11 17:01 UTC | newest]

Thread overview: 4+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2018-07-11 13:16 [PATCH net-next 1/2] tcp: remove redundant rcv_nxt update Yafang Shao
2018-07-11 13:16 ` [PATCH net-next 2/2] tcp: refactor tcp_queue_rcv Yafang Shao
2018-07-11 14:56   ` Eric Dumazet
2018-07-11 17:01 ` [PATCH net-next 1/2] tcp: remove redundant rcv_nxt update Eric Dumazet

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.