]> xenbits.xensource.com Git - libvirt.git/commitdiff
numa: Introduce virNumaGetNodeMemory and use it instead of numa_node_size64
authorPeter Krempa <pkrempa@redhat.com>
Thu, 17 Oct 2013 16:30:09 +0000 (18:30 +0200)
committerPeter Krempa <pkrempa@redhat.com>
Mon, 4 Nov 2013 09:50:19 +0000 (10:50 +0100)
src/libvirt_private.syms
src/nodeinfo.c
src/util/virnuma.c
src/util/virnuma.h

index 11ea2bb3f42ab0e86d411d87768c0fb30e79fbca..f6ab5a23e35a82e9f86f5589755d502bf8f2788a 100644 (file)
@@ -1524,6 +1524,7 @@ virDomainNumatuneMemModeTypeFromString;
 virDomainNumatuneMemModeTypeToString;
 virNumaGetAutoPlacementAdvice;
 virNumaGetMaxNode;
+virNumaGetNodeMemory;
 virNumaIsAvailable;
 virNumaSetupMemoryPolicy;
 virNumaTuneMemPlacementModeTypeFromString;
index 9b20fb236d6d70cb46d3a0da371c30c0f3373f6e..0c7669de4007005f776287215a7d7d955ab1b789 100644 (file)
@@ -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);
index 2d8d0e92caec4efd3409301fc829bbb45addbf68..15a18e9f55a517ffd1e474345c63f13699101b9d 100644 (file)
@@ -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
index 65636c327e9c4ef0b986add4ae7c1261bf350d2b..7640d1bfed26af2a459de0933de1a117c63b25d1 100644 (file)
@@ -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__ */