diff mbox

[3/3] tcp: Slightly optimize tcp_sendmsg

Message ID 20091209082624.19055.99645.sendpatchset@localhost.localdomain
State Superseded, archived
Delegated to: David Miller
Headers show

Commit Message

Krishna Kumar Dec. 9, 2009, 8:26 a.m. UTC
From: Krishna Kumar <krkumar2@in.ibm.com>

Slightly optimize tcp_sendmsg since NETIF_F_SG is used many
times iteratively in the loop. The only other modification is
to change:
			} else if (i == MAX_SKB_FRAGS ||
				   (!i &&
				   !(sk->sk_route_caps & NETIF_F_SG))) {
	to:
			} else if (i == MAX_SKB_FRAGS || !sg) {

Signed-off-by: Krishna Kumar <krkumar2@in.ibm.com>
---
 net/ipv4/tcp.c |   17 +++++++++--------
 1 file changed, 9 insertions(+), 8 deletions(-)

--
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

Comments

Ilpo Järvinen Dec. 10, 2009, 8:17 a.m. UTC | #1
On Wed, 9 Dec 2009, Krishna Kumar wrote:

> From: Krishna Kumar <krkumar2@in.ibm.com>
> 
> Slightly optimize tcp_sendmsg since NETIF_F_SG is used many
> times iteratively in the loop. The only other modification is
> to change:
> 			} else if (i == MAX_SKB_FRAGS ||
> 				   (!i &&
> 				   !(sk->sk_route_caps & NETIF_F_SG))) {
> 	to:
> 			} else if (i == MAX_SKB_FRAGS || !sg) {

I can see that you make this change from the patch itself but could you 
give a justification on why dropping the !i is possible? ...I couldn't
see what would allow that.

> Signed-off-by: Krishna Kumar <krkumar2@in.ibm.com>
> ---
>  net/ipv4/tcp.c |   17 +++++++++--------
>  1 file changed, 9 insertions(+), 8 deletions(-)
> 
> diff -ruNp org/net/ipv4/tcp.c new/net/ipv4/tcp.c
> --- org/net/ipv4/tcp.c	2009-12-09 10:01:35.000000000 +0530
> +++ new/net/ipv4/tcp.c	2009-12-09 10:26:42.000000000 +0530
> @@ -878,12 +878,12 @@ ssize_t tcp_sendpage(struct socket *sock
>  #define TCP_PAGE(sk)	(sk->sk_sndmsg_page)
>  #define TCP_OFF(sk)	(sk->sk_sndmsg_off)
>  
> -static inline int select_size(struct sock *sk)
> +static inline int select_size(struct sock *sk, int sg)
>  {
>  	struct tcp_sock *tp = tcp_sk(sk);
>  	int tmp = tp->mss_cache;
>  
> -	if (sk->sk_route_caps & NETIF_F_SG) {
> +	if (sg) {
>  		if (sk_can_gso(sk))
>  			tmp = 0;
>  		else {
> @@ -907,7 +907,7 @@ int tcp_sendmsg(struct kiocb *iocb, stru
>  	struct sk_buff *skb;
>  	int iovlen, flags;
>  	int mss_now, size_goal;
> -	int err, copied;
> +	int sg, err, copied;
>  	long timeo;
>  
>  	lock_sock(sk);
> @@ -935,6 +935,8 @@ int tcp_sendmsg(struct kiocb *iocb, stru
>  	if (sk->sk_err || (sk->sk_shutdown & SEND_SHUTDOWN))
>  		goto out_err;
>  
> +	sg = sk->sk_route_caps & NETIF_F_SG;
> +
>  	while (--iovlen >= 0) {
>  		int seglen = iov->iov_len;
>  		unsigned char __user *from = iov->iov_base;
> @@ -960,8 +962,9 @@ new_segment:
>  				if (!sk_stream_memory_free(sk))
>  					goto wait_for_sndbuf;
>  
> -				skb = sk_stream_alloc_skb(sk, select_size(sk),
> -						sk->sk_allocation);
> +				skb = sk_stream_alloc_skb(sk,
> +							  select_size(sk, sg),
> +							  sk->sk_allocation);
>  				if (!skb)
>  					goto wait_for_memory;
>  
> @@ -998,9 +1001,7 @@ new_segment:
>  					/* We can extend the last page
>  					 * fragment. */
>  					merge = 1;
> -				} else if (i == MAX_SKB_FRAGS ||
> -					   (!i &&
> -					   !(sk->sk_route_caps & NETIF_F_SG))) {
> +				} else if (i == MAX_SKB_FRAGS || !sg) {
>  					/* Need to add new fragment and cannot
>  					 * do this because interface is non-SG,
>  					 * or because all the page slots are
> --
> 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
>
Krishna Kumar Dec. 10, 2009, 10:29 a.m. UTC | #2
Hi Ilpo,

"Ilpo Järvinen" <ilpo.jarvinen@helsinki.fi> wrote on 12/10/2009 01:47:30
PM:

> Subject: Re: [PATCH 3/3] tcp: Slightly optimize tcp_sendmsg>
>
> > Slightly optimize tcp_sendmsg since NETIF_F_SG is used many
> > times iteratively in the loop. The only other modification is
> > to change:
> >          } else if (i == MAX_SKB_FRAGS ||
> >                (!i &&
> >                !(sk->sk_route_caps & NETIF_F_SG))) {
> >    to:
> >          } else if (i == MAX_SKB_FRAGS || !sg) {
>
> I can see that you make this change from the patch itself but could you
> give a justification on why dropping the !i is possible? ...I couldn't
> see what would allow that.

From what *I understood*, this code (other than the MAX_SKB_FRAGS case)
executes only due to the else part of "if (skb_tailroom(skb) > 0) {" -
there was no space in the skb to put the data inline. Hence SG is false
is a sufficient condition and there is no way to add a fragment (i == 0
since skb_fill_page_desc cannot be called when !SG).

thanks,

- KK

--
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
Ilpo Järvinen Dec. 10, 2009, 10:42 a.m. UTC | #3
On Thu, 10 Dec 2009, Krishna Kumar2 wrote:

> Hi Ilpo,
> 
> "Ilpo Järvinen" <ilpo.jarvinen@helsinki.fi> wrote on 12/10/2009 01:47:30
> PM:
> 
> > Subject: Re: [PATCH 3/3] tcp: Slightly optimize tcp_sendmsg>
> >
> > > Slightly optimize tcp_sendmsg since NETIF_F_SG is used many
> > > times iteratively in the loop. The only other modification is
> > > to change:
> > >          } else if (i == MAX_SKB_FRAGS ||
> > >                (!i &&
> > >                !(sk->sk_route_caps & NETIF_F_SG))) {
> > >    to:
> > >          } else if (i == MAX_SKB_FRAGS || !sg) {
> >
> > I can see that you make this change from the patch itself but could you
> > give a justification on why dropping the !i is possible? ...I couldn't
> > see what would allow that.
> 
> From what *I understood*, this code (other than the MAX_SKB_FRAGS case)
> executes only due to the else part of "if (skb_tailroom(skb) > 0) {" -
> there was no space in the skb to put the data inline. Hence SG is false
> is a sufficient condition and there is no way to add a fragment (i == 0
> since skb_fill_page_desc cannot be called when !SG).

Please put this description into the patch description then :-). ...After 
some more thinking, reading and verification it seems right, however, it 
certainly wassn't immediately obvious from the code.

...You can add my Acked-by: Ilpo Järvinen <ilpo.jarvinen@helsinki.fi> for 
the resubmission.
diff mbox

Patch

diff -ruNp org/net/ipv4/tcp.c new/net/ipv4/tcp.c
--- org/net/ipv4/tcp.c	2009-12-09 10:01:35.000000000 +0530
+++ new/net/ipv4/tcp.c	2009-12-09 10:26:42.000000000 +0530
@@ -878,12 +878,12 @@  ssize_t tcp_sendpage(struct socket *sock
 #define TCP_PAGE(sk)	(sk->sk_sndmsg_page)
 #define TCP_OFF(sk)	(sk->sk_sndmsg_off)
 
-static inline int select_size(struct sock *sk)
+static inline int select_size(struct sock *sk, int sg)
 {
 	struct tcp_sock *tp = tcp_sk(sk);
 	int tmp = tp->mss_cache;
 
-	if (sk->sk_route_caps & NETIF_F_SG) {
+	if (sg) {
 		if (sk_can_gso(sk))
 			tmp = 0;
 		else {
@@ -907,7 +907,7 @@  int tcp_sendmsg(struct kiocb *iocb, stru
 	struct sk_buff *skb;
 	int iovlen, flags;
 	int mss_now, size_goal;
-	int err, copied;
+	int sg, err, copied;
 	long timeo;
 
 	lock_sock(sk);
@@ -935,6 +935,8 @@  int tcp_sendmsg(struct kiocb *iocb, stru
 	if (sk->sk_err || (sk->sk_shutdown & SEND_SHUTDOWN))
 		goto out_err;
 
+	sg = sk->sk_route_caps & NETIF_F_SG;
+
 	while (--iovlen >= 0) {
 		int seglen = iov->iov_len;
 		unsigned char __user *from = iov->iov_base;
@@ -960,8 +962,9 @@  new_segment:
 				if (!sk_stream_memory_free(sk))
 					goto wait_for_sndbuf;
 
-				skb = sk_stream_alloc_skb(sk, select_size(sk),
-						sk->sk_allocation);
+				skb = sk_stream_alloc_skb(sk,
+							  select_size(sk, sg),
+							  sk->sk_allocation);
 				if (!skb)
 					goto wait_for_memory;
 
@@ -998,9 +1001,7 @@  new_segment:
 					/* We can extend the last page
 					 * fragment. */
 					merge = 1;
-				} else if (i == MAX_SKB_FRAGS ||
-					   (!i &&
-					   !(sk->sk_route_caps & NETIF_F_SG))) {
+				} else if (i == MAX_SKB_FRAGS || !sg) {
 					/* Need to add new fragment and cannot
 					 * do this because interface is non-SG,
 					 * or because all the page slots are