]> git.ipfire.org Git - thirdparty/libvirt.git/commitdiff
virhostmem: Let caller pass max NUMA node to virHostMemGetFreePages
authorMichal Privoznik <mprivozn@redhat.com>
Thu, 19 Aug 2021 13:53:39 +0000 (15:53 +0200)
committerMichal Privoznik <mprivozn@redhat.com>
Mon, 23 Aug 2021 12:00:10 +0000 (14:00 +0200)
In all three cases (LXC, QEMU and VBox drivers) the caller has
access to host capabilities and thus know the maximum NUMA node.
This means, that virHostMemGetFreePages() doesn't have to query
it. Querying may fail if libvirt was compiled without numactl
support.

Signed-off-by: Michal Privoznik <mprivozn@redhat.com>
Reviewed-by: Martin Kletzander <mkletzan@redhat.com>
src/lxc/lxc_driver.c
src/qemu/qemu_driver.c
src/util/virhostmem.c
src/util/virhostmem.h
src/vbox/vbox_common.c

index 8f2ca19f44dc11ba7a245d39e7ac99026d431fc0..f720cf968d84fc7c750d1cb4cdabadf6d275e277 100644 (file)
@@ -5013,12 +5013,22 @@ lxcNodeGetFreePages(virConnectPtr conn,
                     unsigned long long *counts,
                     unsigned int flags)
 {
+    virLXCDriver *driver = conn->privateData;
+    g_autoptr(virCaps) caps = NULL;
+    int lastCell;
+
     virCheckFlags(0, -1);
 
     if (virNodeGetFreePagesEnsureACL(conn) < 0)
         return -1;
 
-    return virHostMemGetFreePages(npages, pages, startCell, cellCount, counts);
+    if (!(caps = virLXCDriverGetCapabilities(driver, false)))
+        return -1;
+
+    lastCell = virCapabilitiesHostNUMAGetMaxNode(caps->host.numa);
+
+    return virHostMemGetFreePages(npages, pages, startCell, cellCount,
+                                  lastCell, counts);
 }
 
 
index f31e13889ee7b600b8e5e756b6143c6a8f44580f..6a065a9c0614296c208dfc538a7b692cee01e3fc 100644 (file)
@@ -17428,12 +17428,22 @@ qemuNodeGetFreePages(virConnectPtr conn,
                      unsigned long long *counts,
                      unsigned int flags)
 {
+    virQEMUDriver *driver = conn->privateData;
+    g_autoptr(virCaps) caps = NULL;
+    int lastCell;
+
     virCheckFlags(0, -1);
 
     if (virNodeGetFreePagesEnsureACL(conn) < 0)
         return -1;
 
-    return virHostMemGetFreePages(npages, pages, startCell, cellCount, counts);
+    if (!(caps = virQEMUDriverGetCapabilities(driver, false)))
+        return -1;
+
+    lastCell = virCapabilitiesHostNUMAGetMaxNode(caps->host.numa);
+
+    return virHostMemGetFreePages(npages, pages, startCell, cellCount,
+                                  lastCell, counts);
 }
 
 
index 8aa675cb4f86818ab637e89f114080cea3666026..43dd775fd3093364ab52ff48aaad3358c57109d7 100644 (file)
@@ -843,14 +843,12 @@ virHostMemGetFreePages(unsigned int npages,
                        unsigned int *pages,
                        int startCell,
                        unsigned int cellCount,
+                       int lastCell,
                        unsigned long long *counts)
 {
-    int cell, lastCell;
+    int cell;
     size_t i, ncounts = 0;
 
-    if ((lastCell = virNumaGetMaxNode()) < 0)
-        return 0;
-
     if (startCell > lastCell) {
         virReportError(VIR_ERR_INTERNAL_ERROR,
                        _("start cell %d out of range (0-%d)"),
index 1369829807da137e38ae0698ecebb71b32fc695a..ecfdd716188c91fd2b9168cb96b59ffaafc9dbab 100644 (file)
@@ -45,6 +45,7 @@ int virHostMemGetFreePages(unsigned int npages,
                            unsigned int *pages,
                            int startCell,
                            unsigned int cellCount,
+                           int lastCell,
                            unsigned long long *counts);
 
 int virHostMemAllocPages(unsigned int npages,
index ecdcdbe88dd2f0d933b944016f1f125cf8cb400c..89f74b86d6020d5b7b047c4a825c0620ec5d82c6 100644 (file)
@@ -7598,7 +7598,7 @@ vboxNodeGetFreeMemory(virConnectPtr conn G_GNUC_UNUSED)
 }
 
 static int
-vboxNodeGetFreePages(virConnectPtr conn G_GNUC_UNUSED,
+vboxNodeGetFreePages(virConnectPtr conn,
                      unsigned int npages,
                      unsigned int *pages,
                      int startCell,
@@ -7606,9 +7606,17 @@ vboxNodeGetFreePages(virConnectPtr conn G_GNUC_UNUSED,
                      unsigned long long *counts,
                      unsigned int flags)
 {
+    struct _vboxDriver *driver = conn->privateData;
+    int lastCell;
+
     virCheckFlags(0, -1);
 
-    return virHostMemGetFreePages(npages, pages, startCell, cellCount, counts);
+    virObjectLock(driver);
+    lastCell = virCapabilitiesHostNUMAGetMaxNode(driver->caps->host.numa);
+    virObjectUnlock(driver);
+
+    return virHostMemGetFreePages(npages, pages, startCell,
+                                  cellCount, lastCell, counts);
 }
 
 static int