[PATCH 1/3] qemu: don't pause vm when creating internal snapshot

Nikolay Shirokovskiy nikolay.shirokovskiy at openvz.org
Mon Mar 21 15:16:49 UTC 2022


From: Maxim Nestratov <mnestratov at virtuozzo.com>

The pause was introduced in [1] in ancient times when probably distro's
QEMU does not have RESUME event. Yet the event was in the upstream QEMU at
the time version according to [2].

So the event is supported since QEMU version 0.13 which is much older
then oldest currently supported 2.11.0 version and we can remove manual
pause/resume. Except for the halt case.

[1] commit 346236fea97602e9e6529c5d41a32ed26b126082
Author: Jiri Denemark <jdenemar at redhat.com>
Date:   Thu Feb 24 16:46:44 2011 +0100

    qemu: Stop guest CPUs before creating a snapshot

commit 6ed2c484f261fd8bd217f855b9e5e5f981e63f0a
Author: Luiz Capitulino <lcapitulino at redhat.com>
Date:   Tue Apr 27 20:35:59 2010 -0300

    QMP: Introduce RESUME event

Signed-off-by: Nikolay Shirokovskiy <nikolay.shirokovskiy at openvz.org>
---
 src/qemu/qemu_snapshot.c | 29 ++++-------------------------
 1 file changed, 4 insertions(+), 25 deletions(-)

diff --git a/src/qemu/qemu_snapshot.c b/src/qemu/qemu_snapshot.c
index a7901779fc..a41c782c7f 100644
--- a/src/qemu/qemu_snapshot.c
+++ b/src/qemu/qemu_snapshot.c
@@ -291,23 +291,18 @@ qemuSnapshotCreateActiveInternal(virQEMUDriver *driver,
 {
     qemuDomainObjPrivate *priv = vm->privateData;
     virObjectEvent *event = NULL;
-    bool resume = false;
     virDomainSnapshotDef *snapdef = virDomainSnapshotObjGetDef(snap);
+    bool halt = !!(flags & VIR_DOMAIN_SNAPSHOT_CREATE_HALT);
     int ret = -1;
 
     if (!qemuMigrationSrcIsAllowed(driver, vm, false, 0))
         goto cleanup;
 
-    if (virDomainObjGetState(vm, NULL) == VIR_DOMAIN_RUNNING) {
-        /* savevm monitor command pauses the domain emitting an event which
-         * confuses libvirt since it's not notified when qemu resumes the
-         * domain. Thus we stop and start CPUs ourselves.
-         */
+    if (halt) {
         if (qemuProcessStopCPUs(driver, vm, VIR_DOMAIN_PAUSED_SAVE,
                                 QEMU_ASYNC_JOB_SNAPSHOT) < 0)
             goto cleanup;
 
-        resume = true;
         if (!virDomainObjIsActive(vm)) {
             virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
                            _("guest unexpectedly quit"));
@@ -316,10 +311,8 @@ qemuSnapshotCreateActiveInternal(virQEMUDriver *driver,
     }
 
     if (qemuDomainObjEnterMonitorAsync(driver, vm,
-                                       QEMU_ASYNC_JOB_SNAPSHOT) < 0) {
-        resume = false;
+                                       QEMU_ASYNC_JOB_SNAPSHOT) < 0)
         goto cleanup;
-    }
 
     ret = qemuMonitorCreateSnapshot(priv->mon, snap->def->name);
     qemuDomainObjExitMonitor(driver, vm);
@@ -329,29 +322,15 @@ qemuSnapshotCreateActiveInternal(virQEMUDriver *driver,
     if (!(snapdef->cookie = (virObject *) qemuDomainSaveCookieNew(vm)))
         goto cleanup;
 
-    if (flags & VIR_DOMAIN_SNAPSHOT_CREATE_HALT) {
+    if (halt) {
         event = virDomainEventLifecycleNewFromObj(vm, VIR_DOMAIN_EVENT_STOPPED,
                                          VIR_DOMAIN_EVENT_STOPPED_FROM_SNAPSHOT);
         qemuProcessStop(driver, vm, VIR_DOMAIN_SHUTOFF_FROM_SNAPSHOT,
                         QEMU_ASYNC_JOB_SNAPSHOT, 0);
         virDomainAuditStop(vm, "from-snapshot");
-        resume = false;
     }
 
  cleanup:
-    if (resume && virDomainObjIsActive(vm) &&
-        qemuProcessStartCPUs(driver, vm,
-                             VIR_DOMAIN_RUNNING_UNPAUSED,
-                             QEMU_ASYNC_JOB_SNAPSHOT) < 0) {
-        event = virDomainEventLifecycleNewFromObj(vm,
-                                         VIR_DOMAIN_EVENT_SUSPENDED,
-                                         VIR_DOMAIN_EVENT_SUSPENDED_API_ERROR);
-        if (virGetLastErrorCode() == VIR_ERR_OK) {
-            virReportError(VIR_ERR_OPERATION_FAILED, "%s",
-                           _("resuming after snapshot failed"));
-        }
-    }
-
     virObjectEventStateQueue(driver->domainEventState, event);
 
     return ret;
-- 
2.35.1



More information about the libvir-list mailing list