vmm: Update memory zones

We consume `zone_updates` from `VmReceiveMigrationData` and
`RestoreConfig` to remap already existing `MemoryZone`s to different
host NUMA nodes. For now, we do not support further changes, such as
altering the size of the respective `MemoryZone`s.

These changes allow to migrate a VM to a host that has the capacity to
host the same `MemoryZone`s on a different NUMA layout.

Signed-off-by: Pascal Scholz <pascal.scholz@cyberus-technology.de>
On-behalf-of: SAP pascal.scholz@sap.com
This commit is contained in:
Pascal Scholz
2026-07-20 14:28:57 +02:00
committed by Rob Bradford
parent 9198fcf833
commit ad3790a0ea
2 changed files with 15 additions and 1 deletions

View File

@@ -1178,6 +1178,7 @@ impl Vmm {
T: Read, T: Read,
{ {
let mode = receive_data_migration.memory_mode; let mode = receive_data_migration.memory_mode;
let zone_updates = &receive_data_migration.zone_updates;
// Read in config data along with memory manager data // Read in config data along with memory manager data
let mut data: Vec<u8> = Vec::new(); let mut data: Vec<u8> = Vec::new();
@@ -1222,6 +1223,10 @@ impl Vmm {
&vm_migration_config.common_cpuid, &vm_migration_config.common_cpuid,
)?; )?;
update_memory_zones(zone_updates, &vm_migration_config.vm_config).map_err(|e| {
MigratableError::MigrateReceive(anyhow!("Error updating memory zones: {e:?}"))
})?;
let config = vm_migration_config.vm_config.clone(); let config = vm_migration_config.vm_config.clone();
self.vm_config = Some(vm_migration_config.vm_config); self.vm_config = Some(vm_migration_config.vm_config);
self.console_info = Some( self.console_info = Some(
@@ -2518,6 +2523,11 @@ impl RequestHandler for Vmm {
.iommufd_fd = Some(iommufd_fd); .iommufd_fd = Some(iommufd_fd);
} }
update_memory_zones(&restore_cfg.zone_updates, &vm_config).map_err(|e| {
error!("VM Restore failed: {e:?}");
VmError::ApplyMemoryZoneUpdate(e)
})?;
self.vm_restore( self.vm_restore(
source_url, source_url,
vm_config, vm_config,

View File

@@ -120,7 +120,7 @@ use crate::vm_config::{
}; };
use crate::{ use crate::{
CPU_MANAGER_SNAPSHOT_ID, DEVICE_MANAGER_SNAPSHOT_ID, GuestMemoryMmap, CPU_MANAGER_SNAPSHOT_ID, DEVICE_MANAGER_SNAPSHOT_ID, GuestMemoryMmap,
MEMORY_MANAGER_SNAPSHOT_ID, PciDeviceInfo, acpi, cpu, MEMORY_MANAGER_SNAPSHOT_ID, MemoryZoneUpdateError, PciDeviceInfo, acpi, cpu,
}; };
/// Errors associated with VM management /// Errors associated with VM management
@@ -399,6 +399,10 @@ pub enum Error {
#[cfg(feature = "fw_cfg")] #[cfg(feature = "fw_cfg")]
#[error("Error using fw_cfg while disabled")] #[error("Error using fw_cfg while disabled")]
FwCfgDisabled, FwCfgDisabled,
/// Cannot apply NUMA memory zone updates
#[error("Error applying memory zone updates")]
ApplyMemoryZoneUpdate(#[source] MemoryZoneUpdateError),
} }
pub type Result<T> = result::Result<T, Error>; pub type Result<T> = result::Result<T, Error>;