• Ilan Tayari's avatar
    gso: Support frag_list splitting with head_frag · eaffadbb
    Ilan Tayari authored
    A driver may use build_skb() for received packets.
    These SKBs then have a head_frag.
    
    Since commit d7e8883c ("net: make GRO aware of
    skb->head_frag"), GRO may build frag_list SKBs out of
    head_frag received SKBs.
    In such a case, the chained SKBs end up with a head_frag.
    
    Commit 07b26c94 ("gso: Support partial splitting at
    the frag_list pointer") adds partial segmentation of frag_list
    SKB chains into individual SKBs.
    However, this is not done if the chained SKBs have any
    linear part, because the device may not be able to DMA
    the private linear buffer.
    
    A chained frag_list SKB with head_frag is wrongfully
    detected in this case as having a private linear part
    and thus falls back to software GSO, while in fact the
    linear part is backed by a DMA page just like any other frag.
    
    This causes low performance when forwarding those packets
    that were built with build_skb()
    
    Allow partial segmentation at the frag_list pointer for
    chained SKBs with head_frag.
    
    Note that such SKBs can only be created by GRO, when applied
    to received packets with head_frag.
    Also note that this change only affects the data path that
    performs the partial segmentation at frag_list pointer, and
    not any of the other more common data paths.
    Signed-off-by: default avatarIlan Tayari <ilant@mellanox.com>
    Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
    eaffadbb
skbuff.c 123 KB