summary refs log tree commit diff
path: root/src/linux.rs
diff options
context:
space:
mode:
authorXiong Zhang <xiong.y.zhang@intel.corp-partner.google.com>2020-03-20 10:39:55 +0800
committerCommit Bot <commit-bot@chromium.org>2020-04-04 19:52:11 +0000
commit773c70740e98c1aaf73a7b02e65eadaeab33c9d8 (patch)
tree9af2f03662973a833320193e21a50fcc6b066c31 /src/linux.rs
parentc56bc989668d2d79f2a00d098a24729fc0cd6801 (diff)
downloadcrosvm-773c70740e98c1aaf73a7b02e65eadaeab33c9d8.tar
crosvm-773c70740e98c1aaf73a7b02e65eadaeab33c9d8.tar.gz
crosvm-773c70740e98c1aaf73a7b02e65eadaeab33c9d8.tar.bz2
crosvm-773c70740e98c1aaf73a7b02e65eadaeab33c9d8.tar.lz
crosvm-773c70740e98c1aaf73a7b02e65eadaeab33c9d8.tar.xz
crosvm-773c70740e98c1aaf73a7b02e65eadaeab33c9d8.tar.zst
crosvm-773c70740e98c1aaf73a7b02e65eadaeab33c9d8.zip
Virtio-net: Let queue-num could configurable
Virtio-net multi queue feature need multi queue pairs, this patch change
queue-num configurable instead of static. --net-vq-pairs parameter could
config virtio net device virtual queue pairs.

BUG=chromium:1064482
TEST=Test virtio net function in guest with --net-vq-pairs=1 and
--net-vq-pairs=2

Change-Id: I75202c8ae52a83b8087b52149ec6d2138d8831cb
Reviewed-on: https://chromium-review.googlesource.com/c/chromiumos/platform/crosvm/+/2120312
Tested-by: kokoro <noreply+kokoro@google.com>
Commit-Queue: Xiong  Zhang <xiong.y.zhang@intel.corp-partner.google.com>
Reviewed-by: Stephen Barber <smbarber@chromium.org>
Diffstat (limited to 'src/linux.rs')
-rw-r--r--src/linux.rs19
1 files changed, 16 insertions, 3 deletions
diff --git a/src/linux.rs b/src/linux.rs
index 6eb1ef7..0baf5ea 100644
--- a/src/linux.rs
+++ b/src/linux.rs
@@ -593,7 +593,13 @@ fn create_tap_net_device(cfg: &Config, tap_fd: RawFd) -> DeviceResult {
             .map_err(Error::CreateTapDevice)?
     };
 
-    let dev = virtio::Net::from(tap, 1).map_err(Error::NetDeviceNew)?;
+    let mut vq_pairs = cfg.net_vq_pairs.unwrap_or(1);
+    let vcpu_count = cfg.vcpu_count.unwrap_or(1);
+    if vcpu_count < vq_pairs as u32 {
+        error!("net vq pairs must be smaller than vcpu count, fall back to single queue mode");
+        vq_pairs = 1;
+    }
+    let dev = virtio::Net::from(tap, vq_pairs).map_err(Error::NetDeviceNew)?;
 
     Ok(VirtioDeviceStub {
         dev: Box::new(dev),
@@ -608,14 +614,21 @@ fn create_net_device(
     mac_address: MacAddress,
     mem: &GuestMemory,
 ) -> DeviceResult {
+    let mut vq_pairs = cfg.net_vq_pairs.unwrap_or(1);
+    let vcpu_count = cfg.vcpu_count.unwrap_or(1);
+    if vcpu_count < vq_pairs as u32 {
+        error!("net vq pairs must be smaller than vcpu count, fall back to single queue mode");
+        vq_pairs = 1;
+    }
+
     let dev = if cfg.vhost_net {
         let dev =
             virtio::vhost::Net::<Tap, vhost::Net<Tap>>::new(host_ip, netmask, mac_address, mem)
                 .map_err(Error::VhostNetDeviceNew)?;
         Box::new(dev) as Box<dyn VirtioDevice>
     } else {
-        let dev =
-            virtio::Net::<Tap>::new(host_ip, netmask, mac_address).map_err(Error::NetDeviceNew)?;
+        let dev = virtio::Net::<Tap>::new(host_ip, netmask, mac_address, vq_pairs)
+            .map_err(Error::NetDeviceNew)?;
         Box::new(dev) as Box<dyn VirtioDevice>
     };