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

Martin Kletzander mkletzan at redhat.com
Wed Jun 13 12:56:08 UTC 2012


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




More information about the libvir-list mailing list