[libvirt] [PATCH 1/3] qemu: implement qemu's dump-guest-memory

Martin Kletzander mkletzan at redhat.com
Wed May 23 08:56:13 UTC 2012


On 04/20/2012 09:27 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.
> 
> ---
>  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;
> +    }

Correct me if I'm wrong, but shouldn't this be rather handled by adding
it as a qemu capability? Maybe by checking the qemu version in
qemuCapsComputeCmdFlags()? Or probably even better by checking that
command in qemuCapsComputeCmdFlags(). That way we can be sure that the
command is supported.

> +
> +    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,




More information about the libvir-list mailing list