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

Add a new function doStartCPUs

上级 fa139130
...@@ -579,6 +579,21 @@ static void qemuDomainObjExitRemoteWithDriver(struct qemud_driver *driver, ...@@ -579,6 +579,21 @@ static void qemuDomainObjExitRemoteWithDriver(struct qemud_driver *driver,
virDomainObjUnref(obj); virDomainObjUnref(obj);
} }
static int doStartCPUs(struct qemud_driver *driver, virDomainObjPtr vm, virConnectPtr conn)
{
int ret;
qemuDomainObjPrivatePtr priv = vm->privateData;
qemuDomainObjEnterMonitorWithDriver(driver, vm);
ret = qemuMonitorStartCPUs(priv->mon, conn);
if (ret == 0) {
vm->state = VIR_DOMAIN_RUNNING;
}
qemuDomainObjExitMonitorWithDriver(driver, vm);
return ret;
}
static int doStopCPUs(struct qemud_driver *driver, virDomainObjPtr vm) static int doStopCPUs(struct qemud_driver *driver, virDomainObjPtr vm)
{ {
int ret; int ret;
...@@ -4245,19 +4260,18 @@ static int qemudStartVMDaemon(virConnectPtr conn, ...@@ -4245,19 +4260,18 @@ static int qemudStartVMDaemon(virConnectPtr conn,
qemuDomainObjExitMonitorWithDriver(driver, vm); qemuDomainObjExitMonitorWithDriver(driver, vm);
goto cleanup; goto cleanup;
} }
qemuDomainObjExitMonitorWithDriver(driver, vm);
if (!start_paused) { if (!start_paused) {
DEBUG0("Starting domain CPUs"); DEBUG0("Starting domain CPUs");
/* Allow the CPUS to start executing */ /* Allow the CPUS to start executing */
if (qemuMonitorStartCPUs(priv->mon, conn) < 0) { if (doStartCPUs(driver, vm, conn) < 0) {
if (virGetLastError() == NULL) if (virGetLastError() == NULL)
qemuReportError(VIR_ERR_INTERNAL_ERROR, qemuReportError(VIR_ERR_INTERNAL_ERROR,
"%s", _("resume operation failed")); "%s", _("resume operation failed"));
qemuDomainObjExitMonitorWithDriver(driver, vm);
goto cleanup; goto cleanup;
} }
} }
qemuDomainObjExitMonitorWithDriver(driver, vm);
DEBUG0("Writing domain status to disk"); DEBUG0("Writing domain status to disk");
...@@ -5037,17 +5051,12 @@ static int qemudDomainResume(virDomainPtr dom) { ...@@ -5037,17 +5051,12 @@ static int qemudDomainResume(virDomainPtr dom) {
goto endjob; goto endjob;
} }
if (vm->state == VIR_DOMAIN_PAUSED) { if (vm->state == VIR_DOMAIN_PAUSED) {
qemuDomainObjPrivatePtr priv = vm->privateData; if (doStartCPUs(driver, vm, dom->conn) < 0) {
qemuDomainObjEnterMonitorWithDriver(driver, vm);
if (qemuMonitorStartCPUs(priv->mon, dom->conn) < 0) {
qemuDomainObjExitMonitorWithDriver(driver, vm);
if (virGetLastError() == NULL) if (virGetLastError() == NULL)
qemuReportError(VIR_ERR_OPERATION_FAILED, qemuReportError(VIR_ERR_OPERATION_FAILED,
"%s", _("resume operation failed")); "%s", _("resume operation failed"));
goto endjob; goto endjob;
} }
qemuDomainObjExitMonitorWithDriver(driver, vm);
vm->state = VIR_DOMAIN_RUNNING;
event = virDomainEventNewFromObj(vm, event = virDomainEventNewFromObj(vm,
VIR_DOMAIN_EVENT_RESUMED, VIR_DOMAIN_EVENT_RESUMED,
VIR_DOMAIN_EVENT_RESUMED_UNPAUSED); VIR_DOMAIN_EVENT_RESUMED_UNPAUSED);
...@@ -5861,13 +5870,9 @@ endjob: ...@@ -5861,13 +5870,9 @@ endjob:
if (vm) { if (vm) {
if (ret != 0) { if (ret != 0) {
if (header.was_running && virDomainObjIsActive(vm)) { if (header.was_running && virDomainObjIsActive(vm)) {
qemuDomainObjEnterMonitorWithDriver(driver, vm); rc = doStartCPUs(driver, vm, dom->conn);
rc = qemuMonitorStartCPUs(priv->mon, dom->conn);
qemuDomainObjExitMonitorWithDriver(driver, vm);
if (rc < 0) if (rc < 0)
VIR_WARN0("Unable to resume guest CPUs after save failure"); VIR_WARN0("Unable to resume guest CPUs after save failure");
else
vm->state = VIR_DOMAIN_RUNNING;
} }
if (cgroup != NULL) { if (cgroup != NULL) {
...@@ -6249,14 +6254,11 @@ endjob: ...@@ -6249,14 +6254,11 @@ endjob:
will support synchronous operations so we always get here after will support synchronous operations so we always get here after
the migration is complete. */ the migration is complete. */
else if (resume && paused && virDomainObjIsActive(vm)) { else if (resume && paused && virDomainObjIsActive(vm)) {
qemuDomainObjEnterMonitorWithDriver(driver, vm); if (doStartCPUs(driver, vm, dom->conn) < 0) {
if (qemuMonitorStartCPUs(priv->mon, dom->conn) < 0) {
if (virGetLastError() == NULL) if (virGetLastError() == NULL)
qemuReportError(VIR_ERR_OPERATION_FAILED, qemuReportError(VIR_ERR_OPERATION_FAILED,
"%s", _("resuming after dump failed")); "%s", _("resuming after dump failed"));
} }
qemuDomainObjExitMonitorWithDriver(driver, vm);
vm->state = VIR_DOMAIN_RUNNING;
} }
if (qemuDomainObjEndJob(vm) == 0) if (qemuDomainObjEndJob(vm) == 0)
...@@ -6288,8 +6290,6 @@ static void processWatchdogEvent(void *data, void *opaque) ...@@ -6288,8 +6290,6 @@ static void processWatchdogEvent(void *data, void *opaque)
char *dumpfile; char *dumpfile;
int i; int i;
qemuDomainObjPrivatePtr priv = wdEvent->vm->privateData;
i = virAsprintf(&dumpfile, "%s/%s-%u", i = virAsprintf(&dumpfile, "%s/%s-%u",
driver->autoDumpPath, driver->autoDumpPath,
wdEvent->vm->def->name, wdEvent->vm->def->name,
...@@ -6315,9 +6315,7 @@ static void processWatchdogEvent(void *data, void *opaque) ...@@ -6315,9 +6315,7 @@ static void processWatchdogEvent(void *data, void *opaque)
qemuReportError(VIR_ERR_OPERATION_FAILED, qemuReportError(VIR_ERR_OPERATION_FAILED,
"%s", _("Dump failed")); "%s", _("Dump failed"));
qemuDomainObjEnterMonitorWithDriver(driver, wdEvent->vm); ret = doStartCPUs(driver, wdEvent->vm, NULL);
ret = qemuMonitorStartCPUs(priv->mon, NULL);
qemuDomainObjExitMonitorWithDriver(driver, wdEvent->vm);
if (ret < 0) if (ret < 0)
qemuReportError(VIR_ERR_OPERATION_FAILED, qemuReportError(VIR_ERR_OPERATION_FAILED,
...@@ -7172,17 +7170,12 @@ qemudDomainSaveImageStartVM(virConnectPtr conn, ...@@ -7172,17 +7170,12 @@ qemudDomainSaveImageStartVM(virConnectPtr conn,
/* If it was running before, resume it now. */ /* If it was running before, resume it now. */
if (header->was_running) { if (header->was_running) {
qemuDomainObjPrivatePtr priv = vm->privateData; if (doStartCPUs(driver, vm, conn) < 0) {
qemuDomainObjEnterMonitorWithDriver(driver, vm);
if (qemuMonitorStartCPUs(priv->mon, conn) < 0) {
if (virGetLastError() == NULL) if (virGetLastError() == NULL)
qemuReportError(VIR_ERR_OPERATION_FAILED, qemuReportError(VIR_ERR_OPERATION_FAILED,
"%s", _("failed to resume domain")); "%s", _("failed to resume domain"));
qemuDomainObjExitMonitorWithDriver(driver,vm);
goto out; goto out;
} }
qemuDomainObjExitMonitorWithDriver(driver, vm);
vm->state = VIR_DOMAIN_RUNNING;
if (virDomainSaveStatus(driver->caps, driver->stateDir, vm) < 0) { if (virDomainSaveStatus(driver->caps, driver->stateDir, vm) < 0) {
VIR_WARN("Failed to save status on vm %s", vm->def->name); VIR_WARN("Failed to save status on vm %s", vm->def->name);
goto out; goto out;
...@@ -11936,8 +11929,7 @@ qemudDomainMigratePerform (virDomainPtr dom, ...@@ -11936,8 +11929,7 @@ qemudDomainMigratePerform (virDomainPtr dom,
endjob: endjob:
if (resume && vm->state == VIR_DOMAIN_PAUSED) { if (resume && vm->state == VIR_DOMAIN_PAUSED) {
/* we got here through some sort of failure; start the domain again */ /* we got here through some sort of failure; start the domain again */
qemuDomainObjEnterMonitorWithDriver(driver, vm); if (doStartCPUs(driver, vm, dom->conn) < 0) {
if (qemuMonitorStartCPUs(priv->mon, dom->conn) < 0) {
/* Hm, we already know we are in error here. We don't want to /* Hm, we already know we are in error here. We don't want to
* overwrite the previous error, though, so we just throw something * overwrite the previous error, though, so we just throw something
* to the logs and hope for the best * to the logs and hope for the best
...@@ -11945,9 +11937,7 @@ endjob: ...@@ -11945,9 +11937,7 @@ endjob:
VIR_ERROR(_("Failed to resume guest %s after failure"), VIR_ERROR(_("Failed to resume guest %s after failure"),
vm->def->name); vm->def->name);
} }
qemuDomainObjExitMonitorWithDriver(driver, vm);
vm->state = VIR_DOMAIN_RUNNING;
event = virDomainEventNewFromObj(vm, event = virDomainEventNewFromObj(vm,
VIR_DOMAIN_EVENT_RESUMED, VIR_DOMAIN_EVENT_RESUMED,
VIR_DOMAIN_EVENT_RESUMED_MIGRATED); VIR_DOMAIN_EVENT_RESUMED_MIGRATED);
...@@ -12103,17 +12093,12 @@ qemudDomainMigrateFinish2 (virConnectPtr dconn, ...@@ -12103,17 +12093,12 @@ qemudDomainMigrateFinish2 (virConnectPtr dconn,
* >= 0.10.6 to work properly. This isn't strictly necessary on * >= 0.10.6 to work properly. This isn't strictly necessary on
* older qemu's, but it also doesn't hurt anything there * older qemu's, but it also doesn't hurt anything there
*/ */
qemuDomainObjEnterMonitorWithDriver(driver, vm); if (doStartCPUs(driver, vm, dconn) < 0) {
if (qemuMonitorStartCPUs(priv->mon, dconn) < 0) {
if (virGetLastError() == NULL) if (virGetLastError() == NULL)
qemuReportError(VIR_ERR_INTERNAL_ERROR, qemuReportError(VIR_ERR_INTERNAL_ERROR,
"%s", _("resume operation failed")); "%s", _("resume operation failed"));
qemuDomainObjExitMonitorWithDriver(driver, vm);
goto endjob; goto endjob;
} }
qemuDomainObjExitMonitorWithDriver(driver, vm);
vm->state = VIR_DOMAIN_RUNNING;
} }
event = virDomainEventNewFromObj(vm, event = virDomainEventNewFromObj(vm,
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册