From e6f585a31c6f74f6a286e8e05e77d72e59fc8f6b Mon Sep 17 00:00:00 2001 From: Sebastien Boeuf Date: Tue, 25 Aug 2020 17:36:19 +0200 Subject: [PATCH] vmm: Add 'host_numa_nodes' option to memory zones Since memory zones have been introduced, it is now possible for a user to specify multiple backends for the guest RAM. By adding a new option 'host_numa_node' to the 'memory-zone' parameter, we allow the guest RAM to be backed by memory that might come from a specific NUMA node on the host. The option expects a node identifier, specifying which NUMA node should be used to allocate the memory associated with a specific memory zone. Signed-off-by: Sebastien Boeuf --- src/main.rs | 2 +- vmm/src/api/openapi/cloud-hypervisor.yaml | 2 ++ vmm/src/config.rs | 9 ++++++++- vmm/src/memory_manager.rs | 1 + 4 files changed, 12 insertions(+), 2 deletions(-) diff --git a/src/main.rs b/src/main.rs index eca3aa777..0b05c257d 100644 --- a/src/main.rs +++ b/src/main.rs @@ -120,7 +120,7 @@ fn create_app<'a, 'b>( .help( "User defined memory zone parameters \ \"size=,file=,\ - shared=on|off,hugepages=on|off\"", + shared=on|off,hugepages=on|off,host_numa_node=\"", ) .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 f116acb05..949e30d6d 100644 --- a/vmm/src/api/openapi/cloud-hypervisor.yaml +++ b/vmm/src/api/openapi/cloud-hypervisor.yaml @@ -467,6 +467,8 @@ components: hugepages: type: boolean default: false + host_numa_node: + type: uint64 MemoryConfig: required: diff --git a/vmm/src/config.rs b/vmm/src/config.rs index 5709e58cc..7b3501783 100644 --- a/vmm/src/config.rs +++ b/vmm/src/config.rs @@ -352,6 +352,8 @@ pub struct MemoryZoneConfig { pub shared: bool, #[serde(default)] pub hugepages: bool, + #[serde(default)] + pub host_numa_node: Option, } #[derive(Clone, Debug, PartialEq, Deserialize, Serialize)] @@ -431,7 +433,8 @@ impl MemoryConfig { .add("size") .add("file") .add("shared") - .add("hugepages"); + .add("hugepages") + .add("host_numa_node"); parser.parse(memory_zone).map_err(Error::ParseMemoryZone)?; let size = parser @@ -450,12 +453,16 @@ impl MemoryConfig { .map_err(Error::ParseMemoryZone)? .unwrap_or(Toggle(false)) .0; + let host_numa_node = parser + .convert::("host_numa_node") + .map_err(Error::ParseMemoryZone)?; zones.push(MemoryZoneConfig { size, file, shared, hugepages, + host_numa_node, }); } Some(zones) diff --git a/vmm/src/memory_manager.rs b/vmm/src/memory_manager.rs index ef347c16f..7cc08f787 100644 --- a/vmm/src/memory_manager.rs +++ b/vmm/src/memory_manager.rs @@ -364,6 +364,7 @@ impl MemoryManager { file: None, shared: config.shared, hugepages: config.hugepages, + host_numa_node: None, }]; (config.size, zones)