[libvirt] [PATCH 05/27] Add API for 'stop' monitor command

Daniel P. Berrange berrange at redhat.com
Thu Sep 24 15:00:07 UTC 2009


* src/qemu/qemu_monitor.c, src/qemu/qemu_monitor.h: Add a new
  qemuMonitorStopCPUs() API
* src/qemu/qemu_driver.c: Replace direct monitor commands for 'stop'
  with qemuMonitorStopCPUs()
---
 src/qemu/qemu_driver.c       |   28 ++++------------------------
 src/qemu/qemu_monitor_text.c |   13 +++++++++++++
 src/qemu/qemu_monitor_text.h |    1 +
 3 files changed, 18 insertions(+), 24 deletions(-)

diff --git a/src/qemu/qemu_driver.c b/src/qemu/qemu_driver.c
index 1717cbd..5ebd4b7 100644
--- a/src/qemu/qemu_driver.c
+++ b/src/qemu/qemu_driver.c
@@ -2749,7 +2749,6 @@ cleanup:
 
 static int qemudDomainSuspend(virDomainPtr dom) {
     struct qemud_driver *driver = dom->conn->privateData;
-    char *info;
     virDomainObjPtr vm;
     int ret = -1;
     virDomainEventPtr event = NULL;
@@ -2770,17 +2769,12 @@ static int qemudDomainSuspend(virDomainPtr dom) {
         goto cleanup;
     }
     if (vm->state != VIR_DOMAIN_PAUSED) {
-        if (qemudMonitorCommand(vm, "stop", &info) < 0) {
-            qemudReportError(dom->conn, dom, NULL, VIR_ERR_OPERATION_FAILED,
-                             "%s", _("suspend operation failed"));
+        if (qemuMonitorStopCPUs(vm) < 0)
             goto cleanup;
-        }
         vm->state = VIR_DOMAIN_PAUSED;
-        qemudDebug("Reply %s", info);
         event = virDomainEventNewFromObj(vm,
                                          VIR_DOMAIN_EVENT_SUSPENDED,
                                          VIR_DOMAIN_EVENT_SUSPENDED_PAUSED);
-        VIR_FREE(info);
     }
     if (virDomainSaveStatus(dom->conn, driver->stateDir, vm) < 0)
         goto cleanup;
@@ -3365,13 +3359,9 @@ static int qemudDomainSave(virDomainPtr dom,
     /* Pause */
     if (vm->state == VIR_DOMAIN_RUNNING) {
         header.was_running = 1;
-        if (qemudMonitorCommand(vm, "stop", &info) < 0) {
-            qemudReportError(dom->conn, dom, NULL, VIR_ERR_OPERATION_FAILED,
-                             "%s", _("suspend operation failed"));
+        if (qemuMonitorStopCPUs(vm) < 0)
             goto cleanup;
-        }
         vm->state = VIR_DOMAIN_PAUSED;
-        qemudDebug("Reply %s", info);
         VIR_FREE(info);
     }
 
@@ -3527,13 +3517,8 @@ static int qemudDomainCoreDump(virDomainPtr dom,
 
     /* Pause domain for non-live dump */
     if (vm->state == VIR_DOMAIN_RUNNING) {
-        if (qemudMonitorCommand (vm, "stop", &info) < 0) {
-            qemudReportError(dom->conn, dom, NULL, VIR_ERR_OPERATION_FAILED,
-                             "%s", _("suspending before dump failed"));
+        if (qemuMonitorStopCPUs(vm) < 0)
             goto cleanup;
-        }
-        DEBUG ("%s: stop reply: %s", vm->def->name, info);
-        VIR_FREE(info);
         paused = 1;
     }
 
@@ -6747,13 +6732,8 @@ qemudDomainMigratePerform (virDomainPtr dom,
 
     if (!(flags & VIR_MIGRATE_LIVE)) {
         /* Pause domain for non-live migration */
-        if (qemudMonitorCommand (vm, "stop", &info) < 0) {
-            qemudReportError(dom->conn, dom, NULL, VIR_ERR_OPERATION_FAILED,
-                             "%s", _("off-line migration specified, but suspend operation failed"));
+        if (qemuMonitorStopCPUs(vm) < 0)
             goto cleanup;
-        }
-        DEBUG ("%s: stop reply: %s", vm->def->name, info);
-        VIR_FREE(info);
         paused = 1;
 
         event = virDomainEventNewFromObj(vm,
diff --git a/src/qemu/qemu_monitor_text.c b/src/qemu/qemu_monitor_text.c
index 3c12073..ec30e72 100644
--- a/src/qemu/qemu_monitor_text.c
+++ b/src/qemu/qemu_monitor_text.c
@@ -438,6 +438,19 @@ qemuMonitorStartCPUs(virConnectPtr conn,
 }
 
 
+int
+qemuMonitorStopCPUs(const virDomainObjPtr vm) {
+    char *info;
+
+    if (qemudMonitorCommand(vm, "stop", &info) < 0) {
+        qemudReportError(NULL, NULL, NULL, VIR_ERR_OPERATION_FAILED,
+                         "%s", _("cannot stop CPU execution"));
+        return -1;
+    }
+    VIR_FREE(info);
+    return 0;
+}
+
 int qemuMonitorGetCPUInfo(const virDomainObjPtr vm,
                           int **pids)
 {
diff --git a/src/qemu/qemu_monitor_text.h b/src/qemu/qemu_monitor_text.h
index 2632ecf..eb1ba44 100644
--- a/src/qemu/qemu_monitor_text.h
+++ b/src/qemu/qemu_monitor_text.h
@@ -67,6 +67,7 @@ int qemudMonitorCommandExtra(const virDomainObjPtr vm,
 
 int qemuMonitorStartCPUs(virConnectPtr conn,
                          const virDomainObjPtr vm);
+int qemuMonitorStopCPUs(const virDomainObjPtr vm);
 
 int qemuMonitorGetCPUInfo(const virDomainObjPtr vm,
                           int **pids);
-- 
1.6.2.5




More information about the libvir-list mailing list