[libvirt] [PATCH 2/3] virnuma: Introduce virNumaGetDistances

Daniel P. Berrange berrange at redhat.com
Mon Jun 2 16:09:56 UTC 2014


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 at 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 :|




More information about the libvir-list mailing list