[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