Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

vhost-net: create vhost based Net backend #4461

Open
wants to merge 3 commits into
base: main
Choose a base branch
from

Commits on Feb 13, 2024

  1. devices/virtio/net: prepare net device for a second variant by intrud…

    …cing enum
    
    Right now we only have Virtio implementation, we want to introduce a
    Vhost variant in future. This patch introduces no functional changes.
    majek committed Feb 13, 2024
    Configuration menu
    Copy the full SHA
    6f19bf1 View commit details
    Browse the repository at this point in the history

Commits on Feb 19, 2024

  1. Configuration menu
    Copy the full SHA
    d256754 View commit details
    Browse the repository at this point in the history
  2. vhost-net: introduce alternative vhost backend for virtio/net device

    This patch adds a new backend to Net devices. It can be enabled with
    'vhost' bool on the network interface config, like this:
    
        "network-interfaces": [
            {
                "iface_id": "eth0",
                "host_dev_name": "tap0",
                "vhost": true
            }
        ],
    
    Vhost backend opens host kernel /dev/vhost-net interface, and performs
    a setup dance to setup the vhost device with the relevant tap
    interface. The effect is that all of the data plane goes directly
    between host kernel and the guest, skipping the firecracker VMM.
    This drastically reduces the packet latency and increases throughput,
    especially in a high-pps scenarios. For example UDP and TCP without
    offloads.
    
    The control plane does go through firecracker, due to MMIO limitations.
    The exception is interrupt from host to guest, technically they should
    go through firecracker VMM, but this is avoidable
    by splicing the host eventfd into the guest interruptfd, and
    force-returning VIRTIO_MMIO_INT_VRING in the relevant virtio register.
    This is the same trick block-vhost-user device uses.
    
    There are couple of missing features:
    
     - persist (no blockers, just work)
     - mmds (no obvious way to do it, perhaps possible with ebpf)
     - rate_limiting (no obvious way to implement it, perhaps with ebpf)
     - tap/vhost feature negotiation
    
    On the latter point, it would be nice to negotiate some more advanced
    tap/vhost features, like USO (UDP segmentation offload), TCP offloads
    (flag needed if guest wants to use XDP), VIRTIO_NET_F_MRG_RXBUF (this
    might be useful for performance, but benchmarks needed first). Right
    now there is no way to express these toggles in the net config, but
    this can be done in the future.
    majek committed Feb 19, 2024
    Configuration menu
    Copy the full SHA
    66aa09c View commit details
    Browse the repository at this point in the history