On 06/12/2012 05:04 AM, Wen Congyang wrote: > 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. > We will always use json mode if qemu's version is >= 0.15, so I > don't implement the API for text mode. > --- > src/qemu/qemu_monitor.c | 37 +++++++++++++++++++++++++++++++++++++ > src/qemu/qemu_monitor.h | 12 ++++++++++++ > src/qemu/qemu_monitor_json.c | 34 ++++++++++++++++++++++++++++++++++ > src/qemu/qemu_monitor_json.h | 6 ++++++ > 4 files changed, 89 insertions(+), 0 deletions(-) > > diff --git a/src/qemu/qemu_monitor.c b/src/qemu/qemu_monitor.c > index 7084c68..e2a39b8 100644 > --- a/src/qemu/qemu_monitor.c > +++ b/src/qemu/qemu_monitor.c > @@ -2022,6 +2022,43 @@ 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) { > + /* We don't have qemuMonitorTextDump(), so we should check mon->json > + * here. > + */ > + 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 ffe8fe7..66bec38 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 9030347..6ca01c5 100644 > --- a/src/qemu/qemu_monitor_json.c > +++ b/src/qemu/qemu_monitor_json.c > @@ -2465,6 +2465,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 22a3adf..e8bd9b8 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, > Looks fine with me, ACK. Martin -- libvir-list mailing list libvir-list@xxxxxxxxxx https://www.redhat.com/mailman/listinfo/libvir-list