The corresponding event in QEMU is called MIGRATION_PASS.
Signed-off-by: Jiri Denemark <jdenemar@redhat.com>
}
+int
+qemuMonitorEmitMigrationPass(qemuMonitorPtr mon,
+ int pass)
+{
+ int ret = -1;
+ VIR_DEBUG("mon=%p, pass=%d", mon, pass);
+
+ QEMU_MONITOR_CALLBACK(mon, ret, domainMigrationPass, mon->vm, pass);
+
+ return ret;
+}
+
+
int
qemuMonitorSetCapabilities(qemuMonitorPtr mon)
{
int status,
void *opaque);
+typedef int (*qemuMonitorDomainMigrationPassCallback)(qemuMonitorPtr mon,
+ virDomainObjPtr vm,
+ int pass,
+ void *opaque);
+
typedef struct _qemuMonitorCallbacks qemuMonitorCallbacks;
typedef qemuMonitorCallbacks *qemuMonitorCallbacksPtr;
struct _qemuMonitorCallbacks {
qemuMonitorDomainSerialChangeCallback domainSerialChange;
qemuMonitorDomainSpiceMigratedCallback domainSpiceMigrated;
qemuMonitorDomainMigrationStatusCallback domainMigrationStatus;
+ qemuMonitorDomainMigrationPassCallback domainMigrationPass;
};
char *qemuMonitorEscapeArg(const char *in);
int qemuMonitorEmitSpiceMigrated(qemuMonitorPtr mon);
int qemuMonitorEmitMigrationStatus(qemuMonitorPtr mon,
int status);
+int qemuMonitorEmitMigrationPass(qemuMonitorPtr mon,
+ int pass);
int qemuMonitorStartCPUs(qemuMonitorPtr mon,
virConnectPtr conn);
static void qemuMonitorJSONHandleSerialChange(qemuMonitorPtr mon, virJSONValuePtr data);
static void qemuMonitorJSONHandleSpiceMigrated(qemuMonitorPtr mon, virJSONValuePtr data);
static void qemuMonitorJSONHandleMigrationStatus(qemuMonitorPtr mon, virJSONValuePtr data);
+static void qemuMonitorJSONHandleMigrationPass(qemuMonitorPtr mon, virJSONValuePtr data);
typedef struct {
const char *type;
{ "DEVICE_TRAY_MOVED", qemuMonitorJSONHandleTrayChange, },
{ "GUEST_PANICKED", qemuMonitorJSONHandleGuestPanic, },
{ "MIGRATION", qemuMonitorJSONHandleMigrationStatus, },
+ { "MIGRATION_PASS", qemuMonitorJSONHandleMigrationPass, },
{ "NIC_RX_FILTER_CHANGED", qemuMonitorJSONHandleNicRxFilterChanged, },
{ "POWERDOWN", qemuMonitorJSONHandlePowerdown, },
{ "RESET", qemuMonitorJSONHandleReset, },
}
+static void
+qemuMonitorJSONHandleMigrationPass(qemuMonitorPtr mon,
+ virJSONValuePtr data)
+{
+ int pass;
+
+ if (virJSONValueObjectGetNumberInt(data, "pass", &pass) < 0) {
+ VIR_WARN("missing dirty-sync-count in migration-pass event");
+ return;
+ }
+
+ qemuMonitorEmitMigrationPass(mon, pass);
+}
+
+
int
qemuMonitorJSONHumanCommandWithFd(qemuMonitorPtr mon,
const char *cmd_str,
}
+static int
+qemuProcessHandleMigrationPass(qemuMonitorPtr mon ATTRIBUTE_UNUSED,
+ virDomainObjPtr vm,
+ int pass,
+ void *opaque)
+{
+ virQEMUDriverPtr driver = opaque;
+ qemuDomainObjPrivatePtr priv;
+
+ virObjectLock(vm);
+
+ VIR_DEBUG("Migrating domain %p %s, iteration %d",
+ vm, vm->def->name, pass);
+
+ priv = vm->privateData;
+ if (priv->job.asyncJob == QEMU_ASYNC_JOB_NONE) {
+ VIR_DEBUG("got MIGRATION_PASS event without a migration job");
+ goto cleanup;
+ }
+
+ qemuDomainEventQueue(driver,
+ virDomainEventMigrationIterationNewFromObj(vm, pass));
+
+ cleanup:
+ virObjectUnlock(vm);
+ return 0;
+}
+
+
static qemuMonitorCallbacks monitorCallbacks = {
.eofNotify = qemuProcessHandleMonitorEOF,
.errorNotify = qemuProcessHandleMonitorError,
.domainSerialChange = qemuProcessHandleSerialChanged,
.domainSpiceMigrated = qemuProcessHandleSpiceMigrated,
.domainMigrationStatus = qemuProcessHandleMigrationStatus,
+ .domainMigrationPass = qemuProcessHandleMigrationPass,
};
static void