[libvirt] [PATCH] virnuma: Check for numa_bitmask_isbitset presence
Daniel P. Berrange
berrange at redhat.com
Wed Jun 4 13:29:00 UTC 2014
On Wed, Jun 04, 2014 at 03:14:11PM +0200, Michal Privoznik wrote:
> On some systems, libnuma can be present but it's so ancient that
> it misses some symbols that virNumaGetDistances() needs. To be
> more precise: numa_bitmask_isbitset() and numa_nodes_ptr are the
> symbols in question. Fortunately, they were both introduced in
> the same release so it's sufficient for us to check for only one
> of them. And the winner is numa_bitmask_isbitset().
>
> Signed-off-by: Michal Privoznik <mprivozn at redhat.com>
> ---
>
> Notes:
> While this is a build breaker, it's not that critical. Come on -
> who runs libvirt from git on stable enterprise systems? I'm
> sending it to know if the check for numa_bitmask_isbitset() is in
> the right place or should be moved to a different file.
>
> m4/virt-numactl.m4 | 4 ++
> src/util/virnuma.c | 135 +++++++++++++++++++++++++++--------------------------
> 2 files changed, 73 insertions(+), 66 deletions(-)
>
> diff --git a/m4/virt-numactl.m4 b/m4/virt-numactl.m4
> index 1dcb029..fa66d24 100644
> --- a/m4/virt-numactl.m4
> +++ b/m4/virt-numactl.m4
> @@ -19,6 +19,10 @@ dnl
>
> AC_DEFUN([LIBVIRT_CHECK_NUMACTL],[
> LIBVIRT_CHECK_LIB([NUMACTL], [numa], [numa_available], [numa.h])
> + AC_CHECK_LIB([numa], [numa_bitmask_isbitset], [have_numa_bitmask_isbitset=yes])
> + if test "$have_numa_bitmask_isbitset" = "yes"; then
> + AC_DEFINE_UNQUOTED([HAVE_NUMA_BITMASK_ISBITSET], 1, [whether numa_bitmask_isbitset is available])
> + fi
> ])
>
> AC_DEFUN([LIBVIRT_RESULT_NUMACTL],[
> diff --git a/src/util/virnuma.c b/src/util/virnuma.c
> index 042844b..f979f49 100644
> --- a/src/util/virnuma.c
> +++ b/src/util/virnuma.c
> @@ -217,61 +217,6 @@ virNumaGetMaxNode(void)
>
>
> /**
> - * virNumaGetDistances:
> - * @node: identifier of the requested NUMA node
> - * @distances: array of distances to sibling nodes
> - * @ndistances: size of @distances
> - *
> - * Get array of distances to sibling nodes from @node. If a
> - * distances[x] equals to zero, the node x is not enabled or
> - * doesn't exist. As a special case, if @node itself refers to
> - * disabled or nonexistent NUMA node, then @distances and
> - * @ndistances are set to NULL and zero respectively.
> - *
> - * The distances are a bit of magic. For a local node the value
> - * is 10, for remote it's typically 20 meaning that time penalty
> - * for accessing a remote node is two time bigger than when
> - * accessing a local node.
> - *
> - * Returns 0 on success, -1 otherwise.
> - */
> -int
> -virNumaGetDistances(int node,
> - int **distances,
> - int *ndistances)
> -{
> - int ret = -1;
> - int max_node;
> - size_t i;
> -
> - if (!numa_bitmask_isbitset(numa_nodes_ptr, node)) {
> - VIR_DEBUG("Node %d does not exist", node);
> - *distances = NULL;
> - *ndistances = 0;
> - return 0;
> - }
> -
> - if ((max_node = virNumaGetMaxNode()) < 0)
> - goto cleanup;
> -
> - if (VIR_ALLOC_N(*distances, max_node) < 0)
> - goto cleanup;
> -
> - *ndistances = max_node + 1;
> -
> - for (i = 0; i<= max_node; i++) {
> - if (!numa_bitmask_isbitset(numa_nodes_ptr, i))
> - continue;
> -
> - (*distances)[i] = numa_distance(node, i);
> - }
> -
> - ret = 0;
> - cleanup:
> - return ret;
> -}
> -
> -/**
> * virNumaGetNodeMemory:
> * @node: identifier of the requested NUMA node
> * @memsize: returns the total size of memory in the NUMA node
> @@ -443,17 +388,6 @@ virNumaGetNodeCPUs(int node ATTRIBUTE_UNUSED,
> _("NUMA isn't available on this host"));
> return -1;
> }
> -
> -int
> -virNumaGetDistances(int node ATTRIBUTE_UNUSED,
> - int **distances,
> - int *ndistances)
> -{
> - *distances = NULL;
> - *ndistances = 0;
> - VIR_DEBUG("NUMA isn't available on this host");
> - return 0;
> -}
> #endif
>
>
> @@ -469,3 +403,72 @@ virNumaGetMaxCPUs(void)
> {
> return NUMA_MAX_N_CPUS;
> }
> +
> +
> +#ifdef HAVE_NUMA_BITMASK_ISBITSET
> +/**
> + * virNumaGetDistances:
> + * @node: identifier of the requested NUMA node
> + * @distances: array of distances to sibling nodes
> + * @ndistances: size of @distances
> + *
> + * Get array of distances to sibling nodes from @node. If a
> + * distances[x] equals to zero, the node x is not enabled or
> + * doesn't exist. As a special case, if @node itself refers to
> + * disabled or nonexistent NUMA node, then @distances and
> + * @ndistances are set to NULL and zero respectively.
> + *
> + * The distances are a bit of magic. For a local node the value
> + * is 10, for remote it's typically 20 meaning that time penalty
> + * for accessing a remote node is two time bigger than when
> + * accessing a local node.
> + *
> + * Returns 0 on success, -1 otherwise.
> + */
> +int
> +virNumaGetDistances(int node,
> + int **distances,
> + int *ndistances)
> +{
> + int ret = -1;
> + int max_node;
> + size_t i;
> +
> + if (!numa_bitmask_isbitset(numa_nodes_ptr, node)) {
> + VIR_DEBUG("Node %d does not exist", node);
> + *distances = NULL;
> + *ndistances = 0;
> + return 0;
> + }
> +
> + if ((max_node = virNumaGetMaxNode()) < 0)
> + goto cleanup;
> +
> + if (VIR_ALLOC_N(*distances, max_node) < 0)
> + goto cleanup;
> +
> + *ndistances = max_node + 1;
> +
> + for (i = 0; i<= max_node; i++) {
> + if (!numa_bitmask_isbitset(numa_nodes_ptr, i))
> + continue;
> +
> + (*distances)[i] = numa_distance(node, i);
> + }
> +
> + ret = 0;
> + cleanup:
> + return ret;
> +}
> +#else
> +int
> +virNumaGetDistances(int node ATTRIBUTE_UNUSED,
> + int **distances,
> + int *ndistances)
> +{
> + *distances = NULL;
> + *ndistances = 0;
> + VIR_DEBUG("NUMA isn't available on this host");
> + return 0;
> +}
> +#endif
ACK, but I'd probably change the debug message to
"NUMA distance information isn't availble on this host"
to more accurately reflect why we disable it.
Regards,
Daniel
--
|: http://berrange.com -o- http://www.flickr.com/photos/dberrange/ :|
|: http://libvirt.org -o- http://virt-manager.org :|
|: http://autobuild.org -o- http://search.cpan.org/~danberr/ :|
|: http://entangle-photo.org -o- http://live.gnome.org/gtk-vnc :|
More information about the libvir-list
mailing list