]> xenbits.xensource.com Git - libvirt.git/commitdiff
qemu: Remove special case for virDomainSuspend
authorJiri Denemark <jdenemar@redhat.com>
Tue, 19 Jul 2011 00:27:38 +0000 (02:27 +0200)
committerEric Blake <eblake@redhat.com>
Wed, 27 Jul 2011 14:45:17 +0000 (08:45 -0600)
src/qemu/qemu_domain.h
src/qemu/qemu_driver.c
src/qemu/qemu_migration.c

index 1593257811914412ffa360faaf564c284bc4878f..503b9ad0d47ea26d9376fb12d9f87ba58d36c83b 100644 (file)
@@ -74,7 +74,6 @@ enum qemuDomainAsyncJob {
 
 enum qemuDomainJobSignals {
     QEMU_JOB_SIGNAL_CANCEL  = 1 << 0, /* Request job cancellation */
-    QEMU_JOB_SIGNAL_SUSPEND = 1 << 1, /* Request VM suspend to finish live migration offline */
 };
 
 struct qemuDomainJobObj {
index 36453d392b9673f2bcd805b976ef55dc766efc0b..5da6c59388eaadd5583067459b909c1d52a66d9b 100644 (file)
@@ -1331,6 +1331,8 @@ static int qemudDomainSuspend(virDomainPtr dom) {
     int ret = -1;
     virDomainEventPtr event = NULL;
     qemuDomainObjPrivatePtr priv;
+    virDomainPausedReason reason;
+    int eventDetail;
 
     qemuDriverLock(driver);
     vm = virDomainFindByUUID(&driver->domains, dom->uuid);
@@ -1357,34 +1359,32 @@ static int qemudDomainSuspend(virDomainPtr dom) {
     priv = vm->privateData;
 
     if (priv->job.asyncJob == QEMU_ASYNC_JOB_MIGRATION_OUT) {
-        if (virDomainObjGetState(vm, NULL) != VIR_DOMAIN_PAUSED) {
-            VIR_DEBUG("Requesting domain pause on %s",
-                      vm->def->name);
-            priv->job.signals |= QEMU_JOB_SIGNAL_SUSPEND;
-        }
-        ret = 0;
-        goto cleanup;
+        reason = VIR_DOMAIN_PAUSED_MIGRATION;
+        eventDetail = VIR_DOMAIN_EVENT_SUSPENDED_MIGRATED;
     } else {
-        if (qemuDomainObjBeginJobWithDriver(driver, vm, QEMU_JOB_SUSPEND) < 0)
-            goto cleanup;
+        reason = VIR_DOMAIN_PAUSED_USER;
+        eventDetail = VIR_DOMAIN_EVENT_SUSPENDED_PAUSED;
+    }
 
-        if (!virDomainObjIsActive(vm)) {
-            qemuReportError(VIR_ERR_OPERATION_INVALID,
-                            "%s", _("domain is not running"));
+    if (qemuDomainObjBeginJobWithDriver(driver, vm, QEMU_JOB_SUSPEND) < 0)
+        goto cleanup;
+
+    if (!virDomainObjIsActive(vm)) {
+        qemuReportError(VIR_ERR_OPERATION_INVALID,
+                        "%s", _("domain is not running"));
+        goto endjob;
+    }
+    if (virDomainObjGetState(vm, NULL) != VIR_DOMAIN_PAUSED) {
+        if (qemuProcessStopCPUs(driver, vm, reason) < 0) {
             goto endjob;
         }
-        if (virDomainObjGetState(vm, NULL) != VIR_DOMAIN_PAUSED) {
-            if (qemuProcessStopCPUs(driver, vm, VIR_DOMAIN_PAUSED_USER) < 0) {
-                goto endjob;
-            }
-            event = virDomainEventNewFromObj(vm,
-                                             VIR_DOMAIN_EVENT_SUSPENDED,
-                                             VIR_DOMAIN_EVENT_SUSPENDED_PAUSED);
-        }
-        if (virDomainSaveStatus(driver->caps, driver->stateDir, vm) < 0)
-            goto endjob;
-        ret = 0;
+        event = virDomainEventNewFromObj(vm,
+                                         VIR_DOMAIN_EVENT_SUSPENDED,
+                                         eventDetail);
     }
+    if (virDomainSaveStatus(driver->caps, driver->stateDir, vm) < 0)
+        goto endjob;
+    ret = 0;
 
 endjob:
     if (qemuDomainObjEndJob(driver, vm) == 0)
index 6cef83705bc63d890e5a78876e8700592f45e60c..ebf61c05f37f3fc5e2dc2eff6324fda323fec39b 100644 (file)
@@ -770,11 +770,6 @@ qemuMigrationProcessJobSignals(struct qemud_driver *driver,
         if (ret < 0) {
             VIR_WARN("Unable to cancel job");
         }
-    } else if (priv->job.signals & QEMU_JOB_SIGNAL_SUSPEND) {
-        priv->job.signals ^= QEMU_JOB_SIGNAL_SUSPEND;
-        VIR_DEBUG("Pausing domain for non-live migration");
-        if (qemuMigrationSetOffline(driver, vm) < 0)
-            VIR_WARN("Unable to pause domain");
     } else {
         ret = 0;
     }
@@ -2861,6 +2856,7 @@ qemuMigrationJobStart(struct qemud_driver *driver,
         qemuDomainObjSetAsyncJobMask(vm, QEMU_JOB_NONE);
     } else {
         qemuDomainObjSetAsyncJobMask(vm, DEFAULT_JOB_MASK |
+                                     JOB_MASK(QEMU_JOB_SUSPEND) |
                                      JOB_MASK(QEMU_JOB_MIGRATION_OP));
     }