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, }) } }