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

Dmitry Andreev dandreev at virtuozzo.com
Fri Dec 18 13:20:48 UTC 2015



On 17.12.2015 23:25, John Ferlan wrote:
>
>
> 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 "_"
Is it OK to use 'deflation' or 'deflate' word? Can't choose the name
by myself.

>
> 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