Skip to content

Commit

Permalink
Disable virtio offloading feature bits
Browse files Browse the repository at this point in the history
This fixes the compatibility with vmnet framework defaults, and shows
better and more consistent performance in most cases.

vmnet has partly documented vmnet_enable_tso_key and
vmnet_enable_checksum_ofload_key options. Enabling these options allows
vment helper to work with current krunkit.

Before (TSO and checksum offload enabled):

| network              | vm       | iper3         | iperf3 -R     |
|----------------------|--------- |---------------|---------------|
| gvproxy              | krunkit  |  1.40 Gbits/s | 20.00 Gbits/s |
| vmnet-helper shared  | krunkit  |  1.38 Gbits/s | 46.20 Gbits/s |
| vmnet-helper bridged | krunkit  |  1.37 Gbits/s | 45.70 Gbits/s |
| vmnet-helper shared  | vfkit    |  4.27 Gbits/s |  8.09 Gbits/s |
| vmnet-helper bridged | vfkit    |  4.30 Gbits/s | 10.50 Gbits/s |

After (TSO and checksum offload disabled):

| network              | vm       | iper3         | iperf3 -R     |
|----------------------|----------|---------------|---------------|
| gvproxy              | krunkit  |  1.47 Gbits/s |  2.58 Gbits/s |
| vmnet-helper shared  | krunkit  | 10.10 Gbits/s |  8.38 Gbits/s |
| vmnet-helper shared  | krunkit  | 10.10 Gbits/s |  8.38 Gbits/s |
| gvproxy              | vfkit    |  1.43 Gbits/s |  2.84 Gbits/s |
| vmnet-helper shared  | vfkit    | 10.70 Gbits/s |  8.41 Gbits/s |
| vmnet-helper bridged | vfkit    | 12.10 Gbits/s | 11.50 Gbits/s |

It seems that using offloading makes sense only in special cases, so it
should be optional.

Part-of: containers#264
  • Loading branch information
nirs committed Feb 7, 2025
1 parent 7ae8056 commit b862da8
Showing 1 changed file with 3 additions and 13 deletions.
16 changes: 3 additions & 13 deletions src/devices/src/virtio/net/device.rs
Original file line number Diff line number Diff line change
Expand Up @@ -21,10 +21,7 @@ use std::path::PathBuf;
use std::sync::atomic::AtomicUsize;
use std::sync::Arc;
use utils::eventfd::{EventFd, EFD_NONBLOCK};
use virtio_bindings::virtio_net::{
VIRTIO_NET_F_CSUM, VIRTIO_NET_F_GUEST_CSUM, VIRTIO_NET_F_GUEST_TSO4, VIRTIO_NET_F_GUEST_UFO,
VIRTIO_NET_F_HOST_TSO4, VIRTIO_NET_F_HOST_UFO, VIRTIO_NET_F_MAC,
};
use virtio_bindings::virtio_net::VIRTIO_NET_F_MAC;
use virtio_bindings::virtio_ring::VIRTIO_RING_F_EVENT_IDX;
use vm_memory::{ByteValued, GuestMemoryError, GuestMemoryMmap};

Expand Down Expand Up @@ -93,15 +90,8 @@ pub struct Net {
impl Net {
/// Create a new virtio network device using the backend
pub fn new(id: String, cfg_backend: VirtioNetBackend, mac: [u8; 6]) -> Result<Self> {
let avail_features = 1 << VIRTIO_NET_F_GUEST_CSUM
| 1 << VIRTIO_NET_F_CSUM
| 1 << VIRTIO_NET_F_GUEST_TSO4
| 1 << VIRTIO_NET_F_HOST_TSO4
| 1 << VIRTIO_NET_F_GUEST_UFO
| 1 << VIRTIO_NET_F_HOST_UFO
| 1 << VIRTIO_NET_F_MAC
| 1 << VIRTIO_RING_F_EVENT_IDX
| 1 << VIRTIO_F_VERSION_1;
let avail_features =
1 << VIRTIO_NET_F_MAC | 1 << VIRTIO_RING_F_EVENT_IDX | 1 << VIRTIO_F_VERSION_1;

let mut queue_evts = Vec::new();
for _ in QUEUE_SIZES.iter() {
Expand Down

0 comments on commit b862da8

Please sign in to comment.