• Michael Dalton's avatar
    virtio-net: mergeable buffer size should include virtio-net header · 5061de36
    Michael Dalton authored
    Commit 2613af0e ("virtio_net: migrate mergeable rx buffers to page
    frag allocators") changed the mergeable receive buffer size from PAGE_SIZE
    to MTU-size. However, the merge buffer size does not take into account the
    size of the virtio-net header. Consequently, packets that are MTU-size
    will take two buffers intead of one (to store the virtio-net header),
    substantially decreasing the throughput of MTU-size traffic due to TCP
    window / SKB truesize effects.
    
    This commit changes the mergeable buffer size to include the virtio-net
    header. The buffer size is cacheline-aligned because skb_page_frag_refill
    will not automatically align the requested size.
    
    Benchmarks taken from an average of 5 netperf 30-second TCP_STREAM runs
    between two QEMU VMs on a single physical machine. Each VM has two VCPUs and
    vhost enabled. All VMs and vhost threads run in a single 4 CPU cgroup
    cpuset, using cgroups to ensure that other processes in the system will not
    be scheduled on the benchmark CPUs. Transmit offloads and mergeable receive
    buffers are enabled, but guest_tso4 / guest_csum are explicitly disabled to
    force MTU-sized packets on the receiver.
    
    next-net trunk before 2613af0e (PAGE_SIZE buf): 3861.08Gb/s
    net-next trunk (MTU 1500- packet uses two buf due to size bug): 4076.62Gb/s
    net-next trunk (MTU 1480- packet fits in one buf): 6301.34Gb/s
    net-next trunk w/ size fix (MTU 1500 - packet fits in one buf): 6445.44Gb/s
    Suggested-by: default avatarEric Northup <digitaleric@google.com>
    Signed-off-by: default avatarMichael Dalton <mwdalton@google.com>
    Acked-by: default avatarEric Dumazet <edumazet@google.com>
    Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
    5061de36
virtio_net.c 45 KB