[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [Xen-devel] [RFC PATCH v1 09/21] ARM: NUMA: Add CPU NUMA support
From: Vijaya Kumar K <Vijaya.Kumar@xxxxxxxxxx> For each cpu, update cpu_to_node[] with node id from the MPIDR registers. Also, initialize cpu_to_node[] with node 0. Add macros to access cpu_to_node[] information. Signed-off-by: Vijaya Kumar K <Vijaya.Kumar@xxxxxxxxxx> --- xen/arch/arm/numa.c | 25 +++++++++++++++++++++++++ xen/arch/arm/setup.c | 2 ++ xen/arch/arm/smpboot.c | 3 +++ xen/include/asm-arm/numa.h | 15 +++++++++++++++ 4 files changed, 45 insertions(+) diff --git a/xen/arch/arm/numa.c b/xen/arch/arm/numa.c index 11d100b..d4dbad4 100644 --- a/xen/arch/arm/numa.c +++ b/xen/arch/arm/numa.c @@ -23,9 +23,23 @@ #include <xen/numa.h> #include <asm/acpi.h> #include <xen/errno.h> +#include <xen/cpumask.h> int _node_distance[MAX_NUMNODES * 2]; int *node_distance; +extern nodemask_t numa_nodes_parsed; + +void __init numa_set_cpu_node(int cpu, unsigned long hwid) +{ + unsigned node; + + node = hwid >> 16 & 0xf; + if ( !node_isset(node, numa_nodes_parsed) || node == MAX_NUMNODES ) + node = 0; + + numa_set_node(cpu, node); + numa_add_cpu(cpu); +} u8 __node_distance(nodeid_t a, nodeid_t b) { @@ -37,6 +51,17 @@ u8 __node_distance(nodeid_t a, nodeid_t b) EXPORT_SYMBOL(__node_distance); +/* + * Setup early cpu_to_node. + */ +void __init init_cpu_to_node(void) +{ + int i; + + for ( i = 0; i < nr_cpu_ids; i++ ) + numa_set_node(i, 0); +} + int __init numa_init(void) { int i, ret = 0; diff --git a/xen/arch/arm/setup.c b/xen/arch/arm/setup.c index b6618ca..5612ba6 100644 --- a/xen/arch/arm/setup.c +++ b/xen/arch/arm/setup.c @@ -749,6 +749,8 @@ void __init start_xen(unsigned long boot_phys_offset, xen_paddr, xen_paddr + xen_bootmodule->size); xen_bootmodule->start = xen_paddr; + init_cpu_to_node(); + setup_mm(fdt_paddr, fdt_size); /* Parse the ACPI tables for possible boot-time configuration */ diff --git a/xen/arch/arm/smpboot.c b/xen/arch/arm/smpboot.c index 32e8722..3667d4b 100644 --- a/xen/arch/arm/smpboot.c +++ b/xen/arch/arm/smpboot.c @@ -30,6 +30,7 @@ #include <xen/irq.h> #include <xen/console.h> #include <asm/cpuerrata.h> +#include <xen/numa.h> #include <asm/gic.h> #include <asm/psci.h> #include <asm/acpi.h> @@ -313,6 +314,8 @@ void start_secondary(unsigned long boot_phys_offset, */ smp_wmb(); + numa_set_cpu_node(cpuid, hwid); + /* Now report this CPU is up */ cpumask_set_cpu(cpuid, &cpu_online_map); diff --git a/xen/include/asm-arm/numa.h b/xen/include/asm-arm/numa.h index b8857e2..33a9e53 100644 --- a/xen/include/asm-arm/numa.h +++ b/xen/include/asm-arm/numa.h @@ -2,16 +2,26 @@ #define __ARCH_ARM_NUMA_H #include <xen/errno.h> +#include <xen/cpumask.h> typedef u8 nodeid_t; #define NODES_SHIFT 2 #ifdef CONFIG_NUMA + +extern cpumask_t node_to_cpumask[]; +extern nodeid_t cpu_to_node[NR_CPUS]; +#define cpu_to_node(cpu) (cpu_to_node[cpu]) +#define parent_node(node) (node) +#define node_to_first_cpu(node) (__ffs(node_to_cpumask[node])) +#define node_to_cpumask(node) (node_to_cpumask[node]) + int arch_numa_setup(char *opt); int __init numa_init(void); int __init dt_numa_init(void); u8 __node_distance(nodeid_t a, nodeid_t b); +void __init numa_set_cpu_node(int cpu, unsigned long hwid); #else static inline int arch_numa_setup(char *opt) { @@ -28,6 +38,11 @@ static inline int __init dt_numa_init(void) return -EINVAL; } +static inline void __init numa_set_cpu_node(int cpu, unsigned long hwid) +{ + return; +} + /* Fake one node for now. See also node_online_map. */ #define cpu_to_node(cpu) 0 #define node_to_cpumask(node) (cpu_online_map) -- 2.7.4 _______________________________________________ Xen-devel mailing list Xen-devel@xxxxxxxxxxxxx https://lists.xen.org/xen-devel
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |