提交 fa139130 编写于 作者: H Hu Tao 提交者: Eric Blake

Add a new function doStopCPUs

上级 54c68333
...@@ -579,6 +579,22 @@ static void qemuDomainObjExitRemoteWithDriver(struct qemud_driver *driver, ...@@ -579,6 +579,22 @@ static void qemuDomainObjExitRemoteWithDriver(struct qemud_driver *driver,
virDomainObjUnref(obj); virDomainObjUnref(obj);
} }
static int doStopCPUs(struct qemud_driver *driver, virDomainObjPtr vm)
{
int ret;
int oldState = vm->state;
qemuDomainObjPrivatePtr priv = vm->privateData;
vm->state = VIR_DOMAIN_PAUSED;
qemuDomainObjEnterMonitorWithDriver(driver, vm);
ret = qemuMonitorStopCPUs(priv->mon);
qemuDomainObjExitMonitorWithDriver(driver, vm);
if (ret < 0) {
vm->state = oldState;
}
return ret;
}
void qemuDomainDefNamespaceFree(void *nsdata) void qemuDomainDefNamespaceFree(void *nsdata)
{ {
qemuDomainCmdlineDefPtr cmd = nsdata; qemuDomainCmdlineDefPtr cmd = nsdata;
...@@ -4968,15 +4984,7 @@ static int qemudDomainSuspend(virDomainPtr dom) { ...@@ -4968,15 +4984,7 @@ static int qemudDomainSuspend(virDomainPtr dom) {
goto endjob; goto endjob;
} }
if (vm->state != VIR_DOMAIN_PAUSED) { if (vm->state != VIR_DOMAIN_PAUSED) {
int rc; if (doStopCPUs(driver, vm) < 0) {
int state = vm->state;
vm->state = VIR_DOMAIN_PAUSED;
qemuDomainObjEnterMonitorWithDriver(driver, vm);
rc = qemuMonitorStopCPUs(priv->mon);
qemuDomainObjExitMonitorWithDriver(driver, vm);
if (rc < 0) {
vm->state = state;
goto endjob; goto endjob;
} }
event = virDomainEventNewFromObj(vm, event = virDomainEventNewFromObj(vm,
...@@ -5350,15 +5358,9 @@ static int ...@@ -5350,15 +5358,9 @@ static int
qemuDomainMigrateOffline(struct qemud_driver *driver, qemuDomainMigrateOffline(struct qemud_driver *driver,
virDomainObjPtr vm) virDomainObjPtr vm)
{ {
qemuDomainObjPrivatePtr priv = vm->privateData;
int state = vm->state;
int ret; int ret;
vm->state = VIR_DOMAIN_PAUSED; ret = doStopCPUs(driver, vm);
qemuDomainObjEnterMonitorWithDriver(driver, vm);
ret = qemuMonitorStopCPUs(priv->mon);
qemuDomainObjExitMonitorWithDriver(driver, vm);
if (ret == 0) { if (ret == 0) {
virDomainEventPtr event; virDomainEventPtr event;
...@@ -5367,8 +5369,7 @@ qemuDomainMigrateOffline(struct qemud_driver *driver, ...@@ -5367,8 +5369,7 @@ qemuDomainMigrateOffline(struct qemud_driver *driver,
VIR_DOMAIN_EVENT_SUSPENDED_MIGRATED); VIR_DOMAIN_EVENT_SUSPENDED_MIGRATED);
if (event) if (event)
qemuDomainEventQueue(driver, event); qemuDomainEventQueue(driver, event);
} else }
vm->state = state;
return ret; return ret;
} }
...@@ -5630,14 +5631,8 @@ static int qemudDomainSaveFlag(struct qemud_driver *driver, virDomainPtr dom, ...@@ -5630,14 +5631,8 @@ static int qemudDomainSaveFlag(struct qemud_driver *driver, virDomainPtr dom,
/* Pause */ /* Pause */
if (vm->state == VIR_DOMAIN_RUNNING) { if (vm->state == VIR_DOMAIN_RUNNING) {
header.was_running = 1; header.was_running = 1;
vm->state = VIR_DOMAIN_PAUSED; if (doStopCPUs(driver, vm) < 0)
qemuDomainObjEnterMonitorWithDriver(driver, vm);
if (qemuMonitorStopCPUs(priv->mon) < 0) {
qemuDomainObjExitMonitorWithDriver(driver, vm);
vm->state = VIR_DOMAIN_RUNNING;
goto endjob; goto endjob;
}
qemuDomainObjExitMonitorWithDriver(driver, vm);
if (!virDomainObjIsActive(vm)) { if (!virDomainObjIsActive(vm)) {
qemuReportError(VIR_ERR_INTERNAL_ERROR, "%s", qemuReportError(VIR_ERR_INTERNAL_ERROR, "%s",
...@@ -6224,14 +6219,8 @@ static int qemudDomainCoreDump(virDomainPtr dom, ...@@ -6224,14 +6219,8 @@ static int qemudDomainCoreDump(virDomainPtr dom,
/* Pause domain for non-live dump */ /* Pause domain for non-live dump */
if (!(flags & VIR_DUMP_LIVE) && vm->state == VIR_DOMAIN_RUNNING) { if (!(flags & VIR_DUMP_LIVE) && vm->state == VIR_DOMAIN_RUNNING) {
vm->state = VIR_DOMAIN_PAUSED; if (doStopCPUs(driver, vm) < 0)
qemuDomainObjEnterMonitorWithDriver(driver, vm);
if (qemuMonitorStopCPUs(priv->mon) < 0) {
qemuDomainObjExitMonitorWithDriver(driver, vm);
vm->state = VIR_DOMAIN_RUNNING;
goto endjob; goto endjob;
}
qemuDomainObjExitMonitorWithDriver(driver, vm);
paused = 1; paused = 1;
if (!virDomainObjIsActive(vm)) { if (!virDomainObjIsActive(vm)) {
...@@ -12980,16 +12969,9 @@ static int qemuDomainRevertToSnapshot(virDomainSnapshotPtr snapshot, ...@@ -12980,16 +12969,9 @@ static int qemuDomainRevertToSnapshot(virDomainSnapshotPtr snapshot,
/* qemu unconditionally starts the domain running again after /* qemu unconditionally starts the domain running again after
* loadvm, so let's pause it to keep consistency * loadvm, so let's pause it to keep consistency
*/ */
int state = vm->state; rc = doStopCPUs(driver, vm);
priv = vm->privateData; if (rc < 0)
vm->state = VIR_DOMAIN_PAUSED;
qemuDomainObjEnterMonitorWithDriver(driver, vm);
rc = qemuMonitorStopCPUs(priv->mon);
qemuDomainObjExitMonitorWithDriver(driver, vm);
if (rc < 0) {
vm->state = state;
goto endjob; goto endjob;
}
} }
event = virDomainEventNewFromObj(vm, event = virDomainEventNewFromObj(vm,
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册