From 773c70740e98c1aaf73a7b02e65eadaeab33c9d8 Mon Sep 17 00:00:00 2001 From: Xiong Zhang Date: Fri, 20 Mar 2020 10:39:55 +0800 Subject: 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 Commit-Queue: Xiong Zhang Reviewed-by: Stephen Barber --- devices/src/virtio/net.rs | 20 ++++++++++++-------- 1 file changed, 12 insertions(+), 8 deletions(-) (limited to 'devices') diff --git a/devices/src/virtio/net.rs b/devices/src/virtio/net.rs index 0200daf..a15ab03 100644 --- a/devices/src/virtio/net.rs +++ b/devices/src/virtio/net.rs @@ -28,8 +28,6 @@ use super::{ }; const QUEUE_SIZE: u16 = 256; -const NUM_QUEUES: usize = 3; -const QUEUE_SIZES: &[u16] = &[QUEUE_SIZE, QUEUE_SIZE, QUEUE_SIZE]; #[derive(Debug)] pub enum NetError { @@ -422,6 +420,7 @@ where } pub struct Net { + queue_sizes: Box<[u16]>, workers_kill_evt: Vec, kill_evts: Vec, worker_threads: Vec>>, @@ -440,8 +439,8 @@ where ip_addr: Ipv4Addr, netmask: Ipv4Addr, mac_addr: MacAddress, + vq_pairs: u16, ) -> Result, NetError> { - let vq_pairs = QUEUE_SIZES.len() as u16 / 2; let multi_queue = if vq_pairs > 1 { true } else { false }; let tap: T = T::new(true, multi_queue).map_err(NetError::TapOpen)?; tap.set_ip_addr(ip_addr).map_err(NetError::TapSetIp)?; @@ -490,6 +489,7 @@ where } Ok(Net { + queue_sizes: vec![QUEUE_SIZE; (vq_pairs * 2 + 1) as usize].into_boxed_slice(), workers_kill_evt, kill_evts, worker_threads: Vec::new(), @@ -500,7 +500,7 @@ where } fn build_config(&self) -> VirtioNetConfig { - let vq_pairs = QUEUE_SIZES.len() as u16 / 2; + let vq_pairs = self.queue_sizes.len() as u16 / 2; VirtioNetConfig { max_vq_pairs: Le16::from(vq_pairs), @@ -600,7 +600,7 @@ where } fn queue_max_sizes(&self) -> &[u16] { - QUEUE_SIZES + &self.queue_sizes } fn features(&self) -> u64 { @@ -643,12 +643,16 @@ where mut queues: Vec, mut queue_evts: Vec, ) { - if queues.len() != NUM_QUEUES || queue_evts.len() != NUM_QUEUES { - error!("net: expected {} queues, got {}", NUM_QUEUES, queues.len()); + if queues.len() != self.queue_sizes.len() || queue_evts.len() != self.queue_sizes.len() { + error!( + "net: expected {} queues, got {}", + self.queue_sizes.len(), + queues.len() + ); return; } - let vq_pairs = QUEUE_SIZES.len() / 2; + let vq_pairs = self.queue_sizes.len() / 2; if self.taps.len() != vq_pairs { error!("net: expected {} taps, got {}", vq_pairs, self.taps.len()); return; -- cgit 1.4.1