|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [PATCH v5 05/17] xen/arm: build NUMA cpu_to_node map in dt_smp_init_cpus
From: Wei Chen <wei.chen@xxxxxxx>
NUMA implementation has a cpu_to_node array to store CPU to NODE
map. Xen is using CPU logical ID in runtime components, so we
use CPU logical ID as CPU index in cpu_to_node.
In device tree case, cpu_logical_map is created in dt_smp_init_cpus.
So, when NUMA is enabled, dt_smp_init_cpus will fetch CPU NUMA id
at the same time for cpu_to_node.
Signed-off-by: Wei Chen <wei.chen@xxxxxxx>
Signed-off-by: Henry Wang <Henry.Wang@xxxxxxx>
---
v4 -> v5:
1. No change.
v3 -> v4:
1. No change.
v2 -> v3:
1. No change.
v1 -> v2:
1. Use static inline to replace macros to perform
function paramerters type check.
2. Add numa_disabled to gate the numa-node-id check for
CONFIG_NUMA on but numa disabled user case.
3. Use macro instead of static inline function to stub
numa_set_node.
---
xen/arch/arm/include/asm/numa.h | 4 ++++
xen/arch/arm/smpboot.c | 36 +++++++++++++++++++++++++++++++++
2 files changed, 40 insertions(+)
diff --git a/xen/arch/arm/include/asm/numa.h b/xen/arch/arm/include/asm/numa.h
index 96c856a9f7..97d4a67dea 100644
--- a/xen/arch/arm/include/asm/numa.h
+++ b/xen/arch/arm/include/asm/numa.h
@@ -68,6 +68,10 @@ static inline bool arch_numa_broken(void)
return true;
}
+static inline void numa_set_node(unsigned int cpu, nodeid_t node)
+{
+}
+
#endif
#define arch_want_default_dmazone() (false)
diff --git a/xen/arch/arm/smpboot.c b/xen/arch/arm/smpboot.c
index e107b86b7b..7506085540 100644
--- a/xen/arch/arm/smpboot.c
+++ b/xen/arch/arm/smpboot.c
@@ -118,7 +118,12 @@ static void __init dt_smp_init_cpus(void)
{
[0 ... NR_CPUS - 1] = MPIDR_INVALID
};
+ static nodeid_t node_map[NR_CPUS] __initdata =
+ {
+ [0 ... NR_CPUS - 1] = NUMA_NO_NODE
+ };
bool bootcpu_valid = false;
+ unsigned int nid = 0;
int rc;
mpidr = system_cpuinfo.mpidr.bits & MPIDR_HWID_MASK;
@@ -169,6 +174,28 @@ static void __init dt_smp_init_cpus(void)
continue;
}
+ if ( IS_ENABLED(CONFIG_NUMA) )
+ {
+ /*
+ * When CONFIG_NUMA is set, try to fetch numa infomation
+ * from CPU dts node, otherwise the nid is always 0.
+ */
+ if ( !dt_property_read_u32(cpu, "numa-node-id", &nid) )
+ {
+ printk(XENLOG_WARNING
+ "cpu[%d] dts path: %s: doesn't have numa
information!\n",
+ cpuidx, dt_node_full_name(cpu));
+ /*
+ * During the early stage of NUMA initialization, when Xen
+ * found any CPU dts node doesn't have numa-node-id info, the
+ * NUMA will be treated as off, all CPU will be set to a FAKE
+ * node 0. So if we get numa-node-id failed here, we should
+ * set nid to 0.
+ */
+ nid = 0;
+ }
+ }
+
/*
* 8 MSBs must be set to 0 in the DT since the reg property
* defines the MPIDR[23:0]
@@ -228,9 +255,13 @@ static void __init dt_smp_init_cpus(void)
{
printk("cpu%d init failed (hwid %"PRIregister"): %d\n", i, hwid,
rc);
tmp_map[i] = MPIDR_INVALID;
+ node_map[i] = NUMA_NO_NODE;
}
else
+ {
tmp_map[i] = hwid;
+ node_map[i] = nid;
+ }
}
if ( !bootcpu_valid )
@@ -246,6 +277,11 @@ static void __init dt_smp_init_cpus(void)
continue;
cpumask_set_cpu(i, &cpu_possible_map);
cpu_logical_map(i) = tmp_map[i];
+
+ nid = node_map[i];
+ if ( nid >= MAX_NUMNODES )
+ nid = 0;
+ numa_set_node(i, nid);
}
}
--
2.25.1
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |