From 2b6d170cc9b511657cd0aefc8515bdc4b7467a94 Mon Sep 17 00:00:00 2001
From: hy <941973499@qq.com>
Date: Mon, 18 Aug 2025 11:02:40 +0800
Subject: [PATCH] conf: add support for memorytune XML processing for MB
 min_bandwidth

---
 src/conf/domain_conf.c            | 12 ++++++++++--
 src/conf/schemas/domaincommon.rng |  5 +++++
 src/util/virresctrl.c             |  8 +++++++-
 3 files changed, 22 insertions(+), 3 deletions(-)

diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c
index 28b2157424..04f2642109 100644
--- a/src/conf/domain_conf.c
+++ b/src/conf/domain_conf.c
@@ -18239,6 +18239,7 @@ virDomainMemorytuneDefParseMemory(xmlXPathContextPtr ctxt,
     unsigned int bandwidth;
     unsigned int hard_limit = UINT_MAX;
     unsigned int priority = UINT_MAX;
+    unsigned int min_bandwidth = UINT_MAX;
 
     ctxt->node = node;
 
@@ -18252,20 +18253,27 @@ virDomainMemorytuneDefParseMemory(xmlXPathContextPtr ctxt,
     if (virResctrlAllocSetMemoryBandwidth(alloc, VIR_MEMORY_TYPE_BANDWIDTH, id, bandwidth) < 0)
         return -1;
 
-    if (virXMLPropUIntDefault(node, "hardlimit", 10, 0, &hard_limit, UINT_MAX) < 0)
+    if (virXMLPropUIntDefault(node, "hardlimit", 10, VIR_XML_PROP_NONE, &hard_limit, UINT_MAX) < 0)
         return -1;
 
     if (hard_limit != UINT_MAX &&
         virResctrlAllocSetMemoryBandwidth(alloc, VIR_MEMORY_TYPE_HARDLIMIT, id, hard_limit) < 0)
         return -1;
 
-    if (virXMLPropUIntDefault(node, "priority", 10, 0, &priority, UINT_MAX) < 0)
+    if (virXMLPropUIntDefault(node, "priority", 10, VIR_XML_PROP_NONE, &priority, UINT_MAX) < 0)
         return -1;
 
     if (priority != UINT_MAX &&
         virResctrlAllocSetMemoryBandwidth(alloc, VIR_MEMORY_TYPE_PRIORITY, id, priority) < 0)
         return -1;
 
+    if (virXMLPropUIntDefault(node, "min_bandwidth", 10, VIR_XML_PROP_NONE, &min_bandwidth, UINT_MAX) < 0)
+        return -1;
+    
+    if (min_bandwidth != UINT_MAX &&
+        virResctrlAllocSetMemoryBandwidth(alloc, VIR_MEMORY_TYPE_MIN_BANDWIDTH, id, min_bandwidth) < 0)
+        return -1;
+
     return 0;
 }
 
diff --git a/src/conf/schemas/domaincommon.rng b/src/conf/schemas/domaincommon.rng
index 1b2256fddf..a2e0119888 100644
--- a/src/conf/schemas/domaincommon.rng
+++ b/src/conf/schemas/domaincommon.rng
@@ -1195,6 +1195,11 @@
                       <ref name="unsignedInt"/>
                     </attribute>
                   </optional>
+                  <optional>
+                    <attribute name="min_bandwidth">
+                      <ref name="unsignedInt"/>
+                    </attribute>
+                  </optional>
                 </element>
                 <element name="monitor">
                   <attribute name="vcpus">
diff --git a/src/util/virresctrl.c b/src/util/virresctrl.c
index 06935cc11f..afd70c821a 100644
--- a/src/util/virresctrl.c
+++ b/src/util/virresctrl.c
@@ -87,7 +87,7 @@ VIR_ENUM_IMPL(virMemory,
               "bandwidth",
               "hardlimit",
               "priority",
-              "minbandwidth",
+              "min_bandwidth",
 );
 
 VIR_ENUM_DECL(virResctrlMemory);
@@ -1423,6 +1423,12 @@ virResctrlAllocSetMemoryBandwidth(virResctrlAlloc *alloc,
             }
             break;
         case VIR_MEMORY_TYPE_MIN_BANDWIDTH:
+            if (value > 100) {
+                virReportError(VIR_ERR_XML_ERROR, "%s",
+                               _("Memory Bandwidth min_bandwidth value exceeding 100 is invalid."));
+                return -1;
+            }
+            break;
         case VIR_MEMORY_TYPE_LAST:
         default:
             virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
-- 
2.33.0