]> xenbits.xensource.com Git - libvirt.git/commitdiff
conf: Deduplicate NUMA distance code
authorMichal Privoznik <mprivozn@redhat.com>
Mon, 3 May 2021 09:04:45 +0000 (11:04 +0200)
committerMichal Privoznik <mprivozn@redhat.com>
Mon, 24 May 2021 17:57:45 +0000 (19:57 +0200)
After previous patches we have two structures:
virCapsHostNUMACellDistance and virNumaDistance which express the
same thing. And have the exact same members (modulo their names).
Drop the former in favor of the latter.

This change means that distances with value of 0 are no longer
printed out into capabilities XML, because domain XML code allows
partial distance specification and thus threats value of 0 as
unspecified by user (see virDomainNumaGetNodeDistance() which
returns the default LOCAL/REMOTE distance for value of 0).

Also, from ACPI 6.1 specification, section 5.2.17 System Locality
Distance Information Table (SLIT):

  Distance values of 0-9 are reserved and have no meaning.

Thus we shouldn't be ever reporting 0 in neither domain nor
capabilities XML.

Signed-off-by: Michal Privoznik <mprivozn@redhat.com>
Reviewed-by: Peter Krempa <pkrempa@redhat.com>
docs/schemas/capability.rng
src/conf/capabilities.c
src/conf/capabilities.h
src/conf/virconftypes.h
src/libxl/libxl_capabilities.c

index c4cafc47ee60bd87af9c678fc3bc8215e0d3239c..fb8203ad6d63c15569dd227415e447835624a181 100644 (file)
 
       <optional>
         <element name="distances">
-          <zeroOrMore>
-            <element name="sibling">
-              <attribute name="id">
-                <ref name="unsignedInt"/>
-              </attribute>
-              <attribute name="value">
-                <ref name="unsignedInt"/>
-              </attribute>
-            </element>
-          </zeroOrMore>
+          <oneOrMore>
+            <ref name="numaDistance"/>
+          </oneOrMore>
         </element>
       </optional>
 
index 926ecb5a24c28f5c42cd00278f50b06481d0a14b..1290c9c15d5f60940fbac77c984376a115a5db9d 100644 (file)
@@ -349,7 +349,7 @@ virCapabilitiesHostNUMAAddCell(virCapsHostNUMA *caps,
                                int ncpus,
                                virCapsHostNUMACellCPU **cpus,
                                int ndistances,
-                               virCapsHostNUMACellDistance **distances,
+                               virNumaDistance **distances,
                                int npageinfo,
                                virCapsHostNUMACellPageInfo **pageinfo)
 {
@@ -833,17 +833,7 @@ virCapabilitiesHostNUMAFormat(virBuffer *buf,
                               cell->pageinfo[j].avail);
         }
 
-        if (cell->ndistances) {
-            virBufferAddLit(buf, "<distances>\n");
-            virBufferAdjustIndent(buf, 2);
-            for (j = 0; j < cell->ndistances; j++) {
-                virBufferAsprintf(buf, "<sibling id='%d' value='%d'/>\n",
-                                  cell->distances[j].node,
-                                  cell->distances[j].distance);
-            }
-            virBufferAdjustIndent(buf, -2);
-            virBufferAddLit(buf, "</distances>\n");
-        }
+        virNumaDistanceFormat(buf, cell->distances, cell->ndistances);
 
         virBufferAsprintf(buf, "<cpus num='%d'>\n", cell->ncpus);
         virBufferAdjustIndent(buf, 2);
@@ -1457,10 +1447,10 @@ virCapabilitiesFillCPUInfo(int cpu_id G_GNUC_UNUSED,
 
 static int
 virCapabilitiesGetNUMADistances(int node,
-                                virCapsHostNUMACellDistance **distancesRet,
+                                virNumaDistance **distancesRet,
                                 int *ndistancesRet)
 {
-    virCapsHostNUMACellDistance *tmp = NULL;
+    virNumaDistance *tmp = NULL;
     int tmp_size = 0;
     int ret = -1;
     int *distances = NULL;
@@ -1476,14 +1466,14 @@ virCapabilitiesGetNUMADistances(int node,
         return 0;
     }
 
-    tmp = g_new0(virCapsHostNUMACellDistance, ndistances);
+    tmp = g_new0(virNumaDistance, ndistances);
 
     for (i = 0; i < ndistances; i++) {
         if (!distances[i])
             continue;
 
-        tmp[tmp_size].node = i;
-        tmp[tmp_size].distance = distances[i];
+        tmp[tmp_size].cellid = i;
+        tmp[tmp_size].value = distances[i];
         tmp_size++;
     }
 
@@ -1607,7 +1597,7 @@ virCapabilitiesHostNUMAInitReal(virCapsHostNUMA *caps)
 
     for (n = 0; n <= max_node; n++) {
         g_autoptr(virBitmap) cpumap = NULL;
-        g_autofree virCapsHostNUMACellDistance *distances = NULL;
+        g_autofree virNumaDistance *distances = NULL;
         int ndistances = 0;
         g_autofree virCapsHostNUMACellPageInfo *pageinfo = NULL;
         int npageinfo;
index f11471ef6c6186dcd14edd2840b41fbb9c07794a..4d4ac476ea8726467a4723e39ca633b6af798ee3 100644 (file)
@@ -94,11 +94,6 @@ struct _virCapsHostNUMACellCPU {
     virBitmap *siblings;
 };
 
-struct _virCapsHostNUMACellDistance {
-    int node;               /* foreign NUMA node */
-    unsigned int distance;  /* distance to the node */
-};
-
 struct _virCapsHostNUMACellPageInfo {
     unsigned int size;      /* page size in kibibytes */
     unsigned long long avail;           /* the size of pool */
@@ -109,8 +104,8 @@ struct _virCapsHostNUMACell {
     int ncpus;
     unsigned long long mem; /* in kibibytes */
     virCapsHostNUMACellCPU *cpus;
-    int ndistances;
-    virCapsHostNUMACellDistance *distances;
+    size_t ndistances;
+    virNumaDistance *distances;
     int npageinfo;
     virCapsHostNUMACellPageInfo *pageinfo;
 };
@@ -256,7 +251,7 @@ virCapabilitiesHostNUMAAddCell(virCapsHostNUMA *caps,
                                int ncpus,
                                virCapsHostNUMACellCPU **cpus,
                                int ndistances,
-                               virCapsHostNUMACellDistance **distances,
+                               virNumaDistance **distances,
                                int npageinfo,
                                virCapsHostNUMACellPageInfo **pageinfo);
 
index d21d5a1be3819886ad76c79b4ad8215cef545ca9..b21068486ed41e073ef7f29b71c1a0b2dbf0fdb9 100644 (file)
@@ -60,8 +60,6 @@ typedef struct _virCapsHostNUMACellCPU virCapsHostNUMACellCPU;
 
 typedef struct _virCapsHostNUMACellPageInfo virCapsHostNUMACellPageInfo;
 
-typedef struct _virCapsHostNUMACellDistance virCapsHostNUMACellDistance;
-
 typedef struct _virCapsHostSecModel virCapsHostSecModel;
 
 typedef struct _virCapsHostSecModelLabel virCapsHostSecModelLabel;
index d1a124127907b5635b4d1cf5152c9adb880d4eec..a73f13f829ecc4d8f8da9c1df4dd201890271146 100644 (file)
@@ -249,7 +249,7 @@ libxlCapsInitNuma(libxl_ctx *ctx, virCaps *caps)
     libxl_cputopology *cpu_topo = NULL;
     int nr_nodes = 0, nr_cpus = 0, nr_distances = 0;
     virCapsHostNUMACellCPU **cpus = NULL;
-    virCapsHostNUMACellDistance *distances = NULL;
+    virNumaDistance *distances = NULL;
     int *nr_cpus_node = NULL;
     size_t i;
     int ret = -1;
@@ -320,11 +320,11 @@ libxlCapsInitNuma(libxl_ctx *ctx, virCaps *caps)
         if (nr_distances) {
             size_t j;
 
-            distances = g_new0(virCapsHostNUMACellDistance, nr_distances);
+            distances = g_new0(virNumaDistance, nr_distances);
 
             for (j = 0; j < nr_distances; j++) {
-                distances[j].node = j;
-                distances[j].distance = numa_info[i].dists[j];
+                distances[j].cellid = j;
+                distances[j].value = numa_info[i].dists[j];
             }
         }