]> xenbits.xensource.com Git - libvirt.git/commitdiff
util: Correct the NUMA node range checking
authorOsier Yang <jyang@redhat.com>
Wed, 22 Jan 2014 09:18:44 +0000 (17:18 +0800)
committerOsier Yang <jyang@redhat.com>
Thu, 23 Jan 2014 05:19:56 +0000 (13:19 +0800)
There are 2 issues here: First we shouldn't add "1" to the return
value of numa_max_node(), since the semanteme of the error message
was changed, it's not saying about the number of total NUMA nodes
anymore.  Second, the value of "bit" is the position of the first
bit which exceeds either numa_max_node() or NUMA_NUM_NODES, it can
be any number in the range, so saying "bigger than $bit" is quite
confused now. For example, assuming there is a NUMA machine which
has 10 NUMA nodes, and one specifies the "nodeset" as "0,5,88",
the error message will be like:

Nodeset is out of range, host cannot support NUMA node bigger than 88

It sounds like all NUMA node number less than 88 is fine, but
actually the maximum NUMA node number the machine supports is 9.

This patch fixes the issues by removing the addition with "1" and
simplifies the error message as "NUMA node $bit is out of range".
Also simplifies the comparision in the while loop by getting the
smaller one of numa_max_node() and NUMA_NUM_NODES up front.

src/util/virnuma.c

index ab4659131e2ae14216dabda9c4633fc706ce791b..162872c29090ca8e362c5a53664a09fc59f17ebc 100644 (file)
@@ -122,16 +122,16 @@ virNumaSetupMemoryPolicy(virNumaTuneDef numatune,
         return -1;
     }
 
-    maxnode = numa_max_node() + 1;
+    maxnode = numa_max_node();
+    maxnode = maxnode < NUMA_NUM_NODES ? maxnode : NUMA_NUM_NODES;
 
     /* Convert nodemask to NUMA bitmask. */
     nodemask_zero(&mask);
     bit = -1;
     while ((bit = virBitmapNextSetBit(tmp_nodemask, bit)) >= 0) {
-        if (bit > maxnode || bit > NUMA_NUM_NODES) {
+        if (bit > maxnode) {
             virReportError(VIR_ERR_INTERNAL_ERROR,
-                           _("Nodeset is out of range, host cannot support "
-                             "NUMA node bigger than %d"), bit);
+                           _("NUMA node %d is out of range"), bit);
             return -1;
         }
         nodemask_set(&mask, bit);