On Mon, Jun 02, 2014 at 04:57:42PM +0100, Daniel P. Berrange wrote:
On Mon, Jun 02, 2014 at 02:15:59PM +0200, Michal Privoznik wrote:
> The API gets a NUMA node and find distances to other nodes. The
> distances are returned in an array. If an item X within the array
> equals to value of zero, then there's no such node as X.
>
> Signed-off-by: Michal Privoznik <mprivozn(a)redhat.com>
> ---
> src/libvirt_private.syms | 1 +
> src/util/virnuma.c | 50 ++++++++++++++++++++++++++++++++++++++++++++++++
> src/util/virnuma.h | 3 +++
> 3 files changed, 54 insertions(+)
>
> diff --git a/src/libvirt_private.syms b/src/libvirt_private.syms
> index cb635cd..6168f76 100644
> --- a/src/libvirt_private.syms
> +++ b/src/libvirt_private.syms
> @@ -1652,6 +1652,7 @@ virNodeSuspendGetTargetMask;
> virDomainNumatuneMemModeTypeFromString;
> virDomainNumatuneMemModeTypeToString;
> virNumaGetAutoPlacementAdvice;
> +virNumaGetDistances;
> virNumaGetMaxNode;
> virNumaGetNodeMemory;
> virNumaIsAvailable;
> diff --git a/src/util/virnuma.c b/src/util/virnuma.c
> index 1e099eb..68b2698 100644
> --- a/src/util/virnuma.c
> +++ b/src/util/virnuma.c
> @@ -217,6 +217,56 @@ 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.
I think it'd be worth stating what the distance is between
a node and itself, since that's another special case. I'd
assumed that the distince between a ndoe and itself would
be zero, but your next patch shows that it would be 10 which
I find a bit bizarre. Presumably that's just what numactl,
or perhaps the kernel, reports ?
If we are relying on numactl's value ranges, then we should
be clear about this to help people porting to non-Linux
platforms.
Answering my own question.... these values come from the kernel
which in turn gets them from the BIOS SLIT tables. '10' is the
magic value for "local distance" and everything large is a rough
indication of memory access time penalty. So '20' means the
remote node memory access is x2 slower. Since it is BIOS
defined, we should be fine using these values as-is in the
libvirt XML. Lets just document '10' as being the local node
value and that other values are a scale factor relative to
this.
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 :|