diff --git a/virtio-devices/src/balloon.rs b/virtio-devices/src/balloon.rs index 31422271a..14d1ac657 100644 --- a/virtio-devices/src/balloon.rs +++ b/virtio-devices/src/balloon.rs @@ -332,6 +332,7 @@ impl Balloon { avail_features, paused_sync: Some(Arc::new(Barrier::new(2))), queue_sizes: QUEUE_SIZES.to_vec(), + min_queues: NUM_QUEUES as u16, ..Default::default() }, id, diff --git a/virtio-devices/src/block.rs b/virtio-devices/src/block.rs index 84da8f0fa..044629b89 100644 --- a/virtio-devices/src/block.rs +++ b/virtio-devices/src/block.rs @@ -337,6 +337,7 @@ impl Block { avail_features, paused_sync: Some(Arc::new(Barrier::new(num_queues + 1))), queue_sizes: vec![queue_size; num_queues], + min_queues: 1, ..Default::default() }, id, diff --git a/virtio-devices/src/block_io_uring.rs b/virtio-devices/src/block_io_uring.rs index 43653b7b2..96f64ef58 100644 --- a/virtio-devices/src/block_io_uring.rs +++ b/virtio-devices/src/block_io_uring.rs @@ -378,6 +378,7 @@ impl BlockIoUring { avail_features, paused_sync: Some(Arc::new(Barrier::new(num_queues + 1))), queue_sizes: vec![queue_size; num_queues], + min_queues: 1, ..Default::default() }, id, diff --git a/virtio-devices/src/console.rs b/virtio-devices/src/console.rs index 28a1ce7fe..26b036cad 100644 --- a/virtio-devices/src/console.rs +++ b/virtio-devices/src/console.rs @@ -348,6 +348,7 @@ impl Console { queue_sizes: QUEUE_SIZES.to_vec(), avail_features, paused_sync: Some(Arc::new(Barrier::new(2))), + min_queues: NUM_QUEUES as u16, ..Default::default() }, id, diff --git a/virtio-devices/src/device.rs b/virtio-devices/src/device.rs index 4c33195ac..11587e327 100644 --- a/virtio-devices/src/device.rs +++ b/virtio-devices/src/device.rs @@ -224,6 +224,7 @@ pub struct VirtioCommon { pub epoll_threads: Option>>, pub queue_sizes: Vec, pub device_type: u32, + pub min_queues: u16, } impl VirtioCommon { @@ -259,6 +260,15 @@ impl VirtioCommon { return Err(ActivateError::BadActivate); } + if queues.len() < self.min_queues.into() { + error!( + "Number of enabled queues lower tham min: {} vs {}", + queues.len(), + self.min_queues + ); + return Err(ActivateError::BadActivate); + } + let kill_evt = EventFd::new(EFD_NONBLOCK).map_err(|e| { error!("failed creating kill EventFd: {}", e); ActivateError::BadActivate diff --git a/virtio-devices/src/mem.rs b/virtio-devices/src/mem.rs index 7ed24d380..4fec90a9a 100644 --- a/virtio-devices/src/mem.rs +++ b/virtio-devices/src/mem.rs @@ -764,6 +764,7 @@ impl Mem { avail_features, paused_sync: Some(Arc::new(Barrier::new(2))), queue_sizes: QUEUE_SIZES.to_vec(), + min_queues: 1, ..Default::default() }, id, diff --git a/virtio-devices/src/net.rs b/virtio-devices/src/net.rs index 3c0da2b53..9d00ac77d 100644 --- a/virtio-devices/src/net.rs +++ b/virtio-devices/src/net.rs @@ -256,6 +256,7 @@ impl Net { avail_features, queue_sizes: vec![queue_size; queue_num], paused_sync: Some(Arc::new(Barrier::new((num_queues / 2) + 1))), + min_queues: 2, ..Default::default() }, id, diff --git a/virtio-devices/src/pmem.rs b/virtio-devices/src/pmem.rs index f820767da..ed7276f5a 100644 --- a/virtio-devices/src/pmem.rs +++ b/virtio-devices/src/pmem.rs @@ -304,6 +304,7 @@ impl Pmem { queue_sizes: QUEUE_SIZES.to_vec(), paused_sync: Some(Arc::new(Barrier::new(2))), avail_features, + min_queues: 1, ..Default::default() }, id, diff --git a/virtio-devices/src/rng.rs b/virtio-devices/src/rng.rs index 879383607..6dfa4edf4 100644 --- a/virtio-devices/src/rng.rs +++ b/virtio-devices/src/rng.rs @@ -158,6 +158,7 @@ impl Rng { queue_sizes: QUEUE_SIZES.to_vec(), paused_sync: Some(Arc::new(Barrier::new(2))), avail_features, + min_queues: 1, ..Default::default() }, id, diff --git a/virtio-devices/src/vhost_user/blk.rs b/virtio-devices/src/vhost_user/blk.rs index af4afc8c5..45c2fff2c 100644 --- a/virtio-devices/src/vhost_user/blk.rs +++ b/virtio-devices/src/vhost_user/blk.rs @@ -135,6 +135,7 @@ impl Blk { avail_features, acked_features, paused_sync: Some(Arc::new(Barrier::new(vu_cfg.num_queues + 1))), + min_queues: 1, ..Default::default() }, id, diff --git a/virtio-devices/src/vhost_user/fs.rs b/virtio-devices/src/vhost_user/fs.rs index 3d51f855f..f88033e92 100644 --- a/virtio-devices/src/vhost_user/fs.rs +++ b/virtio-devices/src/vhost_user/fs.rs @@ -352,6 +352,7 @@ impl Fs { acked_features, queue_sizes: vec![queue_size; num_queues], paused_sync: Some(Arc::new(Barrier::new(2))), + min_queues: NUM_QUEUE_OFFSET as u16, ..Default::default() }, id, diff --git a/virtio-devices/src/vhost_user/net.rs b/virtio-devices/src/vhost_user/net.rs index 284189a7f..3901f011c 100644 --- a/virtio-devices/src/vhost_user/net.rs +++ b/virtio-devices/src/vhost_user/net.rs @@ -144,6 +144,7 @@ impl Net { avail_features, acked_features, paused_sync: Some(Arc::new(Barrier::new((vu_cfg.num_queues / 2) + 1))), + min_queues: 2, ..Default::default() }, vhost_user_net, diff --git a/virtio-devices/src/vsock/device.rs b/virtio-devices/src/vsock/device.rs index bb830059f..abbce3abe 100644 --- a/virtio-devices/src/vsock/device.rs +++ b/virtio-devices/src/vsock/device.rs @@ -337,6 +337,7 @@ where avail_features, paused_sync: Some(Arc::new(Barrier::new(2))), queue_sizes: QUEUE_SIZES.to_vec(), + min_queues: NUM_QUEUES as u16, ..Default::default() }, id, diff --git a/virtio-devices/src/watchdog.rs b/virtio-devices/src/watchdog.rs index 0478f7f50..6a761080e 100644 --- a/virtio-devices/src/watchdog.rs +++ b/virtio-devices/src/watchdog.rs @@ -193,6 +193,7 @@ impl Watchdog { queue_sizes: QUEUE_SIZES.to_vec(), paused_sync: Some(Arc::new(Barrier::new(2))), avail_features, + min_queues: 1, ..Default::default() }, id,