[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [Xen-devel] [PATCH] x86: correct socket_cpumask allocation for AP
For AP, phys_proc_id is still not valid in CPU_PREPARE notifier (cpu_smpboot_alloc), so cpu_to_socket(cpu) is not valid as well. Introduce a pre-allocated secondary_cpu_mask so that later in smp_store_cpu_info() socket_cpumask[socket] can consume it. Signed-off-by: Chao Peng <chao.p.peng@xxxxxxxxxxxxxxx> --- This is targeted for staging branch. I tested on a 2-sockets machine and looks fine. --- xen/arch/x86/smpboot.c | 16 +++++++++++++--- 1 file changed, 13 insertions(+), 3 deletions(-) diff --git a/xen/arch/x86/smpboot.c b/xen/arch/x86/smpboot.c index c73aa1b..49b8497 100644 --- a/xen/arch/x86/smpboot.c +++ b/xen/arch/x86/smpboot.c @@ -62,6 +62,7 @@ EXPORT_SYMBOL(cpu_online_map); unsigned int __read_mostly nr_sockets; cpumask_var_t *__read_mostly socket_cpumask; +static cpumask_var_t secondary_socket_cpumask; struct cpuinfo_x86 cpu_data[NR_CPUS]; @@ -84,11 +85,21 @@ void *stack_base[NR_CPUS]; static void smp_store_cpu_info(int id) { struct cpuinfo_x86 *c = cpu_data + id; + unsigned int socket; *c = boot_cpu_data; if ( id != 0 ) + { identify_cpu(c); + socket = cpu_to_socket(id); + if ( !socket_cpumask[socket] ) + { + socket_cpumask[socket] = secondary_socket_cpumask; + secondary_socket_cpumask = NULL; + } + } + /* * Certain Athlons might work (for various values of 'work') in SMP * but they are not certified as MP capable. @@ -705,7 +716,6 @@ static int cpu_smpboot_alloc(unsigned int cpu) nodeid_t node = cpu_to_node(cpu); struct desc_struct *gdt; unsigned long stub_page; - unsigned int socket = cpu_to_socket(cpu); if ( node != NUMA_NO_NODE ) memflags = MEMF_node(node); @@ -748,8 +758,8 @@ static int cpu_smpboot_alloc(unsigned int cpu) goto oom; per_cpu(stubs.addr, cpu) = stub_page + STUB_BUF_CPU_OFFS(cpu); - if ( !socket_cpumask[socket] && - !zalloc_cpumask_var(socket_cpumask + socket) ) + if ( !secondary_socket_cpumask && + !zalloc_cpumask_var(&secondary_socket_cpumask) ) goto oom; if ( zalloc_cpumask_var(&per_cpu(cpu_sibling_mask, cpu)) && -- 1.9.1 _______________________________________________ Xen-devel mailing list Xen-devel@xxxxxxxxxxxxx http://lists.xen.org/xen-devel
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |