[libvirt] [PATCH v2] libxl: report numa sibling distances on host capabilities

Wim Ten Have wim.ten.have at oracle.com
Tue May 9 18:06:29 UTC 2017


From: Wim ten Have <wim.ten.have at oracle.com>

When running on a NUMA machine, populate the sibling node
and distance information using data supplied by Xen.

With locality distances information, under Xen, new host
capabilities would like:

    <topology>
      <cells num='4'>
        <cell id='0'>
          <memory unit='KiB'>263902380</memory>
          <distances>
            <sibling id='0' value='10'/>
            <sibling id='1' value='21'/>
          </distances>
          ...
        </cell>
        ...
      </cells>
      ...
    </topology>

Signed-off-by: Wim ten Have <wim.ten.have at oracle.com>
---
 src/libxl/libxl_capabilities.c | 19 +++++++++++++++++--
 1 file changed, 17 insertions(+), 2 deletions(-)

diff --git a/src/libxl/libxl_capabilities.c b/src/libxl/libxl_capabilities.c
index 839a2ee..e095920 100644
--- a/src/libxl/libxl_capabilities.c
+++ b/src/libxl/libxl_capabilities.c
@@ -247,8 +247,9 @@ libxlCapsInitNuma(libxl_ctx *ctx, virCapsPtr caps)
 {
     libxl_numainfo *numa_info = NULL;
     libxl_cputopology *cpu_topo = NULL;
-    int nr_nodes = 0, nr_cpus = 0;
+    int nr_nodes = 0, nr_cpus = 0, nr_siblings = 0;
     virCapsHostNUMACellCPUPtr *cpus = NULL;
+    virCapsHostNUMACellSiblingInfoPtr siblings = NULL;
     int *nr_cpus_node = NULL;
     size_t i;
     int ret = -1;
@@ -322,10 +323,23 @@ libxlCapsInitNuma(libxl_ctx *ctx, virCapsPtr caps)
         if (numa_info[i].size == LIBXL_NUMAINFO_INVALID_ENTRY)
             continue;
 
+        nr_siblings = numa_info[i].num_dists;
+        if (nr_siblings) {
+            size_t j;
+
+            if (VIR_ALLOC_N(siblings, nr_siblings) < 0)
+                goto cleanup;
+
+            for (j = 0; j < nr_siblings; j++) {
+                siblings[j].node = j;
+                siblings[j].distance = numa_info[i].dists[j];
+            }
+        }
+
         if (virCapabilitiesAddHostNUMACell(caps, i,
                                            numa_info[i].size / 1024,
                                            nr_cpus_node[i], cpus[i],
-                                           0, NULL,
+                                           nr_siblings, siblings,
                                            0, NULL) < 0) {
             virCapabilitiesClearHostNUMACellCPUTopology(cpus[i],
                                                         nr_cpus_node[i]);
@@ -343,6 +357,7 @@ libxlCapsInitNuma(libxl_ctx *ctx, virCapsPtr caps)
         for (i = 0; cpus && i < nr_nodes; i++)
             VIR_FREE(cpus[i]);
         virCapabilitiesFreeNUMAInfo(caps);
+        VIR_FREE(siblings);
     }
 
     VIR_FREE(cpus);
-- 
2.9.3




More information about the libvir-list mailing list