]> git.ipfire.org Git - thirdparty/libvirt.git/commitdiff
Document and parser support for the Virtio free page reporting feature.
authorNico Pache <npache@redhat.com>
Mon, 12 Oct 2020 23:35:36 +0000 (19:35 -0400)
committerMichal Privoznik <mprivozn@redhat.com>
Tue, 13 Oct 2020 15:01:38 +0000 (17:01 +0200)
This will add the proper documentation and parser support for the free page
reporting feature that is introduced in QEMU 5.1.

Signed-off-by: Nico Pache <npache@redhat.com>
Signed-off-by: Michal Privoznik <mprivozn@redhat.com>
Reviewed-by: Daniel Henrique Barboza <danielhb413@gmail.com>
Reviewed-by: Michal Privoznik <mprivozn@redhat.com>
docs/formatdomain.rst
docs/schemas/domaincommon.rng
src/conf/domain_conf.c
src/conf/domain_conf.h

index df5ac280285108ebff7f370d2776685a69670a80..83dec62f30356eea8b1fb6f11ded169b99c0a6c4 100644 (file)
@@ -6755,6 +6755,12 @@ Example: manually added device with static PCI slot 2 requested
    release some memory at the last moment before a guest's process get killed by
    Out of Memory killer. :since:`Since 1.3.1, QEMU and KVM only`
 
+``free-page-reporting``
+   The optional ``free-page-reporting`` attribute allows to enable/disable
+   ("on"/"off", respectively) the ability of the QEMU virtio memory balloon to
+   return unused pages back to the hypervisor to be used by other guests or
+   processes. :since:`Since 6.9.0, QEMU and KVM only`
+
 ``period``
    The optional ``period`` allows the QEMU virtio memory balloon driver to
    provide statistics through the ``virsh dommemstat           [domain]``
index 7d4b105981e8b2eb69426167f1b2c6fee00f8e0c..0a0f0ed8a811b2a00e5898e86f50400546eca427 100644 (file)
           <ref name="virOnOff"/>
         </attribute>
       </optional>
+      <optional>
+         <attribute name="free-page-reporting">
+           <ref name="virOnOff"/>
+         </attribute>
+       </optional>
       <interleave>
         <optional>
           <ref name="alias"/>
index 51efeb0e42fbb2cd95e8748e9666485f21124a4d..1d3661c21f10edc14820579a95cc3abcc94d6699 100644 (file)
@@ -15336,6 +15336,7 @@ virDomainMemballoonDefParseXML(virDomainXMLOptionPtr xmlopt,
     VIR_XPATH_NODE_AUTORESTORE(ctxt)
     unsigned int period = 0;
     g_autofree char *model = NULL;
+    g_autofree char *freepage_reporting = NULL;
     g_autofree char *deflate = NULL;
 
     def = g_new0(virDomainMemballoonDef, 1);
@@ -15360,6 +15361,13 @@ virDomainMemballoonDefParseXML(virDomainXMLOptionPtr xmlopt,
         goto error;
     }
 
+    if ((freepage_reporting = virXMLPropString(node, "free-page-reporting")) &&
+        (def->free_page_reporting = virTristateSwitchTypeFromString(freepage_reporting)) <= 0) {
+        virReportError(VIR_ERR_CONFIG_UNSUPPORTED,
+                       _("invalid free-page-reporting attribute value '%s'"), freepage_reporting);
+        goto error;
+    }
+
     ctxt->node = node;
     if (virXPathUInt("string(./stats/@period)", ctxt, &period) < -1) {
         virReportError(VIR_ERR_XML_ERROR, "%s",
@@ -23538,6 +23546,15 @@ virDomainMemballoonDefCheckABIStability(virDomainMemballoonDefPtr src,
         return false;
     }
 
+    if (src->free_page_reporting != dst->free_page_reporting) {
+        virReportError(VIR_ERR_CONFIG_UNSUPPORTED,
+                       _("Target balloon free-page-reporting attribute value "
+                         "'%s' does not match source '%s'"),
+                       virTristateSwitchTypeToString(dst->free_page_reporting),
+                       virTristateSwitchTypeToString(src->free_page_reporting));
+        return false;
+    }
+
     if (src->virtio && dst->virtio &&
         !virDomainVirtioOptionsCheckABIStability(src->virtio, dst->virtio))
         return false;
@@ -27644,6 +27661,10 @@ virDomainMemballoonDefFormat(virBufferPtr buf,
         virBufferAsprintf(&attrBuf, " autodeflate='%s'",
                           virTristateSwitchTypeToString(def->autodeflate));
 
+    if (def->free_page_reporting != VIR_TRISTATE_SWITCH_ABSENT)
+        virBufferAsprintf(&attrBuf, " free-page-reporting='%s'",
+                          virTristateSwitchTypeToString(def->free_page_reporting));
+
     if (def->period)
         virBufferAsprintf(&childrenBuf, "<stats period='%i'/>\n", def->period);
 
index 450686dfb5b1099d1c0277aa9ce810250189969d..902dd58112c205f109a308bce2ed08eedcdf0ffb 100644 (file)
@@ -1790,6 +1790,7 @@ struct _virDomainMemballoonDef {
     virDomainDeviceInfo info;
     int period; /* seconds between collections */
     int autodeflate; /* enum virTristateSwitch */
+    int free_page_reporting; /* enum virTristateSwitch */
     virDomainVirtioOptionsPtr virtio;
 };