---
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 c8959ad..d7243a9 100644
--- a/src/libvirt_private.syms
+++ b/src/libvirt_private.syms
@@ -1521,6 +1521,7 @@ virDomainNumatuneMemModeTypeFromString;
virDomainNumatuneMemModeTypeToString;
virNumaGetAutoPlacementAdvice;
virNumaGetMaxNode;
+virNumaGetNodeMemory;
virNumaIsAvailable;
virNumaSetupMemoryPolicy;
virNumaTuneMemPlacementModeTypeFromString;
diff --git a/src/nodeinfo.c b/src/nodeinfo.c
index 27cd502..ba9fd57 100644
--- a/src/nodeinfo.c
+++ b/src/nodeinfo.c
@@ -1658,6 +1658,7 @@ nodeGetCellsFreeMemory(unsigned long long *freeMems,
int startCell,
int maxCells)
{
+ unsigned long long mem;
int n, lastCell, numCells;
int ret = -1;
int maxCell;
@@ -1680,9 +1681,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;
}
@@ -1695,6 +1694,7 @@ cleanup:
unsigned long long
nodeGetFreeMemory(void)
{
+ unsigned long long mem;
unsigned long long freeMem = 0;
int max_node;
int n;
@@ -1706,9 +1706,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;
}
@@ -1720,21 +1718,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,
@@ -1744,8 +1740,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 2d8d0e9..15a18e9 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 65636c3..7640d1b 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__ */
--
1.8.3.2