Add a period in seconds to allow/enable statistics gathering from the Balloon driver for 'virsh dommemstat <domain>'. --- docs/formatdomain.html.in | 10 ++++++++++ docs/schemas/domaincommon.rng | 7 +++++++ src/conf/domain_conf.c | 44 +++++++++++++++++++++++++++++++++++++------ src/conf/domain_conf.h | 1 + 4 files changed, 56 insertions(+), 6 deletions(-) diff --git a/docs/formatdomain.html.in b/docs/formatdomain.html.in index 52a6353..93d2416 100644 --- a/docs/formatdomain.html.in +++ b/docs/formatdomain.html.in @@ -4637,6 +4637,7 @@ qemu-kvm -net nic,model=? /dev/null <devices> <memballoon model='virtio'> <address type='pci' domain='0x0000' bus='0x00' slot='0x02' function='0x0'/> + <stats period='10'/> </memballoon> </devices> </domain></pre> @@ -4654,6 +4655,15 @@ qemu-kvm -net nic,model=? /dev/null <li>'xen' — default with Xen</li> </ul> </dd> + <dt><code>period</code></dt> + <dd> + <p> + The optional <code>period</code> allows the QEMU virtio memory + balloon driver to provide statistics through the <code>virsh + dommemstat [domain]</code> command. + <span class='since'>Since 1.1.1, requires QEMU 1.5</span> + </p> + </dd> </dl> <h4><a name="elementsRng">Random number generator device</a></h4> diff --git a/docs/schemas/domaincommon.rng b/docs/schemas/domaincommon.rng index c135530..7a6852b 100644 --- a/docs/schemas/domaincommon.rng +++ b/docs/schemas/domaincommon.rng @@ -2946,6 +2946,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 402e6e9..d63b735 100644 --- a/src/conf/domain_conf.c +++ b/src/conf/domain_conf.c @@ -8595,10 +8595,14 @@ error: static virDomainMemballoonDefPtr virDomainMemballoonDefParseXML(const xmlNodePtr node, + xmlXPathContextPtr ctxt, unsigned int flags) { char *model; virDomainMemballoonDefPtr def; + xmlNodePtr save = ctxt->node; + int period = -1; + int ret; if (VIR_ALLOC(def) < 0) { virReportOOMError(); @@ -8607,22 +8611,39 @@ virDomainMemballoonDefParseXML(const xmlNodePtr node, model = virXMLPropString(node, "model"); if (model == NULL) { - virReportError(VIR_ERR_INTERNAL_ERROR, "%s", + virReportError(VIR_ERR_XML_ERROR, "%s", _("balloon memory must contain model name")); goto error; } + if ((def->model = virDomainMemballoonModelTypeFromString(model)) < 0) { - virReportError(VIR_ERR_INTERNAL_ERROR, + virReportError(VIR_ERR_XML_ERROR, _("unknown memory balloon model '%s'"), model); goto error; } + ctxt->node = node; + ret = virXPathInt("string(./stats/@period)", ctxt, &period); + if (ret == -2) { + virReportError(VIR_ERR_XML_ERROR, "%s", + _("period value not a valid integer")); + goto error; + } else if (ret == 0) { + if (period < 0) { + virReportError(VIR_ERR_XML_ERROR, "%s", + _("period value must be 0 or more")); + goto error; + } + def->period = period; + } + if (virDomainDeviceInfoParseXML(node, NULL, &def->info, flags) < 0) goto error; cleanup: VIR_FREE(model); + ctxt->node = save; return def; error: @@ -11991,7 +12012,7 @@ virDomainDefParseXML(xmlDocPtr xml, } if (n > 0) { virDomainMemballoonDefPtr memballoon = - virDomainMemballoonDefParseXML(nodes[0], flags); + virDomainMemballoonDefParseXML(nodes[0], ctxt, flags); if (!memballoon) goto error; @@ -15192,6 +15213,7 @@ virDomainMemballoonDefFormat(virBufferPtr buf, unsigned int flags) { const char *model = virDomainMemballoonModelTypeToString(def->model); + bool noopts = true; if (!model) { virReportError(VIR_ERR_INTERNAL_ERROR, @@ -15205,11 +15227,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 da83eb6..a8eb1fe 100644 --- a/src/conf/domain_conf.h +++ b/src/conf/domain_conf.h @@ -1533,6 +1533,7 @@ enum { struct _virDomainMemballoonDef { int model; virDomainDeviceInfo info; + int period; /* seconds between collections */ }; struct _virDomainNVRAMDef { -- 1.8.1.4 -- libvir-list mailing list libvir-list@xxxxxxxxxx https://www.redhat.com/mailman/listinfo/libvir-list