[libvirt] [PATCH] util: Correct the NUMA node range checking
Eric Blake
eblake at redhat.com
Thu Jan 23 00:04:07 UTC 2014
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?
ACK if you can fix that up.
> 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);
>
--
Eric Blake eblake redhat com +1-919-301-3266
Libvirt virtualization library http://libvirt.org
-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 604 bytes
Desc: OpenPGP digital signature
URL: <http://listman.redhat.com/archives/libvir-list/attachments/20140122/1e466dff/attachment-0001.sig>
More information about the libvir-list
mailing list