[libvirt] [PATCH] util: Correct the NUMA node range checking

Osier Yang jyang at redhat.com
Thu Jan 23 05:24:07 UTC 2014


On 23/01/14 08:04, Eric Blake wrote:
> On 01/22/2014 04:45 AM, Osier Yang wrote:
>> 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
> s/semanteme/semantics/
>
>> 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".
>> ---
>>   src/util/virnuma.c | 8 ++------
>>   1 file changed, 2 insertions(+), 6 deletions(-)
>> -    maxnode = numa_max_node() + 1;
>> -
>>       /* 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 > numa_max_node() || bit > NUMA_NUM_NODES) {
> This calls numa_max_node() in a loop, where we used to call it just
> once.  Since this is third-party code, do we know how efficient it is?
> It may be smarter to cache the results once than to call every iteration
> of the loop, to avoid O(n*2) behavior on large hosts.
>
> For that matter, can't we just set the max node to the smaller of
> numa_max_node() and NUMA_NUM_NODES up front, and avoid the || in the loop?
>

Good idea, pushed with the fix, along with a bit change in the commit log.
Thanks.

Osier




More information about the libvir-list mailing list