|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [PATCH 12/21] tools/libxl: Create 'distance-map' node in DomU Device Tree
Create the 'distance-map' node in the Device Tree passed to DomU.
This information is retrieved from the virtual NUMA configuration
in the xl domain configuration file.
---
tools/libs/light/libxl_arm.c | 35 +++++++++++++++++++++++++++++++++++
1 file changed, 35 insertions(+)
diff --git a/tools/libs/light/libxl_arm.c b/tools/libs/light/libxl_arm.c
index 05d0f18e1a..d2b505fd43 100644
--- a/tools/libs/light/libxl_arm.c
+++ b/tools/libs/light/libxl_arm.c
@@ -769,6 +769,39 @@ static int make_memory_nodes(libxl__gc *gc, void *fdt,
return 0;
}
+static int make_numa_distance_map(libxl__gc *gc, void *fdt,
+ const libxl_domain_build_info *b_info)
+{
+ int i, j;
+ uint32_t *matrix;
+ int nr_nodes = b_info->num_vnuma_nodes;
+ int idx = 0;
+ int res;
+
+ if (nr_nodes == 0) return 0;
+
+ res = fdt_begin_node(fdt, "distance-map");
+ if (res) return res;
+
+ res = fdt_property_string(fdt, "compatible", "numa-distance-map-v1");
+ if (res) return res;
+
+ matrix = libxl__malloc(gc, sizeof(uint32_t) * nr_nodes * nr_nodes * 3);
+
+ for (i = 0; i < nr_nodes; i++) {
+ for (j = 0; j < nr_nodes; j++) {
+ matrix[idx++] = cpu_to_fdt32(i);
+ matrix[idx++] = cpu_to_fdt32(j);
+ matrix[idx++] = cpu_to_fdt32(b_info->vnuma_nodes[i].distances[j]);
+ }
+ }
+
+ res = fdt_property(fdt, "distance-matrix", matrix, sizeof(uint32_t) * idx);
+ if (res) return res;
+
+ return fdt_end_node(fdt);
+}
+
static int make_gicv2_node(libxl__gc *gc, void *fdt,
uint64_t gicd_base, uint64_t gicd_size,
uint64_t gicc_base, uint64_t gicc_size)
@@ -1438,6 +1471,8 @@ next_resize:
FDT( make_memory_nodes(gc, fdt, info, dom) );
+ FDT( make_numa_distance_map(gc, fdt, info) );
+
switch (info->arch_arm.gic_version) {
case LIBXL_GIC_VERSION_V2:
FDT( make_gicv2_node(gc, fdt,
--
2.43.0
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |