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