This is an automated email from the ASF dual-hosted git repository.

dahn pushed a commit to branch 4.22
in repository https://gitbox.apache.org/repos/asf/cloudstack.git


The following commit(s) were added to refs/heads/4.22 by this push:
     new d5165183eae KVM memballooning requires free page reporting and 
autodeflate (#11932)
d5165183eae is described below

commit d5165183eae108a8dc9ab1a48d4fb702eae8d815
Author: Brad House <[email protected]>
AuthorDate: Tue Dec 16 10:58:32 2025 -0500

    KVM memballooning requires free page reporting and autodeflate (#11932)
---
 .../com/cloud/hypervisor/kvm/resource/LibvirtVMDef.java   |  8 +++++++-
 .../kvm/resource/LibvirtDomainXMLParserTest.java          |  4 ++--
 .../cloud/hypervisor/kvm/resource/LibvirtVMDefTest.java   | 15 +++++++++++++++
 .../wrapper/LibvirtMigrateVolumeCommandWrapperTest.java   |  2 +-
 4 files changed, 25 insertions(+), 4 deletions(-)

diff --git 
a/plugins/hypervisors/kvm/src/main/java/com/cloud/hypervisor/kvm/resource/LibvirtVMDef.java
 
b/plugins/hypervisors/kvm/src/main/java/com/cloud/hypervisor/kvm/resource/LibvirtVMDef.java
index bf002b37f35..9b5eb2a6ee8 100644
--- 
a/plugins/hypervisors/kvm/src/main/java/com/cloud/hypervisor/kvm/resource/LibvirtVMDef.java
+++ 
b/plugins/hypervisors/kvm/src/main/java/com/cloud/hypervisor/kvm/resource/LibvirtVMDef.java
@@ -1340,7 +1340,13 @@ public class LibvirtVMDef {
         @Override
         public String toString() {
             StringBuilder memBalloonBuilder = new StringBuilder();
-            memBalloonBuilder.append("<memballoon model='" + memBalloonModel + 
"'>\n");
+            memBalloonBuilder.append("<memballoon model='" + memBalloonModel + 
"'");
+            /* Version integer format: major * 1,000,000 + minor * 1,000 + 
release.
+             * Require: libvirt 6.9.0, qemu 5.1.0 */
+            if (memBalloonModel != MemBalloonModel.NONE && s_qemuVersion >= 
5001000 && s_libvirtVersion >= 6009000) {
+                memBalloonBuilder.append(" autodeflate='on' 
freePageReporting='on'");
+            }
+            memBalloonBuilder.append(">\n");
             if (StringUtils.isNotBlank(memBalloonStatsPeriod)) {
                 memBalloonBuilder.append("<stats period='" + 
memBalloonStatsPeriod +"'/>\n");
             }
diff --git 
a/plugins/hypervisors/kvm/src/test/java/com/cloud/hypervisor/kvm/resource/LibvirtDomainXMLParserTest.java
 
b/plugins/hypervisors/kvm/src/test/java/com/cloud/hypervisor/kvm/resource/LibvirtDomainXMLParserTest.java
index de50cf34202..e73b4079866 100644
--- 
a/plugins/hypervisors/kvm/src/test/java/com/cloud/hypervisor/kvm/resource/LibvirtDomainXMLParserTest.java
+++ 
b/plugins/hypervisors/kvm/src/test/java/com/cloud/hypervisor/kvm/resource/LibvirtDomainXMLParserTest.java
@@ -196,7 +196,7 @@ public class LibvirtDomainXMLParserTest extends TestCase {
                      "<alias name='video0'/>" +
                      "<address type='pci' domain='0x0000' bus='0x00' 
slot='0x02' function='0x0'/>" +
                      "</video>" +
-                     "<memballoon model='virtio'>" +
+                     "<memballoon model='virtio' autodeflate='on' 
freePageReporting='on'>" +
                      "<stats period='60'/>" +
                      "<alias name='balloon0'/>" +
                      "<address type='pci' domain='0x0000' bus='0x00' 
slot='0x09' function='0x0'/>" +
@@ -379,7 +379,7 @@ public class LibvirtDomainXMLParserTest extends TestCase {
                 "    <redirdev bus='usb' type='spicevmc'>\n" +
                 "      <address type='usb' bus='0' port='3'/>\n" +
                 "    </redirdev>\n" +
-                "    <memballoon model='virtio'>\n" +
+                "    <memballoon model='virtio' autodeflate='on' 
freePageReporting='on'>\n" +
                 "      <address type='pci' domain='0x0000' bus='0x00' 
slot='0x09' function='0x0'/>\n" +
                 "    </memballoon>\n" +
                 "  </devices>\n" +
diff --git 
a/plugins/hypervisors/kvm/src/test/java/com/cloud/hypervisor/kvm/resource/LibvirtVMDefTest.java
 
b/plugins/hypervisors/kvm/src/test/java/com/cloud/hypervisor/kvm/resource/LibvirtVMDefTest.java
index 856dc0be9dc..56ad267eac7 100644
--- 
a/plugins/hypervisors/kvm/src/test/java/com/cloud/hypervisor/kvm/resource/LibvirtVMDefTest.java
+++ 
b/plugins/hypervisors/kvm/src/test/java/com/cloud/hypervisor/kvm/resource/LibvirtVMDefTest.java
@@ -465,6 +465,21 @@ public class LibvirtVMDefTest extends TestCase {
 
     @Test
     public void memBalloonDefTestVirtio() {
+        LibvirtVMDef.setGlobalQemuVersion(5001000L);
+        LibvirtVMDef.setGlobalLibvirtVersion(6009000L);
+        String expectedXml = "<memballoon model='virtio' autodeflate='on' 
freePageReporting='on'>\n<stats period='60'/>\n</memballoon>";
+        MemBalloonDef memBalloonDef = new MemBalloonDef();
+        memBalloonDef.defVirtioMemBalloon("60");
+
+        String xmlDef = memBalloonDef.toString();
+
+        assertEquals(expectedXml, xmlDef);
+    }
+
+    @Test
+    public void memBalloonDefTestVirtioOld() {
+        LibvirtVMDef.setGlobalQemuVersion(2006000L);
+        LibvirtVMDef.setGlobalLibvirtVersion(9008L);
         String expectedXml = "<memballoon model='virtio'>\n<stats 
period='60'/>\n</memballoon>";
         MemBalloonDef memBalloonDef = new MemBalloonDef();
         memBalloonDef.defVirtioMemBalloon("60");
diff --git 
a/plugins/hypervisors/kvm/src/test/java/com/cloud/hypervisor/kvm/resource/wrapper/LibvirtMigrateVolumeCommandWrapperTest.java
 
b/plugins/hypervisors/kvm/src/test/java/com/cloud/hypervisor/kvm/resource/wrapper/LibvirtMigrateVolumeCommandWrapperTest.java
index 4f1eba1a772..e3d35dfb4d1 100644
--- 
a/plugins/hypervisors/kvm/src/test/java/com/cloud/hypervisor/kvm/resource/wrapper/LibvirtMigrateVolumeCommandWrapperTest.java
+++ 
b/plugins/hypervisors/kvm/src/test/java/com/cloud/hypervisor/kvm/resource/wrapper/LibvirtMigrateVolumeCommandWrapperTest.java
@@ -208,7 +208,7 @@ public class LibvirtMigrateVolumeCommandWrapperTest {
             "      <alias name='watchdog0'/>\n" +
             "      <address type='pci' domain='0x0000' bus='0x00' slot='0x08' 
function='0x0'/>\n" +
             "    </watchdog>\n" +
-            "    <memballoon model='virtio'>\n" +
+            "    <memballoon model='virtio' autodeflate='on' 
freePageReporting='on'>\n" +
             "      <alias name='balloon0'/>\n" +
             "      <address type='pci' domain='0x0000' bus='0x00' slot='0x07' 
function='0x0'/>\n" +
             "    </memballoon>\n" +

Reply via email to