[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