[libvirt] [PATCH v3 2/4] wire up qemu agent to virDomainMemoryDump API
Daniel P. Berrange
berrange at redhat.com
Thu Feb 27 14:53:39 UTC 2014
On Thu, Feb 27, 2014 at 03:56:43PM +0800, qiaonuohan wrote:
> This patch makes use of the QEMU guest agent to implement the
> virDomainMemoryDump API.
Unless I'm missing something this doesn't appear to involve the
QEMU guest agent, at least not from libvirt's POV. This code is
using the QEMU monitor APIs.
> Signed-off-by: Qiao Nuohan <qiaonuohan at cn.fujitsu.com>
> ---
> src/qemu/qemu_driver.c | 42 ++++++++++++++++++++++++++++++++----------
> src/qemu/qemu_monitor.c | 7 ++++---
> src/qemu/qemu_monitor.h | 3 ++-
> src/qemu/qemu_monitor_json.c | 4 +++-
> src/qemu/qemu_monitor_json.h | 3 ++-
> tests/qemumonitorjsontest.c | 2 +-
> 6 files changed, 44 insertions(+), 17 deletions(-)
>
> diff --git a/src/qemu/qemu_driver.c b/src/qemu/qemu_driver.c
> index c9a865e..e063a42 100644
> --- a/src/qemu/qemu_driver.c
> +++ b/src/qemu/qemu_driver.c
> @@ -3391,7 +3391,8 @@ cleanup:
> }
>
> static int qemuDumpToFd(virQEMUDriverPtr driver, virDomainObjPtr vm,
> - int fd, enum qemuDomainAsyncJob asyncJob)
> + int fd, enum qemuDomainAsyncJob asyncJob,
> + const char* memory_dump_format)
> {
> qemuDomainObjPrivatePtr priv = vm->privateData;
> int ret = -1;
> @@ -3411,7 +3412,7 @@ static int qemuDumpToFd(virQEMUDriverPtr driver, virDomainObjPtr vm,
> if (qemuDomainObjEnterMonitorAsync(driver, vm, asyncJob) < 0)
> return -1;
>
> - ret = qemuMonitorDumpToFd(priv->mon, fd);
> + ret = qemuMonitorDumpToFd(priv->mon, fd, memory_dump_format);
> qemuDomainObjExitMonitor(driver, vm);
>
> return ret;
> @@ -3422,13 +3423,15 @@ doCoreDump(virQEMUDriverPtr driver,
> virDomainObjPtr vm,
> const char *path,
> virQEMUSaveFormat compress,
> - unsigned int dump_flags)
> + unsigned int dump_flags,
> + unsigned int dumpformat)
> {
> int fd = -1;
> int ret = -1;
> virFileWrapperFdPtr wrapperFd = NULL;
> int directFlag = 0;
> unsigned int flags = VIR_FILE_WRAPPER_NON_BLOCKING;
> + const char *memory_dump_format;
>
> /* Create an empty file with appropriate ownership. */
> if (dump_flags & VIR_DUMP_BYPASS_CACHE) {
> @@ -3452,7 +3455,16 @@ doCoreDump(virQEMUDriverPtr driver,
> goto cleanup;
>
> if (dump_flags & VIR_DUMP_MEMORY_ONLY) {
> - ret = qemuDumpToFd(driver, vm, fd, QEMU_ASYNC_JOB_DUMP);
> + if (dumpformat == VIR_MEMORY_DUMP_COMPRESS_ZLIB)
> + memory_dump_format = "kdump-zlib";
> + else if (dumpformat == VIR_MEMORY_DUMP_COMPRESS_LZO)
> + memory_dump_format = "kdump-lzo";
> + else if (dumpformat == VIR_MEMORY_DUMP_COMPRESS_SNAPPY)
> + memory_dump_format = "kdump-snappy";
> + else
> + memory_dump_format = "elf";
There should be an explicit check for the ELF format, and the
use virReportError(VIR_ERR_INVALID_ARG) if the user supplied a
format we don't know about.
> + ret = qemuDumpToFd(driver, vm, fd, QEMU_ASYNC_JOB_DUMP,
> + memory_dump_format);
> } else {
> ret = qemuMigrationToFile(driver, vm, fd, 0, path,
> qemuCompressProgramName(compress), false,
> @@ -3515,9 +3527,10 @@ cleanup:
> return ret;
> }
>
> -static int qemuDomainCoreDump(virDomainPtr dom,
> +static int qemuDomainMemoryDump(virDomainPtr dom,
> const char *path,
> - unsigned int flags)
> + unsigned int flags,
> + unsigned int dumpformat)
> {
> virQEMUDriverPtr driver = dom->conn->privateData;
> virDomainObjPtr vm;
> @@ -3533,7 +3546,7 @@ static int qemuDomainCoreDump(virDomainPtr dom,
> if (!(vm = qemuDomObjFromDomain(dom)))
> return -1;
>
> - if (virDomainCoreDumpEnsureACL(dom->conn, vm->def) < 0)
> + if (virDomainMemoryDumpEnsureACL(dom->conn, vm->def) < 0)
> goto cleanup;
>
> if (qemuDomainObjBeginAsyncJob(driver, vm,
> @@ -3565,7 +3578,8 @@ static int qemuDomainCoreDump(virDomainPtr dom,
> }
> }
>
> - ret = doCoreDump(driver, vm, path, getCompressionType(driver), flags);
> + ret = doCoreDump(driver, vm, path, getCompressionType(driver), flags,
> + dumpformat);
> if (ret < 0)
> goto endjob;
>
> @@ -3619,6 +3633,13 @@ cleanup:
> return ret;
> }
>
> +static int qemuDomainCoreDump(virDomainPtr dom,
> + const char *path,
> + unsigned int flags)
> +{
> + return qemuDomainMemoryDump(dom, path, flags, 0);
> +}
This should use a enum constant from the public header rather than 0
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 :|
More information about the libvir-list
mailing list