[libvirt] [PATCHv2 1/3] conf: introduce 'autodeflate' attribute for memballoon device
John Ferlan
jferlan at redhat.com
Tue Jan 5 16:12:07 UTC 2016
On 12/23/2015 07:33 AM, Dmitry Andreev wrote:
> Excessive memory balloon inflation can cause invocation of OOM-killer,
> when Linux is under severe memory pressure. QEMU memballoon device
> has a feature to release some memory at the last moment before some
> process will be get killed by OOM-killer.
>
> Introduced attribute allows to enable or disable this feature.
How about instead of that one sentence...
Introduce a new optional balloon device attribute 'autodeflate' to
enable or disable this feature.
> ---
> docs/formatdomain.html.in | 10 ++++++++++
> docs/schemas/domaincommon.rng | 5 +++++
> src/conf/domain_conf.c | 23 +++++++++++++++++++++++
> src/conf/domain_conf.h | 1 +
> 4 files changed, 39 insertions(+)
>
> diff --git a/docs/formatdomain.html.in b/docs/formatdomain.html.in
> index a8bd48e..7d04471 100644
> --- a/docs/formatdomain.html.in
> +++ b/docs/formatdomain.html.in
> @@ -5954,6 +5954,16 @@ qemu-kvm -net nic,model=? /dev/null
> <li>'xen' — default with Xen</li>
> </ul>
> </dd>
> + <dt><code>autodeflate</code></dt>
> + <dd>
> + <p>
> + The optional <code>autodeflate</code> attribute allows to
> + enable/disable (values "on"/"off", respectively) the ability of the
> + QEMU virtio memory balloon to release some memory at the last moment
> + before a guest's process get killed by OOM-killer.
s/OOM-/Out of Memory /
Yes, 99.999% of the world probably knows what OOM is...
> + <span class="since">Since 1.3.1, QEMU and KVM only</span>
> + </p>
> + </dd>
> <dt><code>period</code></dt>
> <dd>
> <p>
> diff --git a/docs/schemas/domaincommon.rng b/docs/schemas/domaincommon.rng
> index 4804c69..512a268 100644
> --- a/docs/schemas/domaincommon.rng
> +++ b/docs/schemas/domaincommon.rng
> @@ -3415,6 +3415,11 @@
> <value>none</value>
> </choice>
> </attribute>
> + <optional>
> + <attribute name="autodeflate">
> + <ref name="virOnOff"/>
> + </attribute>
> + </optional>
> <interleave>
> <optional>
> <ref name="alias"/>
> diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c
> index 5200c27..0786d08 100644
> --- a/src/conf/domain_conf.c
> +++ b/src/conf/domain_conf.c
> @@ -11312,6 +11312,7 @@ virDomainMemballoonDefParseXML(xmlNodePtr node,
> unsigned int flags)
> {
> char *model;
> + char *deflate;
> virDomainMemballoonDefPtr def;
> xmlNodePtr save = ctxt->node;
> unsigned int period = 0;
> @@ -11332,6 +11333,13 @@ virDomainMemballoonDefParseXML(xmlNodePtr node,
> goto error;
> }
>
> + if ((deflate = virXMLPropString(node, "autodeflate")) &&
> + (def->autodeflate = virTristateSwitchTypeFromString(deflate)) <= 0) {
> + virReportError(VIR_ERR_CONFIG_UNSUPPORTED,
> + _("invalid autodeflate attribute value '%s'"), deflate);
> + goto error;
> + }
> +
> ctxt->node = node;
> if (virXPathUInt("string(./stats/@period)", ctxt, &period) < -1) {
> virReportError(VIR_ERR_XML_ERROR, "%s",
> @@ -11350,6 +11358,7 @@ virDomainMemballoonDefParseXML(xmlNodePtr node,
>
> cleanup:
> VIR_FREE(model);
> + VIR_FREE(deflate);
>
> ctxt->node = save;
> return def;
> @@ -17223,6 +17232,15 @@ virDomainMemballoonDefCheckABIStability(virDomainMemballoonDefPtr src,
> return false;
> }
>
> + if (src->autodeflate != dst->autodeflate) {
> + virReportError(VIR_ERR_CONFIG_UNSUPPORTED,
> + _("Target balloon autodeflate attribute value "
> + "'%s' does not match source '%s'"),
> + virTristateSwitchTypeToString(dst->autodeflate),
> + virTristateSwitchTypeToString(src->autodeflate));
> + return false;
> + }
> +
Very strange - not sure if it was because I had applied this on the most
recent head, but this coded ended up being merged (via git am) into
virDomainWatchdogDefCheckABIStability
John
> if (!virDomainDeviceInfoCheckABIStability(&src->info, &dst->info))
> return false;
>
> @@ -20400,6 +20418,11 @@ virDomainMemballoonDefFormat(virBufferPtr buf,
> }
>
> virBufferAsprintf(buf, "<memballoon model='%s'", model);
> +
> + if (def->autodeflate != VIR_TRISTATE_SWITCH_ABSENT)
> + virBufferAsprintf(buf, " autodeflate='%s'",
> + virTristateSwitchTypeToString(def->autodeflate));
> +
> virBufferAdjustIndent(&childrenBuf, indent + 2);
>
> if (def->period)
> diff --git a/src/conf/domain_conf.h b/src/conf/domain_conf.h
> index 952d3cc..31a0a05 100644
> --- a/src/conf/domain_conf.h
> +++ b/src/conf/domain_conf.h
> @@ -1634,6 +1634,7 @@ struct _virDomainMemballoonDef {
> int model;
> virDomainDeviceInfo info;
> int period; /* seconds between collections */
> + int autodeflate; /* enum virTristateSwitch */
> };
>
> struct _virDomainNVRAMDef {
>
More information about the libvir-list
mailing list