]> git.ipfire.org Git - thirdparty/libvirt.git/commitdiff
qemu: Separate out hugepages handling from qemuBuildMemoryBackendProps()
authorMichal Privoznik <mprivozn@redhat.com>
Wed, 1 Dec 2021 09:44:32 +0000 (10:44 +0100)
committerMichal Privoznik <mprivozn@redhat.com>
Wed, 26 Jan 2022 11:41:26 +0000 (12:41 +0100)
The qemuBuildMemoryBackendProps() function is already long
enough. Move code that decides what hugepages to use into a
separate function.

Signed-off-by: Michal Privoznik <mprivozn@redhat.com>
Reviewed-by: Ján Tomko <jtomko@redhat.com>
src/qemu/qemu_command.c

index 31d1d15adf175e007feff80e9f9480a869683bd3..04263fe579aa16dc00569cdee01d75b2bb420845 100644 (file)
@@ -3604,6 +3604,86 @@ qemuBuildMemoryGetDefaultPagesize(virQEMUDriverConfig *cfg,
 }
 
 
+static int
+qemuBuildMemoryGetPagesize(virQEMUDriverConfig *cfg,
+                           const virDomainDef *def,
+                           const virDomainMemoryDef *mem,
+                           unsigned long long *pagesizeRet,
+                           bool *needHugepageRet,
+                           bool *useHugepageRet)
+{
+    const long system_page_size = virGetSystemPageSizeKB();
+    unsigned long long pagesize = mem->pagesize;
+    bool needHugepage = !!pagesize;
+    bool useHugepage = !!pagesize;
+
+    if (pagesize == 0) {
+        virDomainHugePage *master_hugepage = NULL;
+        virDomainHugePage *hugepage = NULL;
+        bool thisHugepage = false;
+        size_t i;
+
+        /* Find the huge page size we want to use */
+        for (i = 0; i < def->mem.nhugepages; i++) {
+            hugepage = &def->mem.hugepages[i];
+
+            if (!hugepage->nodemask) {
+                master_hugepage = hugepage;
+                continue;
+            }
+
+            /* just find the master hugepage in case we don't use NUMA */
+            if (mem->targetNode < 0)
+                continue;
+
+            if (virBitmapGetBit(hugepage->nodemask, mem->targetNode,
+                                &thisHugepage) < 0) {
+                /* Ignore this error. It's not an error after all. Well,
+                 * the nodemask for this <page/> can contain lower NUMA
+                 * nodes than we are querying in here. */
+                continue;
+            }
+
+            if (thisHugepage) {
+                /* Hooray, we've found the page size */
+                needHugepage = true;
+                break;
+            }
+        }
+
+        if (i == def->mem.nhugepages) {
+            /* We have not found specific huge page to be used with this
+             * NUMA node. Use the generic setting then (<page/> without any
+             * @nodemask) if possible. */
+            hugepage = master_hugepage;
+        }
+
+        if (hugepage) {
+            pagesize = hugepage->size;
+            useHugepage = true;
+        }
+    }
+
+    if (pagesize == system_page_size) {
+        /* However, if user specified to use "huge" page
+         * of regular system page size, it's as if they
+         * hasn't specified any huge pages at all. */
+        pagesize = 0;
+        needHugepage = false;
+        useHugepage = false;
+    } else if (useHugepage && pagesize == 0) {
+        if (qemuBuildMemoryGetDefaultPagesize(cfg, &pagesize) < 0)
+            return -1;
+    }
+
+    *pagesizeRet = pagesize;
+    *needHugepageRet = needHugepage;
+    *useHugepageRet = useHugepage;
+
+    return 0;
+}
+
+
 /**
  * qemuBuildMemoryBackendProps:
  * @backendProps: [out] constructed object
@@ -3641,18 +3721,16 @@ qemuBuildMemoryBackendProps(virJSONValue **backendProps,
 {
     const char *backendType = "memory-backend-file";
     virDomainNumatuneMemMode mode;
-    const long system_page_size = virGetSystemPageSizeKB();
     virDomainMemoryAccess memAccess = mem->access;
-    size_t i;
     g_autofree char *memPath = NULL;
     bool prealloc = false;
     virBitmap *nodemask = NULL;
     int rc;
     g_autoptr(virJSONValue) props = NULL;
     bool nodeSpecified = virDomainNumatuneNodeSpecified(def->numa, mem->targetNode);
-    unsigned long long pagesize = mem->pagesize;
-    bool needHugepage = !!pagesize;
-    bool useHugepage = !!pagesize;
+    unsigned long long pagesize = 0;
+    bool needHugepage = false;
+    bool useHugepage = false;
     int discard = mem->discard;
     bool disableCanonicalPath = false;
 
@@ -3697,63 +3775,9 @@ qemuBuildMemoryBackendProps(virJSONValue **backendProps,
         virDomainNumatuneGetMode(def->numa, -1, &mode) < 0)
         mode = VIR_DOMAIN_NUMATUNE_MEM_STRICT;
 
-    if (pagesize == 0) {
-        virDomainHugePage *master_hugepage = NULL;
-        virDomainHugePage *hugepage = NULL;
-        bool thisHugepage = false;
-
-        /* Find the huge page size we want to use */
-        for (i = 0; i < def->mem.nhugepages; i++) {
-            hugepage = &def->mem.hugepages[i];
-
-            if (!hugepage->nodemask) {
-                master_hugepage = hugepage;
-                continue;
-            }
-
-            /* just find the master hugepage in case we don't use NUMA */
-            if (mem->targetNode < 0)
-                continue;
-
-            if (virBitmapGetBit(hugepage->nodemask, mem->targetNode,
-                                &thisHugepage) < 0) {
-                /* Ignore this error. It's not an error after all. Well,
-                 * the nodemask for this <page/> can contain lower NUMA
-                 * nodes than we are querying in here. */
-                continue;
-            }
-
-            if (thisHugepage) {
-                /* Hooray, we've found the page size */
-                needHugepage = true;
-                break;
-            }
-        }
-
-        if (i == def->mem.nhugepages) {
-            /* We have not found specific huge page to be used with this
-             * NUMA node. Use the generic setting then (<page/> without any
-             * @nodemask) if possible. */
-            hugepage = master_hugepage;
-        }
-
-        if (hugepage) {
-            pagesize = hugepage->size;
-            useHugepage = true;
-        }
-    }
-
-    if (pagesize == system_page_size) {
-        /* However, if user specified to use "huge" page
-         * of regular system page size, it's as if they
-         * hasn't specified any huge pages at all. */
-        pagesize = 0;
-        needHugepage = false;
-        useHugepage = false;
-    } else if (useHugepage && pagesize == 0) {
-        if (qemuBuildMemoryGetDefaultPagesize(cfg, &pagesize) < 0)
-            return -1;
-    }
+    if (qemuBuildMemoryGetPagesize(cfg, def, mem, &pagesize,
+                                   &needHugepage, &useHugepage) < 0)
+        return -1;
 
     props = virJSONValueNewObject();