| From e1cef983e3729012efd7f5a9746de3cc309b0902 Mon Sep 17 00:00:00 2001 |
| From: Sasha Levin <sashal@kernel.org> |
| Date: Fri, 4 Feb 2022 14:26:01 +0530 |
| Subject: powerpc: Set crashkernel offset to mid of RMA region |
| |
| From: Sourabh Jain <sourabhjain@linux.ibm.com> |
| |
| [ Upstream commit 7c5ed82b800d8615cdda00729e7b62e5899f0b13 ] |
| |
| On large config LPARs (having 192 and more cores), Linux fails to boot |
| due to insufficient memory in the first memblock. It is due to the |
| memory reservation for the crash kernel which starts at 128MB offset of |
| the first memblock. This memory reservation for the crash kernel doesn't |
| leave enough space in the first memblock to accommodate other essential |
| system resources. |
| |
| The crash kernel start address was set to 128MB offset by default to |
| ensure that the crash kernel get some memory below the RMA region which |
| is used to be of size 256MB. But given that the RMA region size can be |
| 512MB or more, setting the crash kernel offset to mid of RMA size will |
| leave enough space for the kernel to allocate memory for other system |
| resources. |
| |
| Since the above crash kernel offset change is only applicable to the LPAR |
| platform, the LPAR feature detection is pushed before the crash kernel |
| reservation. The rest of LPAR specific initialization will still |
| be done during pseries_probe_fw_features as usual. |
| |
| This patch is dependent on changes to paca allocation for boot CPU. It |
| expect boot CPU to discover 1T segment support which is introduced by |
| the patch posted here: |
| https://lists.ozlabs.org/pipermail/linuxppc-dev/2022-January/239175.html |
| |
| Reported-by: Abdul haleem <abdhalee@linux.vnet.ibm.com> |
| Signed-off-by: Sourabh Jain <sourabhjain@linux.ibm.com> |
| Signed-off-by: Michael Ellerman <mpe@ellerman.id.au> |
| Link: https://lore.kernel.org/r/20220204085601.107257-1-sourabhjain@linux.ibm.com |
| Signed-off-by: Sasha Levin <sashal@kernel.org> |
| --- |
| arch/powerpc/kernel/rtas.c | 6 ++++++ |
| arch/powerpc/kexec/core.c | 15 +++++++++++---- |
| 2 files changed, 17 insertions(+), 4 deletions(-) |
| |
| diff --git a/arch/powerpc/kernel/rtas.c b/arch/powerpc/kernel/rtas.c |
| index ff80bbad22a5..e18a725a8e5d 100644 |
| --- a/arch/powerpc/kernel/rtas.c |
| +++ b/arch/powerpc/kernel/rtas.c |
| @@ -1235,6 +1235,12 @@ int __init early_init_dt_scan_rtas(unsigned long node, |
| entryp = of_get_flat_dt_prop(node, "linux,rtas-entry", NULL); |
| sizep = of_get_flat_dt_prop(node, "rtas-size", NULL); |
| |
| +#ifdef CONFIG_PPC64 |
| + /* need this feature to decide the crashkernel offset */ |
| + if (of_get_flat_dt_prop(node, "ibm,hypertas-functions", NULL)) |
| + powerpc_firmware_features |= FW_FEATURE_LPAR; |
| +#endif |
| + |
| if (basep && entryp && sizep) { |
| rtas.base = *basep; |
| rtas.entry = *entryp; |
| diff --git a/arch/powerpc/kexec/core.c b/arch/powerpc/kexec/core.c |
| index a2242017e55f..11b327fa135c 100644 |
| --- a/arch/powerpc/kexec/core.c |
| +++ b/arch/powerpc/kexec/core.c |
| @@ -134,11 +134,18 @@ void __init reserve_crashkernel(void) |
| if (!crashk_res.start) { |
| #ifdef CONFIG_PPC64 |
| /* |
| - * On 64bit we split the RMO in half but cap it at half of |
| - * a small SLB (128MB) since the crash kernel needs to place |
| - * itself and some stacks to be in the first segment. |
| + * On the LPAR platform place the crash kernel to mid of |
| + * RMA size (512MB or more) to ensure the crash kernel |
| + * gets enough space to place itself and some stack to be |
| + * in the first segment. At the same time normal kernel |
| + * also get enough space to allocate memory for essential |
| + * system resource in the first segment. Keep the crash |
| + * kernel starts at 128MB offset on other platforms. |
| */ |
| - crashk_res.start = min(0x8000000ULL, (ppc64_rma_size / 2)); |
| + if (firmware_has_feature(FW_FEATURE_LPAR)) |
| + crashk_res.start = ppc64_rma_size / 2; |
| + else |
| + crashk_res.start = min(0x8000000ULL, (ppc64_rma_size / 2)); |
| #else |
| crashk_res.start = KDUMP_KERNELBASE; |
| #endif |
| -- |
| 2.35.1 |
| |