On Mon, Mar 03, 2014 at 10:27:24AM +0800, qiaonuohan wrote: > --memory-only option is introduced without compression supported. Therefore, > this is a freature regression of virsh dump. Now qemu has support dumping memory > in kdump-compressed format. This patch is adding new virDomainCoreDumpWithFormat > API, so that the format in which qemu dump domain's memory can be specified. > > Signed-off-by: Qiao Nuohan <qiaonuohan@xxxxxxxxxxxxxx> > --- > include/libvirt/libvirt.h.in | 31 ++++++++++++++ > src/driver.h | 7 +++ > src/libvirt.c | 100 +++++++++++++++++++++++++++++++++++++++++++ > src/libvirt_public.syms | 5 +++ > src/remote/remote_driver.c | 1 + > src/remote/remote_protocol.x | 15 ++++++- > src/remote_protocol-structs | 7 +++ > src/test/test_driver.c | 19 ++++++-- > 8 files changed, 181 insertions(+), 4 deletions(-) > > diff --git a/include/libvirt/libvirt.h.in b/include/libvirt/libvirt.h.in > index 295d551..12d64ab 100644 > --- a/include/libvirt/libvirt.h.in > +++ b/include/libvirt/libvirt.h.in > diff --git a/src/libvirt.c b/src/libvirt.c > index dcf6b53..5a6a576 100644 > --- a/src/libvirt.c > +++ b/src/libvirt.c > @@ -2999,6 +2999,106 @@ error: > return -1; > } > > +/** > + * virDomainCoreDumpWithFormat: > + * @domain: a domain object > + * @to: path for the core file > + * @dumpformat: format of domain memory's dump > + * @flags: bitwise-OR of virDomainCoreDumpFlags > + * > + * This method will dump the core of a domain on a given file for analysis. > + * Note that for remote Xen Daemon the file path will be interpreted in > + * the remote host. Hypervisors may require the user to manually ensure > + * proper permissions on the file named by @to. > + * > + * If @flags includes VIR_DUMP_MEMORY_ONLY and dumpformat is set, libvirt > + * will ask qemu dump domain's memory in kdump-compressed format. > + * > + * If @flags includes VIR_DUMP_CRASH, then leave the guest shut off with > + * a crashed state after the dump completes. If @flags includes > + * VIR_DUMP_LIVE, then make the core dump while continuing to allow > + * the guest to run; otherwise, the guest is suspended during the dump. > + * VIR_DUMP_RESET flag forces reset of the quest after dump. > + * The above three flags are mutually exclusive. > + * > + * Additionally, if @flags includes VIR_DUMP_BYPASS_CACHE, then libvirt > + * will attempt to bypass the file system cache while creating the file, > + * or fail if it cannot do so for the given system; this can allow less > + * pressure on file system cache, but also risks slowing saves to NFS. > + * > + * Returns 0 in case of success and -1 in case of failure. > + */ > +int > +virDomainCoreDumpWithFormat(virDomainPtr domain, const char *to, unsigned int > + dumpformat, unsigned int flags) > +{ > + virConnectPtr conn; > + > + VIR_DOMAIN_DEBUG(domain, "to=%s, flags=%x", to, flags); > + > + virResetLastError(); > + > + virCheckDomainReturn(domain, -1); > + conn = domain->conn; > + > + virCheckReadOnlyGoto(conn->flags, error); > + virCheckNonNullArgGoto(to, error); > + > + if (!(flags & VIR_DUMP_MEMORY_ONLY) && > + (dumpformat == VIR_DUMP_FORMAT_KDUMP_ZLIB || > + dumpformat == VIR_DUMP_FORMAT_KDUMP_LZO || > + dumpformat == VIR_DUMP_FORMAT_KDUMP_SNAPPY)) { > + virReportInvalidArg(flags, "%s", > + _("compression format is only work with memory-only")); > + goto error; > + } This should be something checked on the QEMU driver since it is an implmentation restriction, not an API restriction. This should validate that dumpformat < VIR_DUMP_FORMAT_LAST though > + > + if ((flags & VIR_DUMP_CRASH) && (flags & VIR_DUMP_LIVE)) { > + virReportInvalidArg(flags, "%s", > + _("crash and live flags are mutually exclusive")); > + goto error; > + } > + > + if ((flags & VIR_DUMP_CRASH) && (flags & VIR_DUMP_RESET)) { > + virReportInvalidArg(flags, "%s", > + _("crash and reset flags are mutually exclusive")); > + goto error; > + } > + > + if ((flags & VIR_DUMP_LIVE) && (flags & VIR_DUMP_RESET)) { > + virReportInvalidArg(flags, "%s", > + _("live and reset flags are mutually exclusive")); > + goto error; > + } > + > + if (conn->driver->domainCoreDumpWithFormat) { > + int ret; > + char *absolute_to; > + > + /* We must absolutize the file path as the save is done out of process */ > + if (virFileAbsPath(to, &absolute_to) < 0) { > + virReportError(VIR_ERR_INTERNAL_ERROR, "%s", > + _("could not build absolute core file path")); > + goto error; > + } > + > + ret = conn->driver->domainCoreDumpWithFormat(domain, absolute_to, > + dumpformat, flags); > + > + VIR_FREE(absolute_to); > + > + if (ret < 0) > + goto error; > + return ret; > + } > + > + virReportUnsupportedError(); > + > +error: > + virDispatchError(domain->conn); > + return -1; > +} > diff --git a/src/test/test_driver.c b/src/test/test_driver.c > index b724f82..605b0d1 100644 > --- a/src/test/test_driver.c > +++ b/src/test/test_driver.c > @@ -2427,9 +2427,10 @@ testDomainRestore(virConnectPtr conn, > return testDomainRestoreFlags(conn, path, NULL, 0); > } > > -static int testDomainCoreDump(virDomainPtr domain, > - const char *to, > - unsigned int flags) > +static int testDomainCoreDumpWithFormat(virDomainPtr domain, > + const char *to, > + unsigned int dumpformat, > + unsigned int flags) > { > testConnPtr privconn = domain->conn->privateData; > int fd = -1; > @@ -2479,6 +2480,12 @@ static int testDomainCoreDump(virDomainPtr domain, > } > } > > + if (dumpformat > VIR_DUMP_FORMAT_KDUMP_SNAPPY) { > + virReportSystemError(errno, > + _("invalid value of dumpformat: %d"), dumpformat); > + goto cleanup; > + } This should be done in the libvirt.c entry point, comparing against VIR_DUMP_FORMAT_LAST Regards, Daniel -- |: http://berrange.com -o- http://www.flickr.com/photos/dberrange/ :| |: http://libvirt.org -o- http://virt-manager.org :| |: http://autobuild.org -o- http://search.cpan.org/~danberr/ :| |: http://entangle-photo.org -o- http://live.gnome.org/gtk-vnc :| -- libvir-list mailing list libvir-list@xxxxxxxxxx https://www.redhat.com/mailman/listinfo/libvir-list