From 9dd02965a5680c2fe3a43bf226227e9e11dd1d1e Mon Sep 17 00:00:00 2001 From: Peter Krempa Date: Thu, 17 Oct 2013 18:30:09 +0200 Subject: [PATCH] numa: Introduce virNumaGetNodeMemory and use it instead of numa_node_size64 --- src/libvirt_private.syms | 1 + src/nodeinfo.c | 21 ++++++--------- src/util/virnuma.c | 55 ++++++++++++++++++++++++++++++++++++++++ src/util/virnuma.h | 3 +++ 4 files changed, 67 insertions(+), 13 deletions(-) diff --git a/src/libvirt_private.syms b/src/libvirt_private.syms index 11ea2bb3f4..f6ab5a23e3 100644 --- a/src/libvirt_private.syms +++ b/src/libvirt_private.syms @@ -1524,6 +1524,7 @@ virDomainNumatuneMemModeTypeFromString; virDomainNumatuneMemModeTypeToString; virNumaGetAutoPlacementAdvice; virNumaGetMaxNode; +virNumaGetNodeMemory; virNumaIsAvailable; virNumaSetupMemoryPolicy; virNumaTuneMemPlacementModeTypeFromString; diff --git a/src/nodeinfo.c b/src/nodeinfo.c index 9b20fb236d..0c7669de40 100644 --- a/src/nodeinfo.c +++ b/src/nodeinfo.c @@ -1680,6 +1680,7 @@ nodeGetCellsFreeMemory(unsigned long long *freeMems, int startCell, int maxCells) { + unsigned long long mem; int n, lastCell, numCells; int ret = -1; int maxCell; @@ -1702,9 +1703,7 @@ nodeGetCellsFreeMemory(unsigned long long *freeMems, lastCell = maxCell; for (numCells = 0, n = startCell; n <= lastCell; n++) { - long long mem; - if (numa_node_size64(n, &mem) < 0) - mem = 0; + virNumaGetNodeMemory(n, NULL, &mem); freeMems[numCells++] = mem; } @@ -1717,6 +1716,7 @@ cleanup: unsigned long long nodeGetFreeMemory(void) { + unsigned long long mem; unsigned long long freeMem = 0; int max_node; int n; @@ -1728,9 +1728,7 @@ nodeGetFreeMemory(void) return 0; for (n = 0; n <= max_node; n++) { - long long mem; - if (numa_node_size64(n, &mem) < 0) - continue; + virNumaGetNodeMemory(n, NULL, &mem); freeMem += mem; } @@ -1742,21 +1740,19 @@ nodeGetFreeMemory(void) * nodeGetCellMemory * @cell: The number of the numa cell to get memory info for. * - * Will call the numa_node_size64() function from libnuma to get - * the amount of total memory in bytes. It is then converted to - * KiB and returned. + * Request size of memory in a NUMA node. * * Returns 0 if unavailable, amount of memory in KiB on success. */ static unsigned long long nodeGetCellMemory(int cell) { - long long mem; + unsigned long long mem; unsigned long long memKiB = 0; int maxCell; /* Make sure the provided cell number is valid. */ if ((maxCell = virNumaGetMaxNode()) < 0) - return 0; + goto cleanup; if (cell > maxCell) { virReportError(VIR_ERR_INTERNAL_ERROR, @@ -1766,8 +1762,7 @@ static unsigned long long nodeGetCellMemory(int cell) } /* Get the amount of memory(bytes) in the node */ - mem = numa_node_size64(cell, NULL); - if (mem < 0) { + if (virNumaGetNodeMemory(cell, &mem, NULL) < 0) { virReportError(VIR_ERR_INTERNAL_ERROR, _("Failed to query NUMA total memory for node: %d"), cell); diff --git a/src/util/virnuma.c b/src/util/virnuma.c index 2d8d0e92ca..15a18e9f55 100644 --- a/src/util/virnuma.c +++ b/src/util/virnuma.c @@ -202,6 +202,45 @@ virNumaGetMaxNode(void) return ret; } + + +/** + * virNumaGetNodeMemorySize: + * @node: identifier of the requested NUMA node + * @memsize: returns the total size of memory in the NUMA node + * @memfree: returns the total free memory in a NUMA node + * + * Returns the size of the memory in one NUMA node in bytes via the @size + * argument and free memory of a node in the @free argument. The caller has to + * guarantee that @node is in range (see virNumaGetMaxNode). + * + * Returns 0 on success, -1 on error. Does not report errors. + */ +int +virNumaGetNodeMemory(int node, + unsigned long long *memsize, + unsigned long long *memfree) +{ + long long node_size; + long long node_free; + + if (memsize) + *memsize = 0; + + if (memfree) + *memfree = 0; + + if ((node_size = numa_node_size64(node, &node_free)) < 0) + return -1; + + if (memsize) + *memsize = node_size; + + if (memfree) + *memfree = node_free; + + return 0; +} #else int virNumaSetupMemoryPolicy(virNumaTuneDef numatune, @@ -232,4 +271,20 @@ virNumaGetMaxNode(void) _("NUMA isn't available on this host")); return -1; } + + +int +virNumaGetNodeMemory(int node ATTRIBUTE_UNUSED, + unsigned long long *memsize, + unsigned long long *memfree) +{ + if (memsize) + *memsize = 0; + + if (memfree) + *memfree = 0; + + VIR_DEBUG("NUMA isn't available on this host"); + return -1; +} #endif diff --git a/src/util/virnuma.h b/src/util/virnuma.h index 65636c327e..7640d1bfed 100644 --- a/src/util/virnuma.h +++ b/src/util/virnuma.h @@ -58,5 +58,8 @@ int virNumaSetupMemoryPolicy(virNumaTuneDef numatune, bool virNumaIsAvailable(void); int virNumaGetMaxNode(void); +int virNumaGetNodeMemory(int node, + unsigned long long *memsize, + unsigned long long *memfree); #endif /* __VIR_NUMA_H__ */