diff --git a/src/libvirt_private.syms b/src/libvirt_private.syms index 9e25b8a17a..19a2d654f6 100644 --- a/src/libvirt_private.syms +++ b/src/libvirt_private.syms @@ -1665,6 +1665,7 @@ virNumaGetDistances; virNumaGetMaxNode; virNumaGetNodeMemory; virNumaIsAvailable; +virNumaNodeIsAvailable; virNumaSetupMemoryPolicy; virNumaTuneMemPlacementModeTypeFromString; virNumaTuneMemPlacementModeTypeToString; diff --git a/src/util/virnuma.c b/src/util/virnuma.c index 1676208b2b..5814cba7b0 100644 --- a/src/util/virnuma.c +++ b/src/util/virnuma.c @@ -406,6 +406,23 @@ virNumaGetMaxCPUs(void) #ifdef HAVE_NUMA_BITMASK_ISBITSET +/** + * virNumaNodeIsAvailable: + * @node: node to check + * + * On some hosts the set of NUMA nodes isn't continuous. + * Use this function to test if the @node is available. + * + * Returns: true if @node is available, + * false if @node doesn't exist + */ +bool +virNumaNodeIsAvailable(int node) +{ + return numa_bitmask_isbitset(numa_nodes_ptr, node); +} + + /** * virNumaGetDistances: * @node: identifier of the requested NUMA node @@ -434,7 +451,7 @@ virNumaGetDistances(int node, int max_node; size_t i; - if (!numa_bitmask_isbitset(numa_nodes_ptr, node)) { + if (!virNumaNodeIsAvailable(node)) { VIR_DEBUG("Node %d does not exist", node); *distances = NULL; *ndistances = 0; @@ -450,7 +467,7 @@ virNumaGetDistances(int node, *ndistances = max_node + 1; for (i = 0; i<= max_node; i++) { - if (!numa_bitmask_isbitset(numa_nodes_ptr, i)) + if (!virNumaNodeIsAvailable(node)) continue; (*distances)[i] = numa_distance(node, i); @@ -460,7 +477,22 @@ virNumaGetDistances(int node, cleanup: return ret; } + + #else +bool +virNumaNodeIsAvailable(int node) +{ + int max_node = virNumaGetMaxNode(); + + if (max_node < 0) + return false; + + /* Do we have anything better? */ + return (node >= 0) && (node < max_node); +} + + int virNumaGetDistances(int node ATTRIBUTE_UNUSED, int **distances, diff --git a/src/util/virnuma.h b/src/util/virnuma.h index fe1e9667cc..772296d8bd 100644 --- a/src/util/virnuma.h +++ b/src/util/virnuma.h @@ -58,6 +58,7 @@ int virNumaSetupMemoryPolicy(virNumaTuneDef numatune, bool virNumaIsAvailable(void); int virNumaGetMaxNode(void); +bool virNumaNodeIsAvailable(int node); int virNumaGetDistances(int node, int **distances, int *ndistances);