virtio-devices: Enforce a minimum number of queues

Even though the driver can provide fewer queues than those advertised
for some device types their is a minimum number that is required for
operation.

Signed-off-by: Rob Bradford <robert.bradford@intel.com>
This commit is contained in:
Rob Bradford 2021-01-19 06:11:07 +00:00 committed by Sebastien Boeuf
parent a105089702
commit c90f77e399
14 changed files with 23 additions and 0 deletions

View File

@ -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,

View File

@ -337,6 +337,7 @@ impl<T: DiskFile> Block<T> {
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,

View File

@ -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,

View File

@ -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,

View File

@ -224,6 +224,7 @@ pub struct VirtioCommon {
pub epoll_threads: Option<Vec<thread::JoinHandle<()>>>,
pub queue_sizes: Vec<u16>,
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

View File

@ -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,

View File

@ -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,

View File

@ -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,

View File

@ -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,

View File

@ -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,

View File

@ -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,

View File

@ -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,

View File

@ -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,

View File

@ -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,