• Eric Dumazet's avatar
    asix: avoid copies in tx path · 95162d65
    Eric Dumazet authored
    I noticed excess calls to skb_copy_expand() or memmove() in asix driver.
    
    This driver needs to push 4 bytes in front of frame (packet_len)
    and maybe add 4 bytes after the end (if padlen is 4)
    
    So it should set needed_headroom & needed_tailroom to avoid
    copies. But its not enough, because many packets are cloned
    before entering asix_tx_fixup() and this driver use skb_cloned()
    as a lazy way to check if it can push and put additional bytes in frame.
    
    Avoid skb_copy_expand() expensive call, using following rules :
    
    - We are allowed to push 4 bytes in headroom if skb_header_cloned()
      is false (and if we have 4 bytes of headroom)
    
    - We are allowed to put 4 bytes at tail if skb_cloned()
      is false (and if we have 4 bytes of tailroom)
    
    TCP packets for example are cloned, but skb_header_release()
    was called in tcp stack, allowing us to use headroom for our needs.
    Signed-off-by: default avatarEric Dumazet <edumazet@google.com>
    Cc: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
    Cc: Allan Chou <allan@asix.com.tw>
    Cc: Trond Wuellner <trond@chromium.org>
    Cc: Grant Grundler <grundler@chromium.org>
    Cc: Paul Stewart <pstew@chromium.org>
    Cc: Ming Lei <tom.leiming@gmail.com>
    Tested-by: default avatarMing Lei <ming.lei@canonical.com>
    Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
    95162d65
asix.c 43 KB