From 92ff72b52cc1f12e3d1d75933fe3c1e03c32caea Mon Sep 17 00:00:00 2001 From: "Daniel P. Berrange" Date: Fri, 3 Apr 2009 12:45:05 +0000 Subject: [PATCH] Misc NUMA related fixes --- ChangeLog | 10 ++++++++++ qemud/remote.c | 12 +++++++----- src/qemu_driver.c | 14 +++++++++++--- src/virsh.c | 6 ++++-- 4 files changed, 32 insertions(+), 10 deletions(-) diff --git a/ChangeLog b/ChangeLog index 5b4a9d09a6..888a560e8f 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,13 @@ +Fri Apr 3 13:41:00 BST 2009 Daniel P. Berrange + + 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 Support PCI passthrough in Xen driver diff --git a/qemud/remote.c b/qemud/remote.c index 44a274ab30..e27820f607 100644 --- a/qemud/remote.c +++ b/qemud/remote.c @@ -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; } diff --git a/src/qemu_driver.c b/src/qemu_driver.c index 8e0231b976..4a0ae8268c 100644 --- a/src/qemu_driver.c +++ b/src/qemu_driver.c @@ -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) { diff --git a/src/virsh.c b/src/virsh.c index a8b6b7b32c..7a72dc26e5 100644 --- a/src/virsh.c +++ b/src/virsh.c @@ -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; }