Misc NUMA related fixes

This commit is contained in:
Daniel P. Berrange 2009-04-03 12:45:05 +00:00
parent e4073623a6
commit 92ff72b52c
4 changed files with 32 additions and 10 deletions

View File

@ -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> Fri Apr 3 11:55:00 BST 2009 Daniel P. Berrange <berrange@redhat.com>
Support PCI passthrough in Xen driver Support PCI passthrough in Xen driver

View 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_args *args,
remote_node_get_cells_free_memory_ret *ret) remote_node_get_cells_free_memory_ret *ret)
{ {
int err;
if (args->maxCells > REMOTE_NODE_MAX_CELLS) { if (args->maxCells > REMOTE_NODE_MAX_CELLS) {
remoteDispatchFormatError (rerr, remoteDispatchFormatError (rerr,
@ -675,15 +676,16 @@ remoteDispatchNodeGetCellsFreeMemory (struct qemud_server *server ATTRIBUTE_UNUS
return -1; return -1;
} }
ret->freeMems.freeMems_len = virNodeGetCellsFreeMemory(conn, err = virNodeGetCellsFreeMemory(conn,
(unsigned long long *)ret->freeMems.freeMems_val, (unsigned long long *)ret->freeMems.freeMems_val,
args->startCell, args->startCell,
args->maxCells); args->maxCells);
if (ret->freeMems.freeMems_len == 0) { if (err <= 0) {
VIR_FREE(ret->freeMems.freeMems_val); VIR_FREE(ret->freeMems.freeMems_val);
remoteDispatchConnError(rerr, conn); remoteDispatchConnError(rerr, conn);
return -1; return -1;
} }
ret->freeMems.freeMems_len = err;
return 0; return 0;
} }

View File

@ -1878,15 +1878,23 @@ qemudNodeGetCellsFreeMemory(virConnectPtr conn,
{ {
int n, lastCell, numCells; int n, lastCell, numCells;
int ret = -1; int ret = -1;
int maxCell;
if (numa_available() < 0) { if (numa_available() < 0) {
qemudReportError(conn, NULL, NULL, VIR_ERR_NO_SUPPORT, qemudReportError(conn, NULL, NULL, VIR_ERR_NO_SUPPORT,
"%s", _("NUMA not supported on this host")); "%s", _("NUMA not supported on this host"));
goto cleanup; 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; lastCell = startCell + maxCells - 1;
if (lastCell > numa_max_node()) if (lastCell > maxCell)
lastCell = numa_max_node(); lastCell = maxCell;
for (numCells = 0, n = startCell ; n <= lastCell ; n++) { for (numCells = 0, n = startCell ; n <= lastCell ; n++) {
long long mem; long long mem;
@ -1906,7 +1914,7 @@ cleanup:
static unsigned long long static unsigned long long
qemudNodeGetFreeMemory (virConnectPtr conn) qemudNodeGetFreeMemory (virConnectPtr conn)
{ {
unsigned long long freeMem = -1; unsigned long long freeMem = 0;
int n; int n;
if (numa_available() < 0) { if (numa_available() < 0) {

View File

@ -1654,6 +1654,8 @@ cmdFreecell(vshControl *ctl, const vshCmd *cmd)
cell = vshCommandOptInt(cmd, "cellno", &cell_given); cell = vshCommandOptInt(cmd, "cellno", &cell_given);
if (!cell_given) { if (!cell_given) {
memory = virNodeGetFreeMemory(ctl->conn); memory = virNodeGetFreeMemory(ctl->conn);
if (memory == 0)
return FALSE;
} else { } else {
ret = virNodeGetCellsFreeMemory(ctl->conn, &memory, cell, 1); ret = virNodeGetCellsFreeMemory(ctl->conn, &memory, cell, 1);
if (ret != 1) if (ret != 1)
@ -1661,9 +1663,9 @@ cmdFreecell(vshControl *ctl, const vshCmd *cmd)
} }
if (cell == -1) if (cell == -1)
vshPrint(ctl, "%s: %llu kB\n", _("Total"), memory); vshPrint(ctl, "%s: %llu kB\n", _("Total"), (memory/1024));
else else
vshPrint(ctl, "%d: %llu kB\n", cell, memory); vshPrint(ctl, "%d: %llu kB\n", cell, (memory/1024));
return TRUE; return TRUE;
} }