Message ID | 20091209082624.19055.99645.sendpatchset@localhost.localdomain |
---|---|
State | Superseded, archived |
Delegated to: | David Miller |
Headers | show |
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 >
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
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 -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