From: jane Chu Date: Wed, 22 Mar 2017 22:49:05 +0000 (-0600) Subject: arch/sparc: support NR_CPUS = 4096 X-Git-Tag: v4.1.12-102.0.20170530_1700~26 X-Git-Url: https://www.infradead.org/git/?a=commitdiff_plain;h=654ea586c5c13ec5b868e290651d4c4a1944bf2d;p=users%2Fjedix%2Flinux-maple.git arch/sparc: support NR_CPUS = 4096 Linux SPARC64 limits NR_CPUS to 4064 because init_cpu_send_mondo_info() only allocates a single page for NR_CPUS mondo entries. Thus we cannot use all 4096 CPUs on some SPARC platforms. To fix, allocate (2^order) pages where order is set according to the size of cpu_list for possible cpus. Since cpu_list_pa and cpu_mondo_block_pa are not used in asm code, there are no imm13 offsets from the base PA that will break because they can only reach one page. Orabug: 25505750 Signed-off-by: Jane Chu Reviewed-by: Bob Picco Reviewed-by: Atish Patra Signed-off-by: Allen Pais --- diff --git a/arch/sparc/Kconfig b/arch/sparc/Kconfig index 3b83e435e3de4..df5b1196be803 100644 --- a/arch/sparc/Kconfig +++ b/arch/sparc/Kconfig @@ -198,9 +198,9 @@ config NR_CPUS int "Maximum number of CPUs" depends on SMP range 2 32 if SPARC32 - range 2 4064 if SPARC64 + range 2 4096 if SPARC64 default 32 if SPARC32 - default 2048 if SPARC64 + default 4096 if SPARC64 config SPARC_DAX bool "Enable Oracle Sparc DAX driver" diff --git a/arch/sparc/kernel/irq_64.c b/arch/sparc/kernel/irq_64.c index d8e5cc9c7f10f..dbdd66bcfcbb9 100644 --- a/arch/sparc/kernel/irq_64.c +++ b/arch/sparc/kernel/irq_64.c @@ -1231,12 +1231,12 @@ static void __init init_cpu_send_mondo_info(struct trap_per_cpu *tb) { #ifdef CONFIG_SMP unsigned long page; + unsigned int order; - BUILD_BUG_ON((NR_CPUS * sizeof(u16)) > (PAGE_SIZE - 64)); - - page = get_zeroed_page(GFP_KERNEL); + order = get_order(num_possible_cpus() * sizeof(u16) + 64); + page = __get_free_pages(GFP_KERNEL | __GFP_ZERO, order); if (!page) { - prom_printf("SUN4V: Error, cannot allocate cpu mondo page.\n"); + prom_printf("SUN4V: Error, cannot allocate cpu mondo pages.\n"); prom_halt(); }