commit 4267739cabb8 ("arch, mm: consolidate initialization of SPARSE memory 
model"),
changed the initialization order of "pageblock_order" from...
start_kernel()
    - setup_arch()
       - initmem_init()
         - sparse_init()
           - set_pageblock_order();  // this sets the pageblock_order
       - xxx_cma_reserve();

to...
start_kernel()
    - setup_arch()
       - xxx_cma_reserve();
    - mm_core_init_early()
       - free_area_init()
          - sparse_init()
             - set_pageblock_order() // this sets the pageblock_order.

So this means, pageblock_order is not initialized before these cma
reservation function calls, hence we are seeing CMA failures like...

[    0.000000] kvm_cma_reserve: reserving 3276 MiB for global area
[    0.000000] cma: pageblock_order not yet initialized. Called during early 
boot?
[    0.000000] cma: Failed to reserve 3276 MiB
....
[    0.000000][    T0] cma: pageblock_order not yet initialized. Called during 
early boot?
[    0.000000][    T0] cma: Failed to reserve 1024 MiB

This patch moves these CMA reservations to arch_mm_preinit() which
happens in mm_core_init() (which happens after pageblock_order is
initialized), but before the memblock moves the free memory to buddy.

Fixes: 4267739cabb8 ("arch, mm: consolidate initialization of SPARSE memory 
model")
Suggested-by: Mike Rapoport <[email protected]>
Reported-and-tested-by: Sourabh Jain <[email protected]>
Closes: 
https://lore.kernel.org/linuxppc-dev/[email protected]/
Signed-off-by: Ritesh Harjani (IBM) <[email protected]>
---
 arch/powerpc/kernel/setup-common.c | 10 ----------
 arch/powerpc/mm/mem.c              | 14 ++++++++++++++
 2 files changed, 14 insertions(+), 10 deletions(-)

diff --git a/arch/powerpc/kernel/setup-common.c 
b/arch/powerpc/kernel/setup-common.c
index cb5b73adc250..b1761909c23f 100644
--- a/arch/powerpc/kernel/setup-common.c
+++ b/arch/powerpc/kernel/setup-common.c
@@ -35,7 +35,6 @@
 #include <linux/of_irq.h>
 #include <linux/hugetlb.h>
 #include <linux/pgtable.h>
-#include <asm/kexec.h>
 #include <asm/io.h>
 #include <asm/paca.h>
 #include <asm/processor.h>
@@ -995,15 +994,6 @@ void __init setup_arch(char **cmdline_p)

        initmem_init();

-       /*
-        * Reserve large chunks of memory for use by CMA for kdump, fadump, KVM 
and
-        * hugetlb. These must be called after initmem_init(), so that
-        * pageblock_order is initialised.
-        */
-       fadump_cma_init();
-       kdump_cma_reserve();
-       kvm_cma_reserve();
-
        early_memtest(min_low_pfn << PAGE_SHIFT, max_low_pfn << PAGE_SHIFT);

        if (ppc_md.setup_arch)
diff --git a/arch/powerpc/mm/mem.c b/arch/powerpc/mm/mem.c
index a985fc96b953..b7982d0243d4 100644
--- a/arch/powerpc/mm/mem.c
+++ b/arch/powerpc/mm/mem.c
@@ -30,6 +30,10 @@
 #include <asm/setup.h>
 #include <asm/fixmap.h>

+#include <asm/fadump.h>
+#include <asm/kexec.h>
+#include <asm/kvm_ppc.h>
+
 #include <mm/mmu_decl.h>

 unsigned long long memory_limit __initdata;
@@ -268,6 +272,16 @@ void __init paging_init(void)

 void __init arch_mm_preinit(void)
 {
+
+       /*
+        * Reserve large chunks of memory for use by CMA for kdump, fadump, KVM
+        * and hugetlb. These must be called after pageblock_order is
+        * initialised.
+        */
+       fadump_cma_init();
+       kdump_cma_reserve();
+       kvm_cma_reserve();
+
        /*
         * book3s is limited to 16 page sizes due to encoding this in
         * a 4-bit field for slices.
--
2.53.0


Reply via email to