[libvirt] [PATCH v4 1/2] libxl: fix node ranges in libxlNodeGetCellsFreeMemory()

Dario Faggioli dario.faggioli at citrix.com
Fri Aug 9 09:05:58 UTC 2013


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 at citrix.com>
Cc: Daniel P. Berrange <berrange at redhat.com>
---
 src/libxl/libxl_driver.c |   14 +++++++-------
 1 file changed, 7 insertions(+), 7 deletions(-)

diff --git a/src/libxl/libxl_driver.c b/src/libxl/libxl_driver.c
index 9e9bc89..04058d3 100644
--- a/src/libxl/libxl_driver.c
+++ b/src/libxl/libxl_driver.c
@@ -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)




More information about the libvir-list mailing list