[PATCH 4/5] virhostmem: Handle numactl-less build in hugepages allocation/reporting

Michal Privoznik mprivozn at redhat.com
Thu Aug 19 14:27:04 UTC 2021


When using 'virsh freepages' or 'virsh allocpages' then
virHostMemGetFreePages() or virHostMemAllocPages() is called,
respectively. But the following may happen: libvirt was built
without numactl support and thus a fake NUMA node was constructed
for capabilities, which means that startCell is going to be 0.
But we can't blindly pass startCell = 0 to virNumaGetPageInfo()
nor virNumaSetPagePoolSize() because they would operate over node
specific path (/sys/devices/system/node/nodeX) rather than NUMA
agnostic path (/sys/kernel/mm/hugepages/) and we are not
guaranteed that the former exists (kernel might have been built
without NUMA support).

Resolves:https://bugzilla.redhat.com/show_bug.cgi?id=1978574

Signed-off-by: Michal Privoznik <mprivozn at redhat.com>
---
 src/util/virhostmem.c | 16 ++++++++++++++++
 1 file changed, 16 insertions(+)

diff --git a/src/util/virhostmem.c b/src/util/virhostmem.c
index 8734dafb72..b13c3fe38e 100644
--- a/src/util/virhostmem.c
+++ b/src/util/virhostmem.c
@@ -849,6 +849,14 @@ virHostMemGetFreePages(unsigned int npages,
     int cell;
     size_t i, ncounts = 0;
 
+    if (!virNumaIsAvailable() && lastCell == 0 &&
+        startCell == 0 && cellCount == 1) {
+        /* As a special case, if we were built without numactl and want to
+         * fetch info on the fake NUMA node set startCell to -1 to make the
+         * loop below fetch overall info. */
+        startCell = -1;
+    }
+
     if (startCell > lastCell) {
         virReportError(VIR_ERR_INTERNAL_ERROR,
                        _("start cell %d out of range (0-%d)"),
@@ -891,6 +899,14 @@ virHostMemAllocPages(unsigned int npages,
     int cell;
     size_t i, ncounts = 0;
 
+    if (!virNumaIsAvailable() && lastCell == 0 &&
+        startCell == 0 && cellCount == 1) {
+        /* As a special case, if we were built without numactl and want to
+         * allocate hugepages on the fake NUMA node set startCell to -1 to make
+         * the loop below operate on NUMA agnostic sysfs paths. */
+        startCell = -1;
+    }
+
     if (startCell > lastCell) {
         virReportError(VIR_ERR_INTERNAL_ERROR,
                        _("start cell %d out of range (0-%d)"),
-- 
2.31.1




More information about the libvir-list mailing list