Patch "powerpc/fadump: Move fadump_cma_init to setup_arch() after initmem_init()" has been added to the 6.1-stable tree

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



This is a note to let you know that I've just added the patch titled

    powerpc/fadump: Move fadump_cma_init to setup_arch() after initmem_init()

to the 6.1-stable tree which can be found at:
    http://www.kernel.org/git/?p=linux/kernel/git/stable/stable-queue.git;a=summary

The filename of the patch is:
     powerpc-fadump-move-fadump_cma_init-to-setup_arch-af.patch
and it can be found in the queue-6.1 subdirectory.

If you, or anyone else, feels it should not be added to the stable tree,
please let <stable@xxxxxxxxxxxxxxx> know about it.



commit 9b83778a364ae9c46483b89bbb852d0b6eebc0f1
Author: Ritesh Harjani (IBM) <ritesh.list@xxxxxxxxx>
Date:   Fri Oct 18 21:47:57 2024 +0530

    powerpc/fadump: Move fadump_cma_init to setup_arch() after initmem_init()
    
    [ Upstream commit 05b94cae1c47f94588c3e7096963c1007c4d9c1d ]
    
    During early init CMA_MIN_ALIGNMENT_BYTES can be PAGE_SIZE,
    since pageblock_order is still zero and it gets initialized
    later during initmem_init() e.g.
    setup_arch() -> initmem_init() -> sparse_init() -> set_pageblock_order()
    
    One such use case where this causes issue is -
    early_setup() -> early_init_devtree() -> fadump_reserve_mem() -> fadump_cma_init()
    
    This causes CMA memory alignment check to be bypassed in
    cma_init_reserved_mem(). Then later cma_activate_area() can hit
    a VM_BUG_ON_PAGE(pfn & ((1 << order) - 1)) if the reserved memory
    area was not pageblock_order aligned.
    
    Fix it by moving the fadump_cma_init() after initmem_init(),
    where other such cma reservations also gets called.
    
    <stack trace>
    ==============
    page: refcount:0 mapcount:0 mapping:0000000000000000 index:0x0 pfn:0x10010
    flags: 0x13ffff800000000(node=1|zone=0|lastcpupid=0x7ffff) CMA
    raw: 013ffff800000000 5deadbeef0000100 5deadbeef0000122 0000000000000000
    raw: 0000000000000000 0000000000000000 00000000ffffffff 0000000000000000
    page dumped because: VM_BUG_ON_PAGE(pfn & ((1 << order) - 1))
    ------------[ cut here ]------------
    kernel BUG at mm/page_alloc.c:778!
    
    Call Trace:
    __free_one_page+0x57c/0x7b0 (unreliable)
    free_pcppages_bulk+0x1a8/0x2c8
    free_unref_page_commit+0x3d4/0x4e4
    free_unref_page+0x458/0x6d0
    init_cma_reserved_pageblock+0x114/0x198
    cma_init_reserved_areas+0x270/0x3e0
    do_one_initcall+0x80/0x2f8
    kernel_init_freeable+0x33c/0x530
    kernel_init+0x34/0x26c
    ret_from_kernel_user_thread+0x14/0x1c
    
    Fixes: 11ac3e87ce09 ("mm: cma: use pageblock_order as the single alignment")
    Suggested-by: David Hildenbrand <david@xxxxxxxxxx>
    Reported-by: Sachin P Bappalige <sachinpb@xxxxxxxxxxxxx>
    Acked-by: Hari Bathini <hbathini@xxxxxxxxxxxxx>
    Reviewed-by: Madhavan Srinivasan <maddy@xxxxxxxxxxxxx>
    Signed-off-by: Ritesh Harjani (IBM) <ritesh.list@xxxxxxxxx>
    Signed-off-by: Michael Ellerman <mpe@xxxxxxxxxxxxxx>
    Link: https://patch.msgid.link/3ae208e48c0d9cefe53d2dc4f593388067405b7d.1729146153.git.ritesh.list@xxxxxxxxx
    Signed-off-by: Sasha Levin <sashal@xxxxxxxxxx>

diff --git a/arch/powerpc/include/asm/fadump.h b/arch/powerpc/include/asm/fadump.h
index 526a6a6473128..daa44b2ef35ad 100644
--- a/arch/powerpc/include/asm/fadump.h
+++ b/arch/powerpc/include/asm/fadump.h
@@ -32,4 +32,11 @@ extern int early_init_dt_scan_fw_dump(unsigned long node, const char *uname,
 				      int depth, void *data);
 extern int fadump_reserve_mem(void);
 #endif
+
+#if defined(CONFIG_FA_DUMP) && defined(CONFIG_CMA)
+void fadump_cma_init(void);
+#else
+static inline void fadump_cma_init(void) { }
+#endif
+
 #endif /* _ASM_POWERPC_FADUMP_H */
diff --git a/arch/powerpc/kernel/fadump.c b/arch/powerpc/kernel/fadump.c
index 4722a9e606e61..1866bac234000 100644
--- a/arch/powerpc/kernel/fadump.c
+++ b/arch/powerpc/kernel/fadump.c
@@ -80,7 +80,7 @@ static struct cma *fadump_cma;
  * But for some reason even if it fails we still have the memory reservation
  * with us and we can still continue doing fadump.
  */
-static void __init fadump_cma_init(void)
+void __init fadump_cma_init(void)
 {
 	unsigned long long base, size;
 	int rc;
@@ -124,8 +124,6 @@ static void __init fadump_cma_init(void)
 		(unsigned long)cma_get_base(fadump_cma) >> 20,
 		fw_dump.reserve_dump_area_size);
 }
-#else
-static void __init fadump_cma_init(void) { }
 #endif /* CONFIG_CMA */
 
 /* Scan the Firmware Assisted dump configuration details. */
@@ -642,8 +640,6 @@ int __init fadump_reserve_mem(void)
 
 		pr_info("Reserved %lldMB of memory at %#016llx (System RAM: %lldMB)\n",
 			(size >> 20), base, (memblock_phys_mem_size() >> 20));
-
-		fadump_cma_init();
 	}
 
 	return ret;
diff --git a/arch/powerpc/kernel/setup-common.c b/arch/powerpc/kernel/setup-common.c
index 56f6b958926d7..41c03c8e41b41 100644
--- a/arch/powerpc/kernel/setup-common.c
+++ b/arch/powerpc/kernel/setup-common.c
@@ -982,9 +982,11 @@ void __init setup_arch(char **cmdline_p)
 	initmem_init();
 
 	/*
-	 * Reserve large chunks of memory for use by CMA for KVM and hugetlb. These must
-	 * be called after initmem_init(), so that pageblock_order is initialised.
+	 * Reserve large chunks of memory for use by CMA for fadump, KVM and
+	 * hugetlb. These must be called after initmem_init(), so that
+	 * pageblock_order is initialised.
 	 */
+	fadump_cma_init();
 	kvm_cma_reserve();
 	gigantic_hugetlb_cma_reserve();
 




[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Index of Archives]     [Linux USB Devel]     [Linux Audio Users]     [Yosemite News]     [Linux Kernel]     [Linux SCSI]

  Powered by Linux