]> xenbits.xensource.com Git - people/dariof/libvirt.git/commitdiff
libxl: fix node ranges in libxlNodeGetCellsFreeMemory()
authorDario Faggioli <dario.faggioli@citrix.com>
Thu, 8 Aug 2013 16:02:47 +0000 (18:02 +0200)
committerDario Faggioli <dario.faggioli@citrix.com>
Fri, 9 Aug 2013 08:48:19 +0000 (10:48 +0200)
introduced by cs 4b9eec50fe2c23343 ("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>
src/libxl/libxl_driver.c

index 9e9bc89afb7dbdf02dfaf3ff9d9b855800fd2697..04058d3501ca54e94fecf52951747c3eaa01da94 100644 (file)
@@ -4107,23 +4107,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)