|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [PATCH 18/21] xen/arm: Generate distance-map node for Dom0 Device Tree
Generate the 'distance-map' node within the Domain-0 Device Tree.
This ensures that distances are populated only for the specific NUMA
nodes assigned to Domain-0.
---
xen/arch/arm/domain_build.c | 50 +++++++++++++++++++++++++++++++++++++
1 file changed, 50 insertions(+)
diff --git a/xen/arch/arm/domain_build.c b/xen/arch/arm/domain_build.c
index 11d0fa1233..2bf4b37f89 100644
--- a/xen/arch/arm/domain_build.c
+++ b/xen/arch/arm/domain_build.c
@@ -718,6 +718,51 @@ static int __init fdt_property_interrupts(const struct
kernel_info *kinfo,
return res;
}
+#ifdef CONFIG_NUMA
+static int __init make_distance_map_node(const struct domain *d, void *fdt)
+{
+ nodeid_t from, to;
+ unsigned int count = 0;
+ int res;
+
+ static uint32_t __initdata matrix[MAX_NUMNODES * MAX_NUMNODES * 3];
+
+ if ( nodes_weight(d->node_affinity) <= 1 )
+ return 0;
+
+ for_each_node_mask(from, d->node_affinity)
+ {
+ for_each_node_mask(to, d->node_affinity)
+ {
+ matrix[count * 3 + 0] = cpu_to_fdt32(from);
+ matrix[count * 3 + 1] = cpu_to_fdt32(to);
+ matrix[count * 3 + 2] = cpu_to_fdt32(__node_distance(from, to));
+ count++;
+ }
+ }
+
+ 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;
+
+ res = fdt_property(fdt, "distance-matrix", matrix, count * 3 *
sizeof(uint32_t));
+ if ( res )
+ return res;
+
+ res = fdt_end_node(fdt);
+ if ( res )
+ return res;
+
+ return 0;
+}
+#else /* CONFIG_NUMA */
+#define make_distance_map_node(d, fdt) (0)
+#endif /* CONFIG_NUMA */
+
int __init add_ext_regions(unsigned long s_gfn, unsigned long e_gfn,
void *data)
{
@@ -1569,6 +1614,7 @@ static int __init handle_node(struct domain *d, struct
kernel_info *kinfo,
DT_MATCH_TYPE("memory"),
/* The memory mapped timer is not supported by Xen. */
DT_MATCH_COMPATIBLE("arm,armv7-timer-mem"),
+ DT_MATCH_COMPATIBLE("numa-distance-map-v1"),
{ /* sentinel */ },
};
static const struct dt_device_match timer_matches[] __initconst =
@@ -1734,6 +1780,10 @@ static int __init handle_node(struct domain *d, struct
kernel_info *kinfo,
if ( res )
return res;
+ res = make_distance_map_node(d, kinfo->fdt);
+ if ( res )
+ return res;
+
res = sci_dt_finalize(d, kinfo->fdt);
if ( res )
return res;
--
2.43.0
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |