libxl: fix node ranges in libxlNodeGetCellsFreeMemory()

introduced by cs 4b9eec50fe ("libxl: implement per
NUMA node free memory reporting"). What was wrong was that
libxl_get_numainfo() put in nr_nodes the actual number of
host NUMA nodes, not the highest node ID (like libnuma's
numa_max_node() does instead).

While at it, turn the failure of libxl_get_numainfo() from
a simple warning to a proper error, as requested during the
review of another patch of the original series.

Signed-off-by: Dario Faggioli <dario.faggioli@citrix.com>
Cc: Daniel P. Berrange <berrange@redhat.com>
This commit is contained in:
Dario Faggioli 2013-08-09 11:05:58 +02:00 committed by Jim Fehlig
parent 70024dc919
commit 625980cc54

View File

@ -4127,23 +4127,23 @@ libxlNodeGetCellsFreeMemory(virConnectPtr conn,
if (virNodeGetCellsFreeMemoryEnsureACL(conn) < 0)
return -1;
/* Early failure is probably worth just a warning */
numa_info = libxl_get_numainfo(driver->ctx, &nr_nodes);
if (numa_info == NULL || nr_nodes == 0) {
VIR_WARN("libxl_get_numainfo failed to retrieve NUMA data");
return 0;
virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
_("libxl_get_numainfo failed"));
goto cleanup;
}
/* Check/sanitize the cell range */
if (startCell > nr_nodes) {
if (startCell >= nr_nodes) {
virReportError(VIR_ERR_INTERNAL_ERROR,
_("start cell %d out of range (0-%d)"),
startCell, nr_nodes);
startCell, nr_nodes - 1);
goto cleanup;
}
lastCell = startCell + maxCells - 1;
if (lastCell > nr_nodes)
lastCell = nr_nodes;
if (lastCell >= nr_nodes)
lastCell = nr_nodes - 1;
for (numCells = 0, n = startCell; n <= lastCell; n++) {
if (numa_info[n].size == LIBXL_NUMAINFO_INVALID_ENTRY)