allow configuring size of virtio queues

This commit is contained in:
Bruce Leidl 2019-09-11 15:53:02 -04:00
parent 90e1b26a11
commit 07d1c765d4
2 changed files with 21 additions and 10 deletions

View File

@ -6,6 +6,7 @@ use super::{VirtioDevice,VirtioDeviceOps,PciIrq};
use super::consts::*;
use super::pci::PciBus;
use crate::vm::Result;
use std::iter;
pub struct VirtioBus {
@ -43,7 +44,7 @@ pub struct VirtioDeviceConfig<'a> {
kvm: Kvm,
ops: Arc<RwLock<dyn VirtioDeviceOps>>,
mmio: AddressRange,
num_queues: usize,
queue_sizes: Vec<usize>,
config_size: usize,
device_class: u16,
features: u64,
@ -61,7 +62,7 @@ impl <'a> VirtioDeviceConfig<'a> {
kvm,
ops,
mmio,
num_queues: 0,
queue_sizes: Vec::new(),
config_size: 0,
features: 0,
device_class: 0x0880,
@ -100,7 +101,11 @@ impl <'a> VirtioDeviceConfig<'a> {
}
pub fn num_queues(&self) -> usize {
self.num_queues
self.queue_sizes.len()
}
pub fn queue_sizes(&self) -> &[usize] {
&self.queue_sizes
}
#[allow(dead_code)]
@ -108,8 +113,15 @@ impl <'a> VirtioDeviceConfig<'a> {
self.config_size
}
pub fn set_queue_sizes(&mut self, sizes: &[usize]) -> &'a mut VirtioDeviceConfig {
self.queue_sizes.clear();
self.queue_sizes.extend_from_slice(sizes);
self
}
pub fn set_num_queues(&mut self, n: usize) -> &'a mut VirtioDeviceConfig {
self.num_queues = n;
self.queue_sizes.clear();
self.queue_sizes.extend(iter::repeat(DEFAULT_QUEUE_SIZE as usize).take(n));
self
}

View File

@ -8,7 +8,6 @@ use super::eventfd::IoEventFd;
use super::vring::Vring;
use super::virtqueue::InterruptLine;
use super::bus::VirtioDeviceConfig;
use super::consts::DEFAULT_QUEUE_SIZE;
///
/// Manages a set of virtqueues during device intitialization.
@ -28,7 +27,7 @@ impl VirtQueueConfig {
num_queues: dev_config.num_queues(),
selected_queue: 0,
enabled_features: 0,
vrings: create_vrings(memory,dev_config.num_queues()),
vrings: create_vrings(memory,dev_config.queue_sizes()),
interrupt: InterruptLine::from_config(&dev_config)?,
events: create_ioeventfds(&dev_config)?,
})
@ -123,10 +122,10 @@ fn create_ioeventfds(conf: &VirtioDeviceConfig) -> Result<Vec<Arc<IoEventFd>>> {
Ok(v)
}
fn create_vrings(memory: &GuestRam, n: usize) -> Vec<Vring> {
let mut v = Vec::with_capacity(n);
for _ in 0..n {
v.push(Vring::new(memory.clone(), DEFAULT_QUEUE_SIZE));
fn create_vrings(memory: &GuestRam, queue_sizes: &[usize]) -> Vec<Vring> {
let mut v = Vec::with_capacity(queue_sizes.len());
for &sz in queue_sizes {
v.push(Vring::new(memory.clone(), sz as u16))
}
v
}