From 08e47ebd4bf3624bbf2efd664f0d978e151710cb Mon Sep 17 00:00:00 2001 From: Sebastien Boeuf Date: Fri, 24 Jan 2020 16:31:13 +0100 Subject: [PATCH] vmm: Add num_queues and queue_size parameters to virtio-blk The number of queues and the size of each queue were not configurable. In anticipation for adding multiqueue support, this commit introduces some new parameters to let the user decide about the number of queues and the queue size. Note that the default values for each of these parameters are identical to the default values used for vhost-user-blk, that is 1 for the number of queues and 128 for the queue size. Signed-off-by: Sebastien Boeuf --- src/main.rs | 4 ++- vmm/src/api/openapi/cloud-hypervisor.yaml | 6 ++++ vmm/src/config.rs | 38 +++++++++++++++++++++++ 3 files changed, 47 insertions(+), 1 deletion(-) diff --git a/src/main.rs b/src/main.rs index 2df8c2266..931cc9ce0 100755 --- a/src/main.rs +++ b/src/main.rs @@ -122,7 +122,9 @@ fn create_app<'a, 'b>( .long("disk") .help( "Disk parameters \"path=,\ - readonly=on|off,iommu=on|off\"", + readonly=on|off,iommu=on|off,\ + num_queues=,\ + queue_size=\"", ) .takes_value(true) .min_values(1) diff --git a/vmm/src/api/openapi/cloud-hypervisor.yaml b/vmm/src/api/openapi/cloud-hypervisor.yaml index 686f82bb1..18705ca02 100644 --- a/vmm/src/api/openapi/cloud-hypervisor.yaml +++ b/vmm/src/api/openapi/cloud-hypervisor.yaml @@ -277,6 +277,12 @@ components: iommu: type: boolean default: false + num_queues: + type: integer + default: 1 + queue_size: + type: integer + default: 128 NetConfig: type: object diff --git a/vmm/src/config.rs b/vmm/src/config.rs index f31f2104f..a47c2a2b0 100644 --- a/vmm/src/config.rs +++ b/vmm/src/config.rs @@ -39,6 +39,10 @@ pub enum Error { ParseCmdlineParams, /// Failed parsing disks parameters. ParseDisksParams, + /// Failed parsing disk queue number parameter. + ParseDiskNumQueuesParam(std::num::ParseIntError), + /// Failed parsing disk queue size parameter. + ParseDiskQueueSizeParam(std::num::ParseIntError), /// Failed parsing random number generator parameters. ParseRngParams, /// Failed parsing network ip parameter. @@ -344,6 +348,18 @@ pub struct DiskConfig { pub direct: bool, #[serde(default)] pub iommu: bool, + #[serde(default = "default_diskconfig_num_queues")] + pub num_queues: usize, + #[serde(default = "default_diskconfig_queue_size")] + pub queue_size: u16, +} + +fn default_diskconfig_num_queues() -> usize { + DEFAULT_NUM_QUEUES_VUBLK +} + +fn default_diskconfig_queue_size() -> u16 { + DEFAULT_QUEUE_SIZE_VUBLK } impl DiskConfig { @@ -355,6 +371,8 @@ impl DiskConfig { let mut readonly_str: &str = ""; let mut direct_str: &str = ""; let mut iommu_str: &str = ""; + let mut num_queues_str: &str = ""; + let mut queue_size_str: &str = ""; for param in params_list.iter() { if param.starts_with("path=") { @@ -365,14 +383,34 @@ impl DiskConfig { direct_str = ¶m[7..]; } else if param.starts_with("iommu=") { iommu_str = ¶m[6..]; + } else if param.starts_with("num_queues=") { + num_queues_str = ¶m[11..]; + } else if param.starts_with("queue_size=") { + queue_size_str = ¶m[11..]; } } + let mut num_queues: usize = default_diskconfig_num_queues(); + let mut queue_size: u16 = default_diskconfig_queue_size(); + + if !num_queues_str.is_empty() { + num_queues = num_queues_str + .parse() + .map_err(Error::ParseDiskNumQueuesParam)?; + } + if !queue_size_str.is_empty() { + queue_size = queue_size_str + .parse() + .map_err(Error::ParseDiskQueueSizeParam)?; + } + Ok(DiskConfig { path: PathBuf::from(path_str), readonly: parse_on_off(readonly_str)?, direct: parse_on_off(direct_str)?, iommu: parse_on_off(iommu_str)?, + num_queues, + queue_size, }) } }