1
0
mirror of https://gitlab.com/libvirt/libvirt.git synced 2025-03-07 17:28:15 +00:00

qemu: Remove special case for virDomainSuspend

This commit is contained in:
Jiri Denemark 2011-07-19 02:27:38 +02:00 committed by Eric Blake
parent 63d15036cc
commit ad6cc26c8d
3 changed files with 27 additions and 32 deletions

View File

@ -74,7 +74,6 @@ enum qemuDomainAsyncJob {
enum qemuDomainJobSignals { enum qemuDomainJobSignals {
QEMU_JOB_SIGNAL_CANCEL = 1 << 0, /* Request job cancellation */ 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 { struct qemuDomainJobObj {

View File

@ -1331,6 +1331,8 @@ static int qemudDomainSuspend(virDomainPtr dom) {
int ret = -1; int ret = -1;
virDomainEventPtr event = NULL; virDomainEventPtr event = NULL;
qemuDomainObjPrivatePtr priv; qemuDomainObjPrivatePtr priv;
virDomainPausedReason reason;
int eventDetail;
qemuDriverLock(driver); qemuDriverLock(driver);
vm = virDomainFindByUUID(&driver->domains, dom->uuid); vm = virDomainFindByUUID(&driver->domains, dom->uuid);
@ -1357,35 +1359,33 @@ static int qemudDomainSuspend(virDomainPtr dom) {
priv = vm->privateData; priv = vm->privateData;
if (priv->job.asyncJob == QEMU_ASYNC_JOB_MIGRATION_OUT) { if (priv->job.asyncJob == QEMU_ASYNC_JOB_MIGRATION_OUT) {
if (virDomainObjGetState(vm, NULL) != VIR_DOMAIN_PAUSED) { reason = VIR_DOMAIN_PAUSED_MIGRATION;
VIR_DEBUG("Requesting domain pause on %s", eventDetail = VIR_DOMAIN_EVENT_SUSPENDED_MIGRATED;
vm->def->name);
priv->job.signals |= QEMU_JOB_SIGNAL_SUSPEND;
}
ret = 0;
goto cleanup;
} else { } else {
if (qemuDomainObjBeginJobWithDriver(driver, vm, QEMU_JOB_SUSPEND) < 0) reason = VIR_DOMAIN_PAUSED_USER;
goto cleanup; eventDetail = VIR_DOMAIN_EVENT_SUSPENDED_PAUSED;
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, 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;
} }
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;
}
event = virDomainEventNewFromObj(vm,
VIR_DOMAIN_EVENT_SUSPENDED,
eventDetail);
}
if (virDomainSaveStatus(driver->caps, driver->stateDir, vm) < 0)
goto endjob;
ret = 0;
endjob: endjob:
if (qemuDomainObjEndJob(driver, vm) == 0) if (qemuDomainObjEndJob(driver, vm) == 0)
vm = NULL; vm = NULL;

View File

@ -770,11 +770,6 @@ qemuMigrationProcessJobSignals(struct qemud_driver *driver,
if (ret < 0) { if (ret < 0) {
VIR_WARN("Unable to cancel job"); 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 { } else {
ret = 0; ret = 0;
} }
@ -2861,6 +2856,7 @@ qemuMigrationJobStart(struct qemud_driver *driver,
qemuDomainObjSetAsyncJobMask(vm, QEMU_JOB_NONE); qemuDomainObjSetAsyncJobMask(vm, QEMU_JOB_NONE);
} else { } else {
qemuDomainObjSetAsyncJobMask(vm, DEFAULT_JOB_MASK | qemuDomainObjSetAsyncJobMask(vm, DEFAULT_JOB_MASK |
JOB_MASK(QEMU_JOB_SUSPEND) |
JOB_MASK(QEMU_JOB_MIGRATION_OP)); JOB_MASK(QEMU_JOB_MIGRATION_OP));
} }