• Eric Dumazet's avatar
    tcp: enhance tcp_collapse_retrans() with skb_shift() · f8071cde
    Eric Dumazet authored
    In commit 2331ccc5 ("tcp: enhance tcp collapsing"),
    we made a first step allowing copying right skb to left skb head.
    
    Since all skbs in socket write queue are headless (but possibly the very
    first one), this strategy often does not work.
    
    This patch extends tcp_collapse_retrans() to perform frag shifting,
    thanks to skb_shift() helper.
    
    This helper needs to not BUG on non headless skbs, as callers are ok
    with that.
    
    Tested:
    
    Following packetdrill test now passes :
    
    0.000 socket(..., SOCK_STREAM, IPPROTO_TCP) = 3
       +0 setsockopt(3, SOL_SOCKET, SO_REUSEADDR, [1], 4) = 0
       +0 bind(3, ..., ...) = 0
       +0 listen(3, 1) = 0
    
       +0 < S 0:0(0) win 32792 <mss 1460,sackOK,nop,nop,nop,wscale 8>
       +0 > S. 0:0(0) ack 1 <mss 1460,nop,nop,sackOK,nop,wscale 8>
    +.100 < . 1:1(0) ack 1 win 257
       +0 accept(3, ..., ...) = 4
    
       +0 setsockopt(4, SOL_TCP, TCP_NODELAY, [1], 4) = 0
       +0 write(4, ..., 200) = 200
       +0 > P. 1:201(200) ack 1
    +.001 write(4, ..., 200) = 200
       +0 > P. 201:401(200) ack 1
    +.001 write(4, ..., 200) = 200
       +0 > P. 401:601(200) ack 1
    +.001 write(4, ..., 200) = 200
       +0 > P. 601:801(200) ack 1
    +.001 write(4, ..., 200) = 200
       +0 > P. 801:1001(200) ack 1
    +.001 write(4, ..., 100) = 100
       +0 > P. 1001:1101(100) ack 1
    +.001 write(4, ..., 100) = 100
       +0 > P. 1101:1201(100) ack 1
    +.001 write(4, ..., 100) = 100
       +0 > P. 1201:1301(100) ack 1
    +.001 write(4, ..., 100) = 100
       +0 > P. 1301:1401(100) ack 1
    
    +.099 < . 1:1(0) ack 201 win 257
    +.001 < . 1:1(0) ack 201 win 257 <nop,nop,sack 1001:1401>
       +0 > P. 201:1001(800) ack 1
    Signed-off-by: default avatarEric Dumazet <edumazet@google.com>
    Cc: Neal Cardwell <ncardwell@google.com>
    Cc: Yuchung Cheng <ycheng@google.com>
    Acked-by: default avatarYuchung Cheng <ycheng@google.com>
    Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
    f8071cde
tcp_output.c 104 KB