• Eric Dumazet's avatar
    net: gro: remove obsolete code from skb_gro_receive() · 58025e46
    Eric Dumazet authored
    Some drivers use copybreak to copy tiny frames into smaller skb,
    and this smaller skb might not have skb->head_frag set for various
    reasons.
    
    skb_gro_receive() currently doesn't allow to aggregate the smaller skb
    into the previous GRO packet if this GRO packet has at least 2 MSS in
    it.
    
    Following workload easily demonstrates the problem.
    
    netperf -t TCP_RR -H target -- -r 3000,3000
    
    (tcpdump shows one GRO packet with 2 MSS, plus one additional packet of
    104 bytes that should have been appended.)
    
    It turns out that we can remove code from skb_gro_receive(), because
    commit 8a29111c ("net: gro: allow to build full sized skb") and its
    followups removed the assumption that a GRO packet with a frag_list had
    to have an empty head.
    
    Removing this code allows the aggregation of the last (incomplete) frame
    in some RPC workloads. Note that tcp_gro_receive() already takes care of
    forcing a flush if necessary, including this case.
    
    If we want to avoid using frag_list in the first place (in forwarding
    workloads for example, as the outgoing NIC is generally not able to cope
    with skbs having a frag_list), we need to address this separately.
    Signed-off-by: default avatarEric Dumazet <edumazet@google.com>
    Cc: Herbert Xu <herbert@gondor.apana.org.au>
    Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
    58025e46
skbuff.c 110 KB