From dc42324351762519a10ef511a58abb16ea28ef35 Mon Sep 17 00:00:00 2001 From: Sebastien Boeuf Date: Fri, 4 Sep 2020 09:36:10 +0200 Subject: [PATCH] vmm: Add 'memory_zones' option to NumaConfig This new option provides a new way to describe the memory associated with a NUMA node. This is the first step before we can remove the 'guest_numa_node' option from the --memory-zone parameter. Signed-off-by: Sebastien Boeuf --- option_parser/src/lib.rs | 16 ++++++++++++++++ vmm/src/api/openapi/cloud-hypervisor.yaml | 4 ++++ vmm/src/config.rs | 18 +++++++++++++++--- 3 files changed, 35 insertions(+), 3 deletions(-) diff --git a/option_parser/src/lib.rs b/option_parser/src/lib.rs index dac26926f..beac16297 100644 --- a/option_parser/src/lib.rs +++ b/option_parser/src/lib.rs @@ -248,3 +248,19 @@ impl FromStr for TupleTwoIntegers { Ok(TupleTwoIntegers(list)) } } + +pub struct StringList(pub Vec); + +pub enum StringListParseError { + InvalidValue(String), +} + +impl FromStr for StringList { + type Err = StringListParseError; + + fn from_str(s: &str) -> std::result::Result { + let string_list: Vec = s.trim().split(':').map(|e| e.to_owned()).collect(); + + Ok(StringList(string_list)) + } +} diff --git a/vmm/src/api/openapi/cloud-hypervisor.yaml b/vmm/src/api/openapi/cloud-hypervisor.yaml index 6cce61861..0149d172b 100644 --- a/vmm/src/api/openapi/cloud-hypervisor.yaml +++ b/vmm/src/api/openapi/cloud-hypervisor.yaml @@ -754,6 +754,10 @@ components: type: array items: $ref: '#/components/schemas/NumaDistance' + memory_zones: + type: array + items: + type: string VmResize: type: object diff --git a/vmm/src/config.rs b/vmm/src/config.rs index 456815aa3..3a1b4f44c 100644 --- a/vmm/src/config.rs +++ b/vmm/src/config.rs @@ -6,7 +6,7 @@ use clap::ArgMatches; use net_util::MacAddr; use option_parser::{ - ByteSized, IntegerList, OptionParser, OptionParserError, Toggle, TupleTwoIntegers, + ByteSized, IntegerList, OptionParser, OptionParserError, StringList, Toggle, TupleTwoIntegers, }; use std::convert::From; use std::fmt; @@ -1235,14 +1235,21 @@ pub struct NumaConfig { pub cpus: Option>, #[serde(default)] pub distances: Option>, + #[serde(default)] + pub memory_zones: Option>, } impl NumaConfig { pub const SYNTAX: &'static str = "Settings related to a given NUMA node \ - \"id=,cpus=,distances=\""; + \"id=,cpus=,distances=,\ + memory_zones=\""; pub fn parse(numa: &str) -> Result { let mut parser = OptionParser::new(); - parser.add("id").add("cpus").add("distances"); + parser + .add("id") + .add("cpus") + .add("distances") + .add("memory_zones"); parser.parse(numa).map_err(Error::ParseNuma)?; let id = parser @@ -1264,11 +1271,16 @@ impl NumaConfig { }) .collect() }); + let memory_zones = parser + .convert::("memory_zones") + .map_err(Error::ParseNuma)? + .map(|v| v.0); Ok(NumaConfig { id, cpus, distances, + memory_zones, }) } }