[libvirt] [PATCH 4/8] Add 'period' for Memballoon statistics gathering capability

Michal Privoznik mprivozn at redhat.com
Wed Jul 3 12:03:15 UTC 2013


On 02.07.2013 15:39, John Ferlan wrote:
> Add a period in seconds to allow/enable statistics gathering from the
> Balloon driver for 'virsh dommemstat <domain>'.
> ---
>  docs/schemas/domaincommon.rng |  7 +++++++
>  src/conf/domain_conf.c        | 27 +++++++++++++++++++++++----
>  src/conf/domain_conf.h        |  1 +
>  3 files changed, 31 insertions(+), 4 deletions(-)
> 
> diff --git a/docs/schemas/domaincommon.rng b/docs/schemas/domaincommon.rng
> index cf82878..53e707c 100644
> --- a/docs/schemas/domaincommon.rng
> +++ b/docs/schemas/domaincommon.rng
> @@ -2915,6 +2915,13 @@
>        <optional>
>          <ref name="address"/>
>        </optional>
> +      <optional>
> +        <element name="stats">
> +          <attribute name="period">
> +            <ref name="positiveInteger"/>
> +          </attribute>
> +        </element>
> +      </optional>
>      </element>
>    </define>
>    <define name="parallel">
> diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c
> index 011de71..cd7dbee 100644
> --- a/src/conf/domain_conf.c
> +++ b/src/conf/domain_conf.c
> @@ -8571,10 +8571,12 @@ error:
>  
>  static virDomainMemballoonDefPtr
>  virDomainMemballoonDefParseXML(const xmlNodePtr node,
> +                               xmlXPathContextPtr ctxt,
>                                 unsigned int flags)
>  {
>      char *model;
>      virDomainMemballoonDefPtr def;
> +    xmlNodePtr save = ctxt->node;
>  
>      if (VIR_ALLOC(def) < 0) {
>          virReportOOMError();
> @@ -8587,18 +8589,24 @@ virDomainMemballoonDefParseXML(const xmlNodePtr node,
>                         _("balloon memory must contain model name"));
>          goto error;
>      }
> +
>      if ((def->model = virDomainMemballoonModelTypeFromString(model)) < 0) {
>          virReportError(VIR_ERR_INTERNAL_ERROR,
>                         _("unknown memory balloon model '%s'"), model);
>          goto error;
>      }
>  
> +    ctxt->node = node;
> +    if (virXPathInt("string(./stats/@period)", ctxt, &def->period) < 0)
> +        def->period = 0;

This is silently ignoring invalid integer value in @period. Moreover,
it's merging two different cases into one: invalid integer and @period
not present. After all, setting def->period to zero is done by
VIR_ALLOC. So I think we must distinguish if virXPathInt returned -1
(@period not present in XML) or -2(@period is not valid integer). And we
must not forget to check if user hasn't entered period < 0.

> +
>      if (virDomainDeviceInfoParseXML(node, NULL, &def->info, flags) < 0)
>          goto error;
>  
>  cleanup:
>      VIR_FREE(model);
>  
> +    ctxt->node = save;
>      return def;
>  
>  error:
> @@ -11911,7 +11919,7 @@ virDomainDefParseXML(xmlDocPtr xml,
>      }
>      if (n > 0) {
>          virDomainMemballoonDefPtr memballoon =
> -            virDomainMemballoonDefParseXML(nodes[0], flags);
> +            virDomainMemballoonDefParseXML(nodes[0], ctxt, flags);
>          if (!memballoon)
>              goto error;
>  
> @@ -15080,6 +15088,7 @@ virDomainMemballoonDefFormat(virBufferPtr buf,
>                               unsigned int flags)
>  {
>      const char *model = virDomainMemballoonModelTypeToString(def->model);
> +    bool noopts = true;
>  
>      if (!model) {
>          virReportError(VIR_ERR_INTERNAL_ERROR,
> @@ -15093,11 +15102,21 @@ virDomainMemballoonDefFormat(virBufferPtr buf,
>          virBufferAddLit(buf, ">\n");
>          if (virDomainDeviceInfoFormat(buf, &def->info, flags) < 0)
>              return -1;
> -        virBufferAddLit(buf, "    </memballoon>\n");
> -    } else {
> -        virBufferAddLit(buf, "/>\n");
> +        noopts = false;
>      }
>  
> +    if (def->period) {
> +        if (noopts)
> +            virBufferAddLit(buf, ">\n");
> +        virBufferAsprintf(buf, "      <stats period='%d'/>\n", def->period);
> +        noopts = false;
> +    }
> +
> +    if (noopts)
> +        virBufferAddLit(buf, "/>\n");
> +    else
> +        virBufferAddLit(buf, "    </memballoon>\n");
> +
>      return 0;
>  }
>  
> diff --git a/src/conf/domain_conf.h b/src/conf/domain_conf.h
> index 3817e37..405903f 100644
> --- a/src/conf/domain_conf.h
> +++ b/src/conf/domain_conf.h
> @@ -1527,6 +1527,7 @@ enum {
>  struct _virDomainMemballoonDef {
>      int model;
>      virDomainDeviceInfo info;
> +    int period; /* seconds between collections */
>  };
>  
>  struct _virDomainNVRAMDef {
> 

Michal




More information about the libvir-list mailing list