Skip to content
  • Eric Dumazet's avatar
    net-gro: restore frag0 optimization · a50e233c
    Eric Dumazet authored
    Main difference between napi_frags_skb() and napi_gro_receive() is that
    the later is called while ethernet header was already pulled by the NIC
    driver (eth_type_trans() was called before napi_gro_receive())
    
    Jerry Chu in commit 299603e8
    
     ("net-gro: Prepare GRO stack for the
    upcoming tunneling support") tried to remove this difference by calling
    eth_type_trans() from napi_frags_skb() instead of doing this later from
    napi_frags_finish()
    
    Goal was that napi_gro_complete() could call
    ptype->callbacks.gro_complete(skb, 0)  (offset of first network header =
    0)
    
    Also, xxx_gro_receive() handlers all use off = skb_gro_offset(skb) to
    point to their own header, for the current skb and ones held in gro_list
    
    Problem is this cleanup work defeated the frag0 optimization:
    It turns out the consecutive pskb_may_pull() calls are too expensive.
    
    This patch brings back the frag0 stuff in napi_frags_skb().
    
    As all skb have their mac header in skb head, we no longer need
    skb_gro_mac_header()
    
    Reported-by: default avatarMichal Schmidt <mschmidt@redhat.com>
    Fixes: 299603e8
    
     ("net-gro: Prepare GRO stack for the upcoming tunneling support")
    Signed-off-by: default avatarEric Dumazet <edumazet@google.com>
    Cc: Jerry Chu <hkchu@google.com>
    Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
    a50e233c