Skip to content
  • Jason Wang's avatar
    tap: use build_skb() for small packet · 66ccbc9c
    Jason Wang authored
    
    
    We use tun_alloc_skb() which calls sock_alloc_send_pskb() to allocate
    skb in the past. This socket based method is not suitable for high
    speed userspace like virtualization which usually:
    
    - ignore sk_sndbuf (INT_MAX) and expect to receive the packet as fast as
      possible
    - don't want to be block at sendmsg()
    
    To eliminate the above overheads, this patch tries to use build_skb()
    for small packet. We will do this only when the following conditions
    are all met:
    
    - TAP instead of TUN
    - sk_sndbuf is INT_MAX
    - caller don't want to be blocked
    - zerocopy is not used
    - packet size is smaller enough to use build_skb()
    
    Pktgen from guest to host shows ~11% improvement for rx pps of tap:
    
    Before: ~1.70Mpps
    After : ~1.88Mpps
    
    What's more important, this makes it possible to implement XDP for tap
    before creating skbs.
    
    Signed-off-by: default avatarJason Wang <jasowang@redhat.com>
    Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
    66ccbc9c