mirror of
https://gitlab.com/libvirt/libvirt.git
synced 2025-02-01 17:35:17 +00:00
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:
parent
2eb7a97575
commit
7bf3198df6
@ -5962,6 +5962,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 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>
|
||||
|
@ -3420,6 +3420,11 @@
|
||||
<value>none</value>
|
||||
</choice>
|
||||
</attribute>
|
||||
<optional>
|
||||
<attribute name="autodeflate">
|
||||
<ref name="virOnOff"/>
|
||||
</attribute>
|
||||
</optional>
|
||||
<interleave>
|
||||
<optional>
|
||||
<ref name="alias"/>
|
||||
|
@ -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)
|
||||
|
@ -1635,6 +1635,7 @@ struct _virDomainMemballoonDef {
|
||||
int model;
|
||||
virDomainDeviceInfo info;
|
||||
int period; /* seconds between collections */
|
||||
int autodeflate; /* enum virTristateSwitch */
|
||||
};
|
||||
|
||||
struct _virDomainNVRAMDef {
|
||||
|
Loading…
x
Reference in New Issue
Block a user