]> xenbits.xensource.com Git - libvirt.git/commitdiff
Misc NUMA related fixes
authorDaniel P. Berrange <berrange@redhat.com>
Fri, 3 Apr 2009 12:45:05 +0000 (12:45 +0000)
committerDaniel P. Berrange <berrange@redhat.com>
Fri, 3 Apr 2009 12:45:05 +0000 (12:45 +0000)
ChangeLog
qemud/remote.c
src/qemu_driver.c
src/virsh.c

index 5b4a9d09a6a2aec5be88cdc818224e5db23516de..888a560e8fd8b25e4b526804e44fd4045214cbec 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,13 @@
+Fri Apr  3 13:41:00 BST 2009 Daniel P. Berrange <berrange@redhat.com>
+
+       Misc NUMA memory fixes
+       * qemud/remote.c: Fix check of error status in the helper
+       remoteDispatchNodeGetCellsFreeMemory
+       * src/qemu_driver.c: Report error if requested start cell
+       is out of range. Fix return value if NUMA is not available
+       * src/virsh.c: Convert memory to KB for freecell command.
+       Check return value of virNodeGetFreeMemory
+
 Fri Apr  3 11:55:00 BST 2009 Daniel P. Berrange <berrange@redhat.com>
 
        Support PCI passthrough in Xen driver
index 44a274ab30569bab2cd7aaf3e5a03521a115067a..e27820f607400c06d7a9972d9f789838b26808a2 100644 (file)
@@ -662,6 +662,7 @@ remoteDispatchNodeGetCellsFreeMemory (struct qemud_server *server ATTRIBUTE_UNUS
                                       remote_node_get_cells_free_memory_args *args,
                                       remote_node_get_cells_free_memory_ret *ret)
 {
+    int err;
 
     if (args->maxCells > REMOTE_NODE_MAX_CELLS) {
         remoteDispatchFormatError (rerr,
@@ -675,15 +676,16 @@ remoteDispatchNodeGetCellsFreeMemory (struct qemud_server *server ATTRIBUTE_UNUS
         return -1;
     }
 
-    ret->freeMems.freeMems_len = virNodeGetCellsFreeMemory(conn,
-                                                           (unsigned long long *)ret->freeMems.freeMems_val,
-                                                           args->startCell,
-                                                           args->maxCells);
-    if (ret->freeMems.freeMems_len == 0) {
+    err = virNodeGetCellsFreeMemory(conn,
+                                    (unsigned long long *)ret->freeMems.freeMems_val,
+                                    args->startCell,
+                                    args->maxCells);
+    if (err <= 0) {
         VIR_FREE(ret->freeMems.freeMems_val);
         remoteDispatchConnError(rerr, conn);
         return -1;
     }
+    ret->freeMems.freeMems_len = err;
 
     return 0;
 }
index 8e0231b97697763b9f769eb18a782fa17c19809a..4a0ae8268c88a300570739830731022afe2bc597 100644 (file)
@@ -1878,15 +1878,23 @@ qemudNodeGetCellsFreeMemory(virConnectPtr conn,
 {
     int n, lastCell, numCells;
     int ret = -1;
+    int maxCell;
 
     if (numa_available() < 0) {
         qemudReportError(conn, NULL, NULL, VIR_ERR_NO_SUPPORT,
                          "%s", _("NUMA not supported on this host"));
         goto cleanup;
     }
+    maxCell = numa_max_node();
+    if (startCell > maxCell) {
+        qemudReportError(conn, NULL, NULL, VIR_ERR_INTERNAL_ERROR,
+                         _("start cell %d out of range (0-%d)"),
+                         startCell, maxCell);
+        goto cleanup;
+    }
     lastCell = startCell + maxCells - 1;
-    if (lastCell > numa_max_node())
-        lastCell = numa_max_node();
+    if (lastCell > maxCell)
+        lastCell = maxCell;
 
     for (numCells = 0, n = startCell ; n <= lastCell ; n++) {
         long long mem;
@@ -1906,7 +1914,7 @@ cleanup:
 static unsigned long long
 qemudNodeGetFreeMemory (virConnectPtr conn)
 {
-    unsigned long long freeMem = -1;
+    unsigned long long freeMem = 0;
     int n;
 
     if (numa_available() < 0) {
index a8b6b7b32cf7e96632210238a5ae21650396018e..7a72dc26e58e1940ce6e83a8082e11bb52aeb9b5 100644 (file)
@@ -1654,6 +1654,8 @@ cmdFreecell(vshControl *ctl, const vshCmd *cmd)
     cell = vshCommandOptInt(cmd, "cellno", &cell_given);
     if (!cell_given) {
         memory = virNodeGetFreeMemory(ctl->conn);
+        if (memory == 0)
+            return FALSE;
     } else {
         ret = virNodeGetCellsFreeMemory(ctl->conn, &memory, cell, 1);
         if (ret != 1)
@@ -1661,9 +1663,9 @@ cmdFreecell(vshControl *ctl, const vshCmd *cmd)
     }
 
     if (cell == -1)
-        vshPrint(ctl, "%s: %llu kB\n", _("Total"), memory);
+        vshPrint(ctl, "%s: %llu kB\n", _("Total"), (memory/1024));
     else
-        vshPrint(ctl, "%d: %llu kB\n", cell, memory);
+        vshPrint(ctl, "%d: %llu kB\n", cell, (memory/1024));
 
     return TRUE;
 }