dump-guest-memory is a new dump mechanism, and it can work when the
guest uses host devices. This patch adds a API to use this new
monitor command.
---
src/qemu/qemu_monitor.c | 38 ++++++++++++++++++++++++++++++++++++++
src/qemu/qemu_monitor.h | 12 ++++++++++++
src/qemu/qemu_monitor_json.c | 34 ++++++++++++++++++++++++++++++++++
src/qemu/qemu_monitor_json.h | 6 ++++++
4 files changed, 90 insertions(+), 0 deletions(-)
diff --git a/src/qemu/qemu_monitor.c b/src/qemu/qemu_monitor.c
index 2f66c46..a5d3eec 100644
--- a/src/qemu/qemu_monitor.c
+++ b/src/qemu/qemu_monitor.c
@@ -2018,6 +2018,44 @@ int qemuMonitorMigrateCancel(qemuMonitorPtr mon)
return ret;
}
+int qemuMonitorDumpToFd(qemuMonitorPtr mon,
+ unsigned int flags,
+ int fd,
+ unsigned long long begin,
+ unsigned long long length)
+{
+ int ret;
+ VIR_DEBUG("mon=%p fd=%d flags=%x begin=%llx length=%llx",
+ mon, fd, flags, begin, length);
+
+ if (!mon) {
+ qemuReportError(VIR_ERR_INVALID_ARG, "%s",
+ _("monitor must not be NULL"));
+ return -1;
+ }
+
+ if (!mon->json) {
+ /* dump-guest-memory is supported after qemu-1.0, and we always use json
+ * if qemu's version is >= 0.15. So if we use text mode, the qemu is
+ * old, and it does not support dump-guest-memory.
+ */
+ qemuReportError(VIR_ERR_NO_SUPPORT, "%s",
+ _("dump-guest-memory is not supported in text mode"));
+ return -1;
+ }
+
+ if (qemuMonitorSendFileHandle(mon, "dump", fd) < 0)
+ return -1;
+
+ ret = qemuMonitorJSONDump(mon, flags, "fd:dump", begin, length);
+
+ if (ret < 0) {
+ if (qemuMonitorCloseFileHandle(mon, "dump") < 0)
+ VIR_WARN("failed to close dumping handle");
+ }
+
+ return ret;
+}
int qemuMonitorGraphicsRelocate(qemuMonitorPtr mon,
int type,
diff --git a/src/qemu/qemu_monitor.h b/src/qemu/qemu_monitor.h
index f3cdcdd..7df52ad 100644
--- a/src/qemu/qemu_monitor.h
+++ b/src/qemu/qemu_monitor.h
@@ -379,6 +379,18 @@ int qemuMonitorMigrateToUnix(qemuMonitorPtr mon,
int qemuMonitorMigrateCancel(qemuMonitorPtr mon);
+typedef enum {
+ QEMU_MONITOR_DUMP_HAVE_FILTER = 1 << 0,
+ QEMU_MONITOR_DUMP_PAGING = 1 << 1,
+ QEMU_MONITOR_DUMP_FLAGS_LAST
+} QEMU_MONITOR_DUMP;
+
+int qemuMonitorDumpToFd(qemuMonitorPtr mon,
+ unsigned int flags,
+ int fd,
+ unsigned long long begin,
+ unsigned long long length);
+
int qemuMonitorGraphicsRelocate(qemuMonitorPtr mon,
int type,
const char *hostname,
diff --git a/src/qemu/qemu_monitor_json.c b/src/qemu/qemu_monitor_json.c
index eb58f13..b229a31 100644
--- a/src/qemu/qemu_monitor_json.c
+++ b/src/qemu/qemu_monitor_json.c
@@ -2461,6 +2461,40 @@ int qemuMonitorJSONMigrateCancel(qemuMonitorPtr mon)
return ret;
}
+int qemuMonitorJSONDump(qemuMonitorPtr mon,
+ unsigned int flags,
+ const char *protocol,
+ unsigned long long begin,
+ unsigned long long length)
+{
+ int ret;
+ virJSONValuePtr cmd = NULL;
+ virJSONValuePtr reply = NULL;
+
+ if (flags & QEMU_MONITOR_DUMP_HAVE_FILTER)
+ cmd = qemuMonitorJSONMakeCommand("dump-guest-memory",
+ "b:paging", flags &
QEMU_MONITOR_DUMP_PAGING ? 1 : 0,
+ "s:protocol", protocol,
+ "U:begin", begin,
+ "U:length", length,
+ NULL);
+ else
+ cmd = qemuMonitorJSONMakeCommand("dump-guest-memory",
+ "b:paging", flags &
QEMU_MONITOR_DUMP_PAGING ? 1 : 0,
+ "s:protocol", protocol,
+ NULL);
+ if (!cmd)
+ return -1;
+
+ ret = qemuMonitorJSONCommand(mon, cmd, &reply);
+
+ if (ret == 0)
+ ret = qemuMonitorJSONCheckError(cmd, reply);
+
+ virJSONValueFree(cmd);
+ virJSONValueFree(reply);
+ return ret;
+}
int qemuMonitorJSONGraphicsRelocate(qemuMonitorPtr mon,
int type,
diff --git a/src/qemu/qemu_monitor_json.h b/src/qemu/qemu_monitor_json.h
index aacbb5f..ccb2624 100644
--- a/src/qemu/qemu_monitor_json.h
+++ b/src/qemu/qemu_monitor_json.h
@@ -136,6 +136,12 @@ int qemuMonitorJSONMigrate(qemuMonitorPtr mon,
int qemuMonitorJSONMigrateCancel(qemuMonitorPtr mon);
+int qemuMonitorJSONDump(qemuMonitorPtr mon,
+ unsigned int flags,
+ const char *protocol,
+ unsigned long long begin,
+ unsigned long long length);
+
int qemuMonitorJSONGraphicsRelocate(qemuMonitorPtr mon,
int type,
const char *hostname,
--
1.7.1