Skip to content

Commit f4892c6

Browse files
hbathinimpe
authored andcommitted
powerpc/fadump: allocate memory for additional parameters early
Memory for passing additional parameters to fadump capture kernel is allocated during subsys_initcall level, using memblock. But as slab is already available by this time, allocation happens via the buddy allocator. This may work for radix MMU but is likely to fail in most cases for hash MMU as hash MMU needs this memory in the first memory block for it to be accessible in real mode in the capture kernel (second boot). So, allocate memory for additional parameters area as soon as MMU mode is obvious. Fixes: 683eab9 ("powerpc/fadump: setup additional parameters for dump capture kernel") Reported-by: Venkat Rao Bagalkote <venkat88@linux.vnet.ibm.com> Closes: https://lore.kernel.org/lkml/a70e4064-a040-447b-8556-1fd02f19383d@linux.vnet.ibm.com/T/#u Signed-off-by: Hari Bathini <hbathini@linux.ibm.com> Signed-off-by: Sourabh Jain <sourabhjain@linux.ibm.com> Tested-by: Venkat Rao Bagalkote <venkat88@linux.vnet.ibm.com> Signed-off-by: Michael Ellerman <mpe@ellerman.id.au> Link: https://patch.msgid.link/20241107055817.489795-1-sourabhjain@linux.ibm.com
1 parent cfec846 commit f4892c6

File tree

3 files changed

+15
-5
lines changed

3 files changed

+15
-5
lines changed

arch/powerpc/include/asm/fadump.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,13 +19,15 @@ extern int is_fadump_active(void);
1919
extern int should_fadump_crash(void);
2020
extern void crash_fadump(struct pt_regs *, const char *);
2121
extern void fadump_cleanup(void);
22+
void fadump_setup_param_area(void);
2223
extern void fadump_append_bootargs(void);
2324

2425
#else /* CONFIG_FA_DUMP */
2526
static inline int is_fadump_active(void) { return 0; }
2627
static inline int should_fadump_crash(void) { return 0; }
2728
static inline void crash_fadump(struct pt_regs *regs, const char *str) { }
2829
static inline void fadump_cleanup(void) { }
30+
static inline void fadump_setup_param_area(void) { }
2931
static inline void fadump_append_bootargs(void) { }
3032
#endif /* !CONFIG_FA_DUMP */
3133

arch/powerpc/kernel/fadump.c

Lines changed: 10 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1587,6 +1587,12 @@ static void __init fadump_init_files(void)
15871587
return;
15881588
}
15891589

1590+
if (fw_dump.param_area) {
1591+
rc = sysfs_create_file(fadump_kobj, &bootargs_append_attr.attr);
1592+
if (rc)
1593+
pr_err("unable to create bootargs_append sysfs file (%d)\n", rc);
1594+
}
1595+
15901596
debugfs_create_file("fadump_region", 0444, arch_debugfs_dir, NULL,
15911597
&fadump_region_fops);
15921598

@@ -1741,15 +1747,15 @@ static void __init fadump_process(void)
17411747
* Reserve memory to store additional parameters to be passed
17421748
* for fadump/capture kernel.
17431749
*/
1744-
static void __init fadump_setup_param_area(void)
1750+
void __init fadump_setup_param_area(void)
17451751
{
17461752
phys_addr_t range_start, range_end;
17471753

17481754
if (!fw_dump.param_area_supported || fw_dump.dump_active)
17491755
return;
17501756

17511757
/* This memory can't be used by PFW or bootloader as it is shared across kernels */
1752-
if (radix_enabled()) {
1758+
if (early_radix_enabled()) {
17531759
/*
17541760
* Anywhere in the upper half should be good enough as all memory
17551761
* is accessible in real mode.
@@ -1777,12 +1783,12 @@ static void __init fadump_setup_param_area(void)
17771783
COMMAND_LINE_SIZE,
17781784
range_start,
17791785
range_end);
1780-
if (!fw_dump.param_area || sysfs_create_file(fadump_kobj, &bootargs_append_attr.attr)) {
1786+
if (!fw_dump.param_area) {
17811787
pr_warn("WARNING: Could not setup area to pass additional parameters!\n");
17821788
return;
17831789
}
17841790

1785-
memset(phys_to_virt(fw_dump.param_area), 0, COMMAND_LINE_SIZE);
1791+
memset((void *)fw_dump.param_area, 0, COMMAND_LINE_SIZE);
17861792
}
17871793

17881794
/*
@@ -1808,7 +1814,6 @@ int __init setup_fadump(void)
18081814
}
18091815
/* Initialize the kernel dump memory structure and register with f/w */
18101816
else if (fw_dump.reserve_dump_area_size) {
1811-
fadump_setup_param_area();
18121817
fw_dump.ops->fadump_init_mem_struct(&fw_dump);
18131818
register_fadump();
18141819
}

arch/powerpc/kernel/prom.c

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -908,6 +908,9 @@ void __init early_init_devtree(void *params)
908908

909909
mmu_early_init_devtree();
910910

911+
/* Setup param area for passing additional parameters to fadump capture kernel. */
912+
fadump_setup_param_area();
913+
911914
#ifdef CONFIG_PPC_POWERNV
912915
/* Scan and build the list of machine check recoverable ranges */
913916
of_scan_flat_dt(early_init_dt_scan_recoverable_ranges, NULL);

0 commit comments

Comments
 (0)