From 20aa811de772f2184e33ddf1a80a86d34979b02e Mon Sep 17 00:00:00 2001 From: Henry Wang Date: Thu, 5 Aug 2021 06:01:35 -0400 Subject: [PATCH] vmm: Extend NUMA setup to more than ACPI The AArch64 platform provides a NUMA binding for the device tree, which means on AArch64 platform, the NUMA setup can be extended to more than the ACPI feature. Based on above, this commit extends the NUMA setup and data structures to following scenarios: - All AArch64 platform - x86_64 platform with ACPI feature enabled Signed-off-by: Henry Wang Signed-off-by: Michael Zhao --- vmm/src/cpu.rs | 4 ++-- vmm/src/device_manager.rs | 15 ++++++++------- vmm/src/vm.rs | 18 ++++++++++-------- 3 files changed, 20 insertions(+), 17 deletions(-) diff --git a/vmm/src/cpu.rs b/vmm/src/cpu.rs index 0fabab841..c1bb67007 100644 --- a/vmm/src/cpu.rs +++ b/vmm/src/cpu.rs @@ -17,7 +17,7 @@ use crate::memory_manager::MemoryManager; use crate::seccomp_filters::{get_seccomp_filter, Thread}; #[cfg(target_arch = "x86_64")] use crate::vm::physical_bits; -#[cfg(feature = "acpi")] +#[cfg(any(target_arch = "aarch64", feature = "acpi"))] use crate::vm::NumaNodes; use crate::GuestMemoryMmap; use crate::CPU_MANAGER_SNAPSHOT_ID; @@ -531,7 +531,7 @@ impl CpuManager { seccomp_action: SeccompAction, vmmops: Arc, #[cfg(feature = "tdx")] tdx_enabled: bool, - #[cfg(feature = "acpi")] numa_nodes: &NumaNodes, + #[cfg(any(target_arch = "aarch64", feature = "acpi"))] numa_nodes: &NumaNodes, ) -> Result>> { let guest_memory = memory_manager.lock().unwrap().guest_memory(); let mut vcpu_states = Vec::with_capacity(usize::from(config.max_vcpus)); diff --git a/vmm/src/device_manager.rs b/vmm/src/device_manager.rs index 9c9fc8a6a..8eaede6df 100644 --- a/vmm/src/device_manager.rs +++ b/vmm/src/device_manager.rs @@ -22,7 +22,7 @@ use crate::interrupt::LegacyUserspaceInterruptManager; #[cfg(feature = "acpi")] use crate::memory_manager::MEMORY_MANAGER_ACPI_SIZE; use crate::memory_manager::{Error as MemoryManagerError, MemoryManager}; -#[cfg(feature = "acpi")] +#[cfg(any(target_arch = "aarch64", feature = "acpi"))] use crate::vm::NumaNodes; use crate::GuestRegionMmap; use crate::PciDeviceInfo; @@ -922,7 +922,7 @@ pub struct DeviceManager { seccomp_action: SeccompAction, // List of guest NUMA nodes. - #[cfg(feature = "acpi")] + #[cfg(any(target_arch = "aarch64", feature = "acpi"))] numa_nodes: NumaNodes, // Possible handle to the virtio-balloon device @@ -958,7 +958,7 @@ impl DeviceManager { _exit_evt: &EventFd, reset_evt: &EventFd, seccomp_action: SeccompAction, - #[cfg(feature = "acpi")] numa_nodes: NumaNodes, + #[cfg(any(target_arch = "aarch64", feature = "acpi"))] numa_nodes: NumaNodes, activate_evt: &EventFd, force_iommu: bool, restoring: bool, @@ -1021,7 +1021,7 @@ impl DeviceManager { #[cfg(target_arch = "aarch64")] id_to_dev_info: HashMap::new(), seccomp_action, - #[cfg(feature = "acpi")] + #[cfg(any(target_arch = "aarch64", feature = "acpi"))] numa_nodes, balloon: None, activate_evt: activate_evt @@ -2588,9 +2588,10 @@ impl DeviceManager { if let Some(virtio_mem_zone) = memory_zone.virtio_mem_zone() { let id = self.next_device_name(MEM_DEVICE_NAME_PREFIX)?; info!("Creating virtio-mem device: id = {}", id); - #[cfg(not(feature = "acpi"))] + + #[cfg(all(target_arch = "x86_64", not(feature = "acpi")))] let node_id: Option = None; - #[cfg(feature = "acpi")] + #[cfg(any(target_arch = "aarch64", feature = "acpi"))] let node_id = numa_node_id_from_memory_zone_id(&self.numa_nodes, _memory_zone_id) .map(|i| i as u16); @@ -3685,7 +3686,7 @@ impl DeviceManager { } } -#[cfg(feature = "acpi")] +#[cfg(any(target_arch = "aarch64", feature = "acpi"))] fn numa_node_id_from_memory_zone_id(numa_nodes: &NumaNodes, memory_zone_id: &str) -> Option { for (numa_node_id, numa_node) in numa_nodes.iter() { if numa_node diff --git a/vmm/src/vm.rs b/vmm/src/vm.rs index 74096faf0..954096a40 100644 --- a/vmm/src/vm.rs +++ b/vmm/src/vm.rs @@ -11,7 +11,7 @@ // SPDX-License-Identifier: Apache-2.0 AND BSD-3-Clause // -#[cfg(feature = "acpi")] +#[cfg(any(target_arch = "aarch64", feature = "acpi"))] use crate::config::NumaConfig; use crate::config::{ DeviceConfig, DiskConfig, FsConfig, HotplugMethod, NetConfig, PmemConfig, ValidationError, @@ -51,7 +51,9 @@ use signal_hook::{ iterator::Signals, }; use std::cmp; -use std::collections::{BTreeMap, HashMap}; +#[cfg(any(target_arch = "aarch64", feature = "acpi"))] +use std::collections::BTreeMap; +use std::collections::HashMap; use std::convert::TryInto; use std::ffi::CString; #[cfg(target_arch = "x86_64")] @@ -519,7 +521,7 @@ pub struct Vm { vm: Arc, #[cfg(all(feature = "kvm", target_arch = "x86_64"))] saved_clock: Option, - #[cfg(feature = "acpi")] + #[cfg(any(target_arch = "aarch64", feature = "acpi"))] numa_nodes: NumaNodes, seccomp_action: SeccompAction, exit_evt: EventFd, @@ -552,7 +554,7 @@ impl Vm { info!("Booting VM from config: {:?}", &config); // Create NUMA nodes based on NumaConfig. - #[cfg(feature = "acpi")] + #[cfg(any(target_arch = "aarch64", feature = "acpi"))] let numa_nodes = Self::create_numa_nodes(config.lock().unwrap().numa.clone(), &memory_manager)?; @@ -568,7 +570,7 @@ impl Vm { &exit_evt, &reset_evt, seccomp_action.clone(), - #[cfg(feature = "acpi")] + #[cfg(any(target_arch = "aarch64", feature = "acpi"))] numa_nodes.clone(), &activate_evt, force_iommu, @@ -606,7 +608,7 @@ impl Vm { vm_ops, #[cfg(feature = "tdx")] tdx_enabled, - #[cfg(feature = "acpi")] + #[cfg(any(target_arch = "aarch64", feature = "acpi"))] &numa_nodes, ) .map_err(Error::CpuManager)?; @@ -644,7 +646,7 @@ impl Vm { vm, #[cfg(all(feature = "kvm", target_arch = "x86_64"))] saved_clock: _saved_clock, - #[cfg(feature = "acpi")] + #[cfg(any(target_arch = "aarch64", feature = "acpi"))] numa_nodes, seccomp_action: seccomp_action.clone(), exit_evt, @@ -653,7 +655,7 @@ impl Vm { }) } - #[cfg(feature = "acpi")] + #[cfg(any(target_arch = "aarch64", feature = "acpi"))] fn create_numa_nodes( configs: Option>, memory_manager: &Arc>,