conf: introduce 'autodeflate' attribute for memballoon device

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.

Introduce a new optional balloon device attribute 'autodeflate' to
enable or disable this feature.
This commit is contained in:
Dmitry Andreev 2016-01-08 13:45:05 +03:00 committed by John Ferlan
parent 2eb7a97575
commit 7bf3198df6
4 changed files with 39 additions and 0 deletions

View File

@ -5962,6 +5962,16 @@ qemu-kvm -net nic,model=? /dev/null
<li>'xen' &mdash; 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 Out of Memory killer.
<span class="since">Since 1.3.1, QEMU and KVM only</span>
</p>
</dd>
<dt><code>period</code></dt>
<dd>
<p>

View File

@ -3420,6 +3420,11 @@
<value>none</value>
</choice>
</attribute>
<optional>
<attribute name="autodeflate">
<ref name="virOnOff"/>
</attribute>
</optional>
<interleave>
<optional>
<ref name="alias"/>

View File

@ -11354,6 +11354,7 @@ virDomainMemballoonDefParseXML(xmlNodePtr node,
unsigned int flags)
{
char *model;
char *deflate;
virDomainMemballoonDefPtr def;
xmlNodePtr save = ctxt->node;
unsigned int period = 0;
@ -11374,6 +11375,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",
@ -11392,6 +11400,7 @@ virDomainMemballoonDefParseXML(xmlNodePtr node,
cleanup:
VIR_FREE(model);
VIR_FREE(deflate);
ctxt->node = save;
return def;
@ -17342,6 +17351,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;
}
if (!virDomainDeviceInfoCheckABIStability(&src->info, &dst->info))
return false;
@ -20523,6 +20541,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)

View File

@ -1635,6 +1635,7 @@ struct _virDomainMemballoonDef {
int model;
virDomainDeviceInfo info;
int period; /* seconds between collections */
int autodeflate; /* enum virTristateSwitch */
};
struct _virDomainNVRAMDef {