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

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 




On 12/18/2015 08:20 AM, Dmitry Andreev wrote:
> 
> 
> 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' &mdash; 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.
> 

How about 'autodeflate' ?  I think that describes the feature adequately.

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

--
libvir-list mailing list
libvir-list@xxxxxxxxxx
https://www.redhat.com/mailman/listinfo/libvir-list



[Index of Archives]     [Virt Tools]     [Libvirt Users]     [Lib OS Info]     [Fedora Users]     [Fedora Desktop]     [Fedora SELinux]     [Big List of Linux Books]     [Yosemite News]     [KDE Users]     [Fedora Tools]