]> www.infradead.org Git - users/jedix/linux-maple.git/commitdiff
arch/sparc: support NR_CPUS = 4096
authorjane Chu <janec@brm-t84-02.us.oracle.com>
Wed, 22 Mar 2017 22:49:05 +0000 (16:49 -0600)
committerShannon Nelson <shannon.nelson@oracle.com>
Wed, 31 May 2017 23:43:47 +0000 (16:43 -0700)
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 <jane.chu@oracle.com>
Reviewed-by: Bob Picco <bob.picco@oracle.com>
Reviewed-by: Atish Patra <atish.patra@oracle.com>
Signed-off-by: Allen Pais <allen.pais@oracle.com>
arch/sparc/Kconfig
arch/sparc/kernel/irq_64.c

index 3b83e435e3de49d9b916b2362b7f810d4eaf7524..df5b1196be803f97d9413bb294acdcd31374e54a 100644 (file)
@@ -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"
index d8e5cc9c7f10ff79089fcc3c955f8b662c26bbc8..dbdd66bcfcbb962961c092d7483fe4a9246670ce 100644 (file)
@@ -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();
        }