|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [PATCH v5 06/17] xen/arm: Add boot and secondary CPU to NUMA system
From: Wei Chen <wei.chen@xxxxxxx>
In this patch, we make NUMA node online and add cpu to
its NUMA node. This will make NUMA-aware components
have NUMA affinity data to support their work.
To keep the mostly the same behavior of x86, we use
numa_detect_cpu_node to online node. The difference is that,
we have prepared cpu_to_node in dt_smp_init_cpus, so we don't
need to setup cpu_to_node in numa_detect_cpu_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 unsigned int instead of int for cpu id.
2. Use static inline for stub to do type check.
---
xen/arch/arm/include/asm/numa.h | 9 +++++++++
xen/arch/arm/numa.c | 10 ++++++++++
xen/arch/arm/setup.c | 5 +++++
3 files changed, 24 insertions(+)
diff --git a/xen/arch/arm/include/asm/numa.h b/xen/arch/arm/include/asm/numa.h
index 97d4a67dea..b04ace26db 100644
--- a/xen/arch/arm/include/asm/numa.h
+++ b/xen/arch/arm/include/asm/numa.h
@@ -35,6 +35,7 @@ typedef u8 nodeid_t;
extern bool numa_disabled(void);
extern void numa_set_distance(nodeid_t from, nodeid_t to,
unsigned int distance);
+extern void numa_detect_cpu_node(unsigned int cpu);
#else
@@ -72,6 +73,14 @@ static inline void numa_set_node(unsigned int cpu, nodeid_t
node)
{
}
+static inline void numa_add_cpu(unsigned int cpu)
+{
+}
+
+static inline void numa_detect_cpu_node(unsigned int cpu)
+{
+}
+
#endif
#define arch_want_default_dmazone() (false)
diff --git a/xen/arch/arm/numa.c b/xen/arch/arm/numa.c
index e9b2ec93bc..b5a87531f7 100644
--- a/xen/arch/arm/numa.c
+++ b/xen/arch/arm/numa.c
@@ -76,6 +76,16 @@ void __init numa_set_distance(nodeid_t from, nodeid_t to,
node_distance_map[from][to] = distance;
}
+void numa_detect_cpu_node(unsigned int cpu)
+{
+ nodeid_t node = cpu_to_node[cpu];
+
+ if ( node == NUMA_NO_NODE )
+ node = 0;
+
+ node_set_online(node);
+}
+
unsigned char __node_distance(nodeid_t from, nodeid_t to)
{
if ( from == to )
diff --git a/xen/arch/arm/setup.c b/xen/arch/arm/setup.c
index 74b40e527f..ab9eb6fb80 100644
--- a/xen/arch/arm/setup.c
+++ b/xen/arch/arm/setup.c
@@ -1205,6 +1205,11 @@ void __init start_xen(unsigned long boot_phys_offset,
for_each_present_cpu ( i )
{
+ /* Detect and online node based on cpu_to_node[]. */
+ numa_detect_cpu_node(i);
+ /* Set up node_to_cpumask based on cpu_to_node[]. */
+ numa_add_cpu(i);
+
if ( (num_online_cpus() < nr_cpu_ids) && !cpu_online(i) )
{
int ret = cpu_up(i);
--
2.25.1
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |