netdev
[Top] [All Lists]

Re: bad TSO performance in 2.6.9-rc2-BK

To: Herbert Xu <herbert@xxxxxxxxxxxxxxxxxxx>
Subject: Re: bad TSO performance in 2.6.9-rc2-BK
From: "David S. Miller" <davem@xxxxxxxxxxxxx>
Date: Mon, 27 Sep 2004 22:58:19 -0700
Cc: jheffner@xxxxxxx, ak@xxxxxxx, niv@xxxxxxxxxx, andy.grover@xxxxxxxxx, anton@xxxxxxxxx, netdev@xxxxxxxxxxx
In-reply-to: <20040928051539.GA11354@gondor.apana.org.au>
References: <20040923161141.4ea9be4c.davem@davemloft.net> <Pine.NEB.4.33.0409271416360.14606-100000@dexter.psc.edu> <20040927160411.22b44f48.davem@davemloft.net> <20040927233639.GA8333@gondor.apana.org.au> <20040927171356.6a59d039.davem@davemloft.net> <20040928003412.GA8755@gondor.apana.org.au> <20040927215901.6f65dc15.davem@davemloft.net> <20040928051539.GA11354@gondor.apana.org.au>
Sender: netdev-bounce@xxxxxxxxxxx
On Tue, 28 Sep 2004 15:15:39 +1000
Herbert Xu <herbert@xxxxxxxxxxxxxxxxxxx> wrote:

> > +   if (skb->len != (data_end_seq - data_seq)) {
> 
> Please make that > so that I can sleep at night :)
> 
> > +           if (__tcp_trim_head(sk, skb, data_end_seq - data_seq))
> 
> The argument to __tcp_trim_head should be
> 
> skb->len - (data_end_seq - data_seq)

Good catch, fixed as follows:

# This is a BitKeeper generated diff -Nru style patch.
#
# ChangeSet
#   2004/09/27 22:37:27-07:00 davem@xxxxxxxxxxxxxxxxxx 
#   [TCP]: Fix third arg to __tcp_trim_head().
#   
#   Noted by Herbert Xu <herbert@xxxxxxxxxxxxxxxxxxx>
#   
#   Signed-off-by: David S. Miller <davem@xxxxxxxxxxxxx>
# 
# net/ipv4/tcp_output.c
#   2004/09/27 22:36:41-07:00 davem@xxxxxxxxxxxxxxxxxx +4 -2
#   [TCP]: Fix third arg to __tcp_trim_head().
# 
diff -Nru a/net/ipv4/tcp_output.c b/net/ipv4/tcp_output.c
--- a/net/ipv4/tcp_output.c     2004-09-27 22:37:55 -07:00
+++ b/net/ipv4/tcp_output.c     2004-09-27 22:37:55 -07:00
@@ -980,8 +980,10 @@
        if (TCP_SKB_CB(skb)->flags & TCPCB_FLAG_FIN)
                data_end_seq--;
 
-       if (skb->len != (data_end_seq - data_seq)) {
-               if (__tcp_trim_head(sk, skb, data_end_seq - data_seq))
+       if (skb->len > (data_end_seq - data_seq)) {
+               u32 to_trim = skb->len - (data_end_seq - data_seq);
+
+               if (__tcp_trim_head(sk, skb, to_trim))
                        return -ENOMEM;
        }               
 

<Prev in Thread] Current Thread [Next in Thread>