[libvirt] [PATCH v2] qemu: Parse current balloon value returned by query_balloon

Osier Yang jyang at redhat.com
Mon Jun 13 14:45:28 UTC 2011


On 06/07/2011 06:14 PM, Osier Yang wrote:
> Qemu once supported following memory stats which will returned by
> "query_balloon":
>
>      stat_put(dict, "actual", actual);
>      stat_put(dict, "mem_swapped_in", dev->stats[VIRTIO_BALLOON_S_SWAP_IN]);
>      stat_put(dict, "mem_swapped_out", dev->stats[VIRTIO_BALLOON_S_SWAP_OUT]);
>      stat_put(dict, "major_page_faults", dev->stats[VIRTIO_BALLOON_S_MAJFLT]);
>      stat_put(dict, "minor_page_faults", dev->stats[VIRTIO_BALLOON_S_MINFLT]);
>      stat_put(dict, "free_mem", dev->stats[VIRTIO_BALLOON_S_MEMFREE]);
>      stat_put(dict, "total_mem", dev->stats[VIRTIO_BALLOON_S_MEMTOT]);
>
> But it later disabled all the stats except "actual" by commit
> 07b0403dfc2b2ac179ae5b48105096cc2d03375a.
>
> libvirt doesn't parse "actual", so user will always see a empty result
> with "virsh dommemstat $domain". Even qemu haven't disabled the stats,
> we should support parsing "actual".
> ---
>   include/libvirt/libvirt.h.in |    4 +++-
>   src/libvirt.c                |    2 ++
>   src/qemu/qemu_monitor_json.c |   12 ++++++++++++
>   src/qemu/qemu_monitor_text.c |    4 +++-
>   tools/virsh.c                |    2 ++
>   5 files changed, 22 insertions(+), 2 deletions(-)
>
> diff --git a/include/libvirt/libvirt.h.in b/include/libvirt/libvirt.h.in
> index df213f1..0930622 100644
> --- a/include/libvirt/libvirt.h.in
> +++ b/include/libvirt/libvirt.h.in
> @@ -467,11 +467,13 @@ typedef enum {
>        */
>       VIR_DOMAIN_MEMORY_STAT_AVAILABLE       = 5,
>
> +    /* Current balloon value (in KB). */
> +    VIR_DOMAIN_MEMORY_STAT_ACTUAL_BALLOON  = 6,
>       /*
>        * The number of statistics supported by this version of the interface.
>        * To add new statistics, add them to the enum and increase this value.
>        */
> -    VIR_DOMAIN_MEMORY_STAT_NR              = 6,
> +    VIR_DOMAIN_MEMORY_STAT_NR              = 7,
>   } virDomainMemoryStatTags;
>
>   typedef struct _virDomainMemoryStat virDomainMemoryStatStruct;
> diff --git a/src/libvirt.c b/src/libvirt.c
> index 18c4e08..08a7d4c 100644
> --- a/src/libvirt.c
> +++ b/src/libvirt.c
> @@ -5737,6 +5737,8 @@ error:
>    *     The amount of memory which is not being used for any purpose (in kb).
>    * VIR_DOMAIN_MEMORY_STAT_AVAILABLE:
>    *     The total amount of memory available to the domain's OS (in kb).
> + * VIR_DOMAIN_MEMORY_STAT_ACTUAL_BALLOON:
> + *     Current balloon value (in kb).
>    *
>    * Returns: The number of stats provided or -1 in case of failure.
>    */
> diff --git a/src/qemu/qemu_monitor_json.c b/src/qemu/qemu_monitor_json.c
> index 75adf66..2680b3c 100644
> --- a/src/qemu/qemu_monitor_json.c
> +++ b/src/qemu/qemu_monitor_json.c
> @@ -1119,6 +1119,18 @@ int qemuMonitorJSONGetMemoryStats(qemuMonitorPtr mon,
>                   goto cleanup;
>               }
>
> +            if (virJSONValueObjectHasKey(data, "actual")&&  (got<  nr_stats)) {
> +                if (virJSONValueObjectGetNumberUlong(data, "actual",&mem)<  0) {
> +                    qemuReportError(VIR_ERR_INTERNAL_ERROR, "%s",
> +                                    _("info balloon reply was missing balloon actual"));
> +                    ret = -1;
> +                    goto cleanup;
> +                }
> +                stats[got].tag = VIR_DOMAIN_MEMORY_STAT_ACTUAL_BALLOON;
> +                stats[got].val = (mem/1024);
> +                got++;
> +            }
> +
>               if (virJSONValueObjectHasKey(data, "mem_swapped_in")&&  (got<  nr_stats)) {
>                   if (virJSONValueObjectGetNumberUlong(data, "mem_swapped_in",&mem)<  0) {
>                       qemuReportError(VIR_ERR_INTERNAL_ERROR, "%s",
> diff --git a/src/qemu/qemu_monitor_text.c b/src/qemu/qemu_monitor_text.c
> index 3b42e7a..d432027 100644
> --- a/src/qemu/qemu_monitor_text.c
> +++ b/src/qemu/qemu_monitor_text.c
> @@ -549,7 +549,9 @@ static int qemuMonitorParseExtraBalloonInfo(char *text,
>               parseMemoryStat(&p, VIR_DOMAIN_MEMORY_STAT_UNUSED,
>                               ",free_mem=",&stats[nr_stats_found]) ||
>               parseMemoryStat(&p, VIR_DOMAIN_MEMORY_STAT_AVAILABLE,
> -                            ",total_mem=",&stats[nr_stats_found]))
> +                            ",total_mem=",&stats[nr_stats_found]) ||
> +            parseMemoryStat(&p, VIR_DOMAIN_MEMORY_STAT_ACTUAL_BALLOON,
> +                            ",actual=",&stats[nr_stats_found]))
>               nr_stats_found++;
>
>           /* Skip to the next label.  When *p is ',' the last match attempt
> diff --git a/tools/virsh.c b/tools/virsh.c
> index d98be1c..17f6a22 100644
> --- a/tools/virsh.c
> +++ b/tools/virsh.c
> @@ -1147,6 +1147,8 @@ cmdDomMemStat(vshControl *ctl, const vshCmd *cmd)
>               vshPrint (ctl, "unused %llu\n", stats[i].val);
>           if (stats[i].tag == VIR_DOMAIN_MEMORY_STAT_AVAILABLE)
>               vshPrint (ctl, "available %llu\n", stats[i].val);
> +        if (stats[i].tag == VIR_DOMAIN_MEMORY_STAT_ACTUAL_BALLOON)
> +            vshPrint (ctl, "actual %llu\n", stats[i].val);
>       }
>
>       virDomainFree(dom);

Hi, Matthias, Eric

Would you please review on this v2?

Thanks
Osier




More information about the libvir-list mailing list