|
|
7a3408 |
From a72b20b3cb4837a87cdeb50fd625ccfe7a6c76a7 Mon Sep 17 00:00:00 2001
|
|
|
7a3408 |
Message-Id: <a72b20b3cb4837a87cdeb50fd625ccfe7a6c76a7@dist-git>
|
|
|
7a3408 |
From: Jiri Denemark <jdenemar@redhat.com>
|
|
|
7a3408 |
Date: Thu, 28 May 2015 13:35:52 +0200
|
|
|
7a3408 |
Subject: [PATCH] qemu_monitor: Wire up MIGRATION event
|
|
|
7a3408 |
|
|
|
7a3408 |
Thanks to Juan's work QEMU finally emits an event whenever migration
|
|
|
7a3408 |
state changes.
|
|
|
7a3408 |
|
|
|
7a3408 |
Signed-off-by: Jiri Denemark <jdenemar@redhat.com>
|
|
|
7a3408 |
(cherry picked from commit a60ee613c499c255faf7c36e7cd8582b5a79ca57)
|
|
|
7a3408 |
|
|
|
7a3408 |
https://bugzilla.redhat.com/show_bug.cgi?id=1212077
|
|
|
7a3408 |
|
|
|
7a3408 |
Signed-off-by: Jiri Denemark <jdenemar@redhat.com>
|
|
|
7a3408 |
---
|
|
|
7a3408 |
src/qemu/qemu_capabilities.c | 2 ++
|
|
|
7a3408 |
src/qemu/qemu_capabilities.h | 1 +
|
|
|
7a3408 |
src/qemu/qemu_monitor.c | 14 ++++++++++++++
|
|
|
7a3408 |
src/qemu/qemu_monitor.h | 8 ++++++++
|
|
|
7a3408 |
src/qemu/qemu_monitor_json.c | 23 +++++++++++++++++++++++
|
|
|
7a3408 |
5 files changed, 48 insertions(+)
|
|
|
7a3408 |
|
|
|
7a3408 |
diff --git a/src/qemu/qemu_capabilities.c b/src/qemu/qemu_capabilities.c
|
|
|
7a3408 |
index 89d63e5..b4a6961 100644
|
|
|
7a3408 |
--- a/src/qemu/qemu_capabilities.c
|
|
|
7a3408 |
+++ b/src/qemu/qemu_capabilities.c
|
|
|
7a3408 |
@@ -287,6 +287,7 @@ VIR_ENUM_IMPL(virQEMUCaps, QEMU_CAPS_LAST,
|
|
|
7a3408 |
"aarch64-off",
|
|
|
7a3408 |
|
|
|
7a3408 |
"vhost-user-multiqueue", /* 190 */
|
|
|
7a3408 |
+ "migration-event",
|
|
|
7a3408 |
);
|
|
|
7a3408 |
|
|
|
7a3408 |
|
|
|
7a3408 |
@@ -1506,6 +1507,7 @@ struct virQEMUCapsStringFlags virQEMUCapsEvents[] = {
|
|
|
7a3408 |
{ "BALLOON_CHANGE", QEMU_CAPS_BALLOON_EVENT },
|
|
|
7a3408 |
{ "SPICE_MIGRATE_COMPLETED", QEMU_CAPS_SEAMLESS_MIGRATION },
|
|
|
7a3408 |
{ "DEVICE_DELETED", QEMU_CAPS_DEVICE_DEL_EVENT },
|
|
|
7a3408 |
+ { "MIGRATION", QEMU_CAPS_MIGRATION_EVENT },
|
|
|
7a3408 |
};
|
|
|
7a3408 |
|
|
|
7a3408 |
struct virQEMUCapsStringFlags virQEMUCapsObjectTypes[] = {
|
|
|
7a3408 |
diff --git a/src/qemu/qemu_capabilities.h b/src/qemu/qemu_capabilities.h
|
|
|
7a3408 |
index 30aa504..f77bd06 100644
|
|
|
7a3408 |
--- a/src/qemu/qemu_capabilities.h
|
|
|
7a3408 |
+++ b/src/qemu/qemu_capabilities.h
|
|
|
7a3408 |
@@ -230,6 +230,7 @@ typedef enum {
|
|
|
7a3408 |
QEMU_CAPS_DEVICE_PCI_SERIAL = 188, /* -device pci-serial */
|
|
|
7a3408 |
QEMU_CAPS_CPU_AARCH64_OFF = 189, /* -cpu ...,aarch64=off */
|
|
|
7a3408 |
QEMU_CAPS_VHOSTUSER_MULTIQUEUE = 190, /* vhost-user with -netdev queues= */
|
|
|
7a3408 |
+ QEMU_CAPS_MIGRATION_EVENT = 191, /* MIGRATION event */
|
|
|
7a3408 |
|
|
|
7a3408 |
QEMU_CAPS_LAST, /* this must always be the last item */
|
|
|
7a3408 |
} virQEMUCapsFlags;
|
|
|
7a3408 |
diff --git a/src/qemu/qemu_monitor.c b/src/qemu/qemu_monitor.c
|
|
|
7a3408 |
index 9c70211..dd742cf 100644
|
|
|
7a3408 |
--- a/src/qemu/qemu_monitor.c
|
|
|
7a3408 |
+++ b/src/qemu/qemu_monitor.c
|
|
|
7a3408 |
@@ -1498,6 +1498,20 @@ qemuMonitorEmitSpiceMigrated(qemuMonitorPtr mon)
|
|
|
7a3408 |
|
|
|
7a3408 |
|
|
|
7a3408 |
int
|
|
|
7a3408 |
+qemuMonitorEmitMigrationStatus(qemuMonitorPtr mon,
|
|
|
7a3408 |
+ int status)
|
|
|
7a3408 |
+{
|
|
|
7a3408 |
+ int ret = -1;
|
|
|
7a3408 |
+ VIR_DEBUG("mon=%p, status=%s",
|
|
|
7a3408 |
+ mon, NULLSTR(qemuMonitorMigrationStatusTypeToString(status)));
|
|
|
7a3408 |
+
|
|
|
7a3408 |
+ QEMU_MONITOR_CALLBACK(mon, ret, domainMigrationStatus, mon->vm, status);
|
|
|
7a3408 |
+
|
|
|
7a3408 |
+ return ret;
|
|
|
7a3408 |
+}
|
|
|
7a3408 |
+
|
|
|
7a3408 |
+
|
|
|
7a3408 |
+int
|
|
|
7a3408 |
qemuMonitorSetCapabilities(qemuMonitorPtr mon)
|
|
|
7a3408 |
{
|
|
|
7a3408 |
QEMU_CHECK_MONITOR(mon);
|
|
|
7a3408 |
diff --git a/src/qemu/qemu_monitor.h b/src/qemu/qemu_monitor.h
|
|
|
7a3408 |
index 87167e3..d2b2f94 100644
|
|
|
7a3408 |
--- a/src/qemu/qemu_monitor.h
|
|
|
7a3408 |
+++ b/src/qemu/qemu_monitor.h
|
|
|
7a3408 |
@@ -186,6 +186,11 @@ typedef int (*qemuMonitorDomainSpiceMigratedCallback)(qemuMonitorPtr mon,
|
|
|
7a3408 |
virDomainObjPtr vm,
|
|
|
7a3408 |
void *opaque);
|
|
|
7a3408 |
|
|
|
7a3408 |
+typedef int (*qemuMonitorDomainMigrationStatusCallback)(qemuMonitorPtr mon,
|
|
|
7a3408 |
+ virDomainObjPtr vm,
|
|
|
7a3408 |
+ int status,
|
|
|
7a3408 |
+ void *opaque);
|
|
|
7a3408 |
+
|
|
|
7a3408 |
typedef struct _qemuMonitorCallbacks qemuMonitorCallbacks;
|
|
|
7a3408 |
typedef qemuMonitorCallbacks *qemuMonitorCallbacksPtr;
|
|
|
7a3408 |
struct _qemuMonitorCallbacks {
|
|
|
7a3408 |
@@ -214,6 +219,7 @@ struct _qemuMonitorCallbacks {
|
|
|
7a3408 |
qemuMonitorDomainNicRxFilterChangedCallback domainNicRxFilterChanged;
|
|
|
7a3408 |
qemuMonitorDomainSerialChangeCallback domainSerialChange;
|
|
|
7a3408 |
qemuMonitorDomainSpiceMigratedCallback domainSpiceMigrated;
|
|
|
7a3408 |
+ qemuMonitorDomainMigrationStatusCallback domainMigrationStatus;
|
|
|
7a3408 |
};
|
|
|
7a3408 |
|
|
|
7a3408 |
char *qemuMonitorEscapeArg(const char *in);
|
|
|
7a3408 |
@@ -313,6 +319,8 @@ int qemuMonitorEmitSerialChange(qemuMonitorPtr mon,
|
|
|
7a3408 |
const char *devAlias,
|
|
|
7a3408 |
bool connected);
|
|
|
7a3408 |
int qemuMonitorEmitSpiceMigrated(qemuMonitorPtr mon);
|
|
|
7a3408 |
+int qemuMonitorEmitMigrationStatus(qemuMonitorPtr mon,
|
|
|
7a3408 |
+ int status);
|
|
|
7a3408 |
|
|
|
7a3408 |
int qemuMonitorStartCPUs(qemuMonitorPtr mon,
|
|
|
7a3408 |
virConnectPtr conn);
|
|
|
7a3408 |
diff --git a/src/qemu/qemu_monitor_json.c b/src/qemu/qemu_monitor_json.c
|
|
|
7a3408 |
index 065c7fe..4323c2a 100644
|
|
|
7a3408 |
--- a/src/qemu/qemu_monitor_json.c
|
|
|
7a3408 |
+++ b/src/qemu/qemu_monitor_json.c
|
|
|
7a3408 |
@@ -84,6 +84,7 @@ static void qemuMonitorJSONHandleDeviceDeleted(qemuMonitorPtr mon, virJSONValueP
|
|
|
7a3408 |
static void qemuMonitorJSONHandleNicRxFilterChanged(qemuMonitorPtr mon, virJSONValuePtr data);
|
|
|
7a3408 |
static void qemuMonitorJSONHandleSerialChange(qemuMonitorPtr mon, virJSONValuePtr data);
|
|
|
7a3408 |
static void qemuMonitorJSONHandleSpiceMigrated(qemuMonitorPtr mon, virJSONValuePtr data);
|
|
|
7a3408 |
+static void qemuMonitorJSONHandleMigrationStatus(qemuMonitorPtr mon, virJSONValuePtr data);
|
|
|
7a3408 |
|
|
|
7a3408 |
typedef struct {
|
|
|
7a3408 |
const char *type;
|
|
|
7a3408 |
@@ -99,6 +100,7 @@ static qemuEventHandler eventHandlers[] = {
|
|
|
7a3408 |
{ "DEVICE_DELETED", qemuMonitorJSONHandleDeviceDeleted, },
|
|
|
7a3408 |
{ "DEVICE_TRAY_MOVED", qemuMonitorJSONHandleTrayChange, },
|
|
|
7a3408 |
{ "GUEST_PANICKED", qemuMonitorJSONHandleGuestPanic, },
|
|
|
7a3408 |
+ { "MIGRATION", qemuMonitorJSONHandleMigrationStatus, },
|
|
|
7a3408 |
{ "NIC_RX_FILTER_CHANGED", qemuMonitorJSONHandleNicRxFilterChanged, },
|
|
|
7a3408 |
{ "POWERDOWN", qemuMonitorJSONHandlePowerdown, },
|
|
|
7a3408 |
{ "RESET", qemuMonitorJSONHandleReset, },
|
|
|
7a3408 |
@@ -990,6 +992,27 @@ qemuMonitorJSONHandleSpiceMigrated(qemuMonitorPtr mon,
|
|
|
7a3408 |
}
|
|
|
7a3408 |
|
|
|
7a3408 |
|
|
|
7a3408 |
+static void
|
|
|
7a3408 |
+qemuMonitorJSONHandleMigrationStatus(qemuMonitorPtr mon,
|
|
|
7a3408 |
+ virJSONValuePtr data)
|
|
|
7a3408 |
+{
|
|
|
7a3408 |
+ const char *str;
|
|
|
7a3408 |
+ int status;
|
|
|
7a3408 |
+
|
|
|
7a3408 |
+ if (!(str = virJSONValueObjectGetString(data, "status"))) {
|
|
|
7a3408 |
+ VIR_WARN("missing status in migration event");
|
|
|
7a3408 |
+ return;
|
|
|
7a3408 |
+ }
|
|
|
7a3408 |
+
|
|
|
7a3408 |
+ if ((status = qemuMonitorMigrationStatusTypeFromString(str)) == -1) {
|
|
|
7a3408 |
+ VIR_WARN("unknown status '%s' in migration event", str);
|
|
|
7a3408 |
+ return;
|
|
|
7a3408 |
+ }
|
|
|
7a3408 |
+
|
|
|
7a3408 |
+ qemuMonitorEmitMigrationStatus(mon, status);
|
|
|
7a3408 |
+}
|
|
|
7a3408 |
+
|
|
|
7a3408 |
+
|
|
|
7a3408 |
int
|
|
|
7a3408 |
qemuMonitorJSONHumanCommandWithFd(qemuMonitorPtr mon,
|
|
|
7a3408 |
const char *cmd_str,
|
|
|
7a3408 |
--
|
|
|
7a3408 |
2.4.5
|
|
|
7a3408 |
|