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,14 +1359,13 @@ 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 {
reason = VIR_DOMAIN_PAUSED_USER;
eventDetail = VIR_DOMAIN_EVENT_SUSPENDED_PAUSED;
}
if (qemuDomainObjBeginJobWithDriver(driver, vm, QEMU_JOB_SUSPEND) < 0) if (qemuDomainObjBeginJobWithDriver(driver, vm, QEMU_JOB_SUSPEND) < 0)
goto cleanup; goto cleanup;
@ -1374,17 +1375,16 @@ static int qemudDomainSuspend(virDomainPtr dom) {
goto endjob; goto endjob;
} }
if (virDomainObjGetState(vm, NULL) != VIR_DOMAIN_PAUSED) { if (virDomainObjGetState(vm, NULL) != VIR_DOMAIN_PAUSED) {
if (qemuProcessStopCPUs(driver, vm, VIR_DOMAIN_PAUSED_USER) < 0) { if (qemuProcessStopCPUs(driver, vm, reason) < 0) {
goto endjob; goto endjob;
} }
event = virDomainEventNewFromObj(vm, event = virDomainEventNewFromObj(vm,
VIR_DOMAIN_EVENT_SUSPENDED, VIR_DOMAIN_EVENT_SUSPENDED,
VIR_DOMAIN_EVENT_SUSPENDED_PAUSED); eventDetail);
} }
if (virDomainSaveStatus(driver->caps, driver->stateDir, vm) < 0) if (virDomainSaveStatus(driver->caps, driver->stateDir, vm) < 0)
goto endjob; goto endjob;
ret = 0; ret = 0;
}
endjob: endjob:
if (qemuDomainObjEndJob(driver, vm) == 0) if (qemuDomainObjEndJob(driver, vm) == 0)

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));
} }