* 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