[libvirt] [PATCH 1/2] conf: introduce 'deflate-on-oom' attribute for memballoon device

John Ferlan jferlan at redhat.com
Thu Dec 17 20:25:26 UTC 2015



On 12/14/2015 06:35 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.
> ---
>  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..fa68e7b 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>deflate-on-oom</code></dt>
> +      <dd>
> +        <p>
> +          The optional <code>deflate-on-oom</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.
> +          <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..9587849 100644
> --- a/docs/schemas/domaincommon.rng
> +++ b/docs/schemas/domaincommon.rng
> @@ -3415,6 +3415,11 @@
>            <value>none</value>
>          </choice>
>        </attribute>
> +      <optional>
> +        <attribute name="deflate-on-oom">


Typically don't want those "-", either use some sort of single word or
other attributes to have "_"

This will of course have ramifications throughout the code. I'll only
mention it here though.

> +          <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..b332097 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, "deflate-on-oom")) &&
> +        (def->deflate = virTristateSwitchTypeFromString(deflate)) < 0) {

Since you're not using/allowing "default", then the comparison should be
<= 0

yes, there are some others that are not correct it seems.

> +        virReportError(VIR_ERR_CONFIG_UNSUPPORTED,
> +                       _("invalid deflate-on-oom 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->deflate != dst->deflate) {
> +        virReportError(VIR_ERR_CONFIG_UNSUPPORTED,
> +                       _("Target balloon deflate-on-oom attribute value "
> +                         "%s does not match source %s"),
> +                       virTristateSwitchTypeToString(dst->deflate),
> +                       virTristateSwitchTypeToString(src->deflate));
> +        return false;
> +    }
> +
>      if (!virDomainDeviceInfoCheckABIStability(&src->info, &dst->info))
>          return false;
>  
> @@ -20390,6 +20408,7 @@ virDomainMemballoonDefFormat(virBufferPtr buf,
>                               unsigned int flags)
>  {
>      const char *model = virDomainMemballoonModelTypeToString(def->model);
> +    const char *deflate = virTristateSwitchTypeToString(def->deflate);
>      virBuffer childrenBuf = VIR_BUFFER_INITIALIZER;
>      int indent = virBufferGetIndent(buf, false);
>  
> @@ -20400,6 +20419,10 @@ virDomainMemballoonDefFormat(virBufferPtr buf,
>      }
>  
>      virBufferAsprintf(buf, "<memballoon model='%s'", model);
> +
> +    if (def->deflate > 0 && deflate)

This would be use of def->deflate != VIR_TRISTATE_SWITCH_ABSENT

> +        virBufferAsprintf(buf, " deflate-on-oom='%s'", deflate);

The 'deflate' isn't required - see other examples.

Looks OK otherwise.

John
> +
>      virBufferAdjustIndent(&childrenBuf, indent + 2);
>  
>      if (def->period)
> diff --git a/src/conf/domain_conf.h b/src/conf/domain_conf.h
> index cec681a..707ffb2 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 deflate; /* enum virTristateSwitch */
>  };
>  
>  struct _virDomainNVRAMDef {
> 




More information about the libvir-list mailing list