From e3b1549227f2c607d40fd37aee463a12bf358801 Mon Sep 17 00:00:00 2001 From: Leander Kohler Date: Fri, 13 Mar 2026 08:30:05 +0100 Subject: [PATCH 1/2] vmm: migration: emit lifecycle events Emit migration lifecycle events via the event monitor. This aligns migration with other VM lifecycle operations such as boot, pause, and resume, allowing external management software to observe migration progress consistently. Events emitted: src: vm.migration-started vm.migration-finished vm.migration-failed vm.migration-cancelled dst: vm.migration-receive-started vm.migration-receive-finished vm.migration-receive-failed Co-authored-by: Philipp Schuster On-behalf-of: SAP philipp.schuster@sap.com On-behalf-of: SAP leander.kohler@sap.com Signed-off-by: Leander Kohler --- vmm/src/lib.rs | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/vmm/src/lib.rs b/vmm/src/lib.rs index 75b06bb68b..d3b3fdeddf 100644 --- a/vmm/src/lib.rs +++ b/vmm/src/lib.rs @@ -869,6 +869,7 @@ impl MigrationWorker { /// Perform the migration and communicate with the [`Vmm`] thread. fn run(mut self) -> MigrationThreadOut { debug!("migration thread is starting"); + event!("vm", "migration-started"); let res = Vmm::send_migration( &mut self.vm, @@ -884,6 +885,7 @@ impl MigrationWorker { self.check_migration_evt.write(1).unwrap(); debug!("migration thread is finished"); + event!("vm", "migration-finished"); MigrationThreadOut { vm: self.vm, migration_res: res, @@ -3165,6 +3167,7 @@ impl Vmm { } Err(MigratableError::Cancelled) => { error!("Migration cancelled"); + event!("vm", "migration-cancelled"); try_resume_vm(vm); // Update migration progress snapshot @@ -3177,6 +3180,7 @@ impl Vmm { } Err(e) => { error!("Migration failed: {e}"); + event!("vm", "migration-failed"); try_resume_vm(vm); // Update migration progress snapshot @@ -4128,6 +4132,8 @@ impl RequestHandler for Vmm { MigratableError::MigrateReceive(e) })?; + event!("vm", "migration-receive-started"); + let mut state = ReceiveMigrationState::Established; let res: result::Result = loop { @@ -4164,6 +4170,7 @@ impl RequestHandler for Vmm { }; if matches!(res, Err(_) | Ok(ReceiveMigrationState::Aborted)) { + event!("vm", "migration-receive-failed"); self.vm = MaybeVmOwnership::None; self.vm_config = None; match res { @@ -4176,6 +4183,7 @@ impl RequestHandler for Vmm { } } + event!("vm", "migration-receive-finished"); Ok(()) } From eda2effe75a210da113b732041ee39ee19bb9bdc Mon Sep 17 00:00:00 2001 From: Leander Kohler Date: Fri, 13 Mar 2026 08:30:13 +0100 Subject: [PATCH 2/2] vmm: migration: emit event for each memory iteration Emit a "vm.migration-memory-iteration" event after every precopy memory iteration to allow management software to observe forward progress during migration. This event is primarily intended for integration with management software such as libvirt, where it maps to VIR_DOMAIN_EVENT_ID_MIGRATION_ITERATION. The event is intentionally independent of any upcoming migration metrics endpoint. Detailed migration statistics will be exposed via that endpoint, while this event provides a lightweight progress signal expected by external management layers. With this event, management software can detect forward progress during migration without being blocked on any upcoming migration metrics endpoint. Co-authored-by: Philipp Schuster On-behalf-of: SAP philipp.schuster@sap.com On-behalf-of: SAP leander.kohler@sap.com Signed-off-by: Leander Kohler --- vmm/src/lib.rs | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/vmm/src/lib.rs b/vmm/src/lib.rs index d3b3fdeddf..4b9c5679df 100644 --- a/vmm/src/lib.rs +++ b/vmm/src/lib.rs @@ -2655,6 +2655,14 @@ impl Vmm { s.iteration_duration = s.iteration_start_time.elapsed(); log_migration_progress(s, vm); + // Enables management software (e.g., libvirt) to easily track forward progress. + event!( + "vm", + "migration-memory-iteration", + "id", + format!("{}", s.iteration) + ); + // Increment iteration counter s.iteration += 1;