Skip to content

Commit 9f586bd

Browse files
author
Herton R. Krzesinski
committed
Merge: arm64: kdump: Support crashkernel=X fall back to reserve region above DMA zones
MR: https://gitlab.com/redhat/centos-stream/src/kernel/centos-stream-9/-/merge_requests/1822 arm64: kdump: Support crashkernel=X fall back to reserve region above DMA zones Bugzilla: https://bugzilla.redhat.com/show_bug.cgi?id=2112877 Upstream Status: linux tree Conflict: None Tested: on ampere-mtjade-altra-03.khw4.lab.eng.bos.redhat.com Try to allocate at least 128 MiB low memory automatically for the case that crashkernel=,high is explicitly specified, while crashkenrel=,low is omitted. This allows users to focus more on the high memory requirements of their business rather than the low memory requirements of the crash kernel booting. Signed-off-by: Pingfan Liu <piliu@redhat.com> Approved-by: Baoquan He <5820488-baoquan_he@users.noreply.gitlab.com> Approved-by: John B. Wyatt IV <jwyatt@redhat.com> Signed-off-by: Herton R. Krzesinski <herton@redhat.com>
2 parents 98c3360 + 7cd7408 commit 9f586bd

File tree

2 files changed

+28
-12
lines changed

2 files changed

+28
-12
lines changed

Documentation/admin-guide/kernel-parameters.txt

Lines changed: 6 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -789,7 +789,7 @@
789789
memory region [offset, offset + size] for that kernel
790790
image. If '@offset' is omitted, then a suitable offset
791791
is selected automatically.
792-
[KNL, X86-64] Select a region under 4G first, and
792+
[KNL, X86-64, ARM64] Select a region under 4G first, and
793793
fall back to reserve region above 4G when '@offset'
794794
hasn't been specified.
795795
See Documentation/admin-guide/kdump/kdump.rst for further details.
@@ -809,26 +809,23 @@
809809
available.
810810
It will be ignored if crashkernel=X is specified.
811811
crashkernel=size[KMG],low
812-
[KNL, X86-64] range under 4G. When crashkernel=X,high
812+
[KNL, X86-64, ARM64] range under 4G. When crashkernel=X,high
813813
is passed, kernel could allocate physical memory region
814814
above 4G, that cause second kernel crash on system
815815
that require some amount of low memory, e.g. swiotlb
816816
requires at least 64M+32K low memory, also enough extra
817817
low memory is needed to make sure DMA buffers for 32-bit
818818
devices won't run out. Kernel would try to allocate
819-
at least 256M below 4G automatically.
819+
default size of memory below 4G automatically. The default
820+
size is platform dependent.
821+
--> x86: max(swiotlb_size_or_default() + 8MiB, 256MiB)
822+
--> arm64: 128MiB
820823
This one lets the user specify own low range under 4G
821824
for second kernel instead.
822825
0: to disable low allocation.
823826
It will be ignored when crashkernel=X,high is not used
824827
or memory reserved is below 4G.
825828

826-
[KNL, ARM64] range in low memory.
827-
This one lets the user specify a low range in the
828-
DMA zone for the crash dump kernel.
829-
It will be ignored when crashkernel=X,high is not used
830-
or memory reserved is located in the DMA zones.
831-
832829
cryptomgr.notests
833830
[KNL] Disable crypto self-tests
834831

arch/arm64/mm/init.c

Lines changed: 22 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -96,6 +96,8 @@ phys_addr_t __ro_after_init arm64_dma_phys_limit = PHYS_MASK + 1;
9696
#define CRASH_ADDR_LOW_MAX arm64_dma_phys_limit
9797
#define CRASH_ADDR_HIGH_MAX (PHYS_MASK + 1)
9898

99+
#define DEFAULT_CRASH_KERNEL_LOW_SIZE (128UL << 20)
100+
99101
static int __init reserve_crashkernel_low(unsigned long long low_size)
100102
{
101103
unsigned long long low_base;
@@ -130,6 +132,7 @@ static void __init reserve_crashkernel(void)
130132
unsigned long long crash_max = CRASH_ADDR_LOW_MAX;
131133
char *cmdline = boot_command_line;
132134
int ret;
135+
bool fixed_base = false;
133136

134137
if (!IS_ENABLED(CONFIG_KEXEC_CORE))
135138
return;
@@ -147,7 +150,9 @@ static void __init reserve_crashkernel(void)
147150
* is not allowed.
148151
*/
149152
ret = parse_crashkernel_low(cmdline, 0, &crash_low_size, &crash_base);
150-
if (ret && (ret != -ENOENT))
153+
if (ret == -ENOENT)
154+
crash_low_size = DEFAULT_CRASH_KERNEL_LOW_SIZE;
155+
else if (ret)
151156
return;
152157

153158
crash_max = CRASH_ADDR_HIGH_MAX;
@@ -159,18 +164,32 @@ static void __init reserve_crashkernel(void)
159164
crash_size = PAGE_ALIGN(crash_size);
160165

161166
/* User specifies base address explicitly. */
162-
if (crash_base)
167+
if (crash_base) {
168+
fixed_base = true;
163169
crash_max = crash_base + crash_size;
170+
}
164171

172+
retry:
165173
crash_base = memblock_phys_alloc_range(crash_size, CRASH_ALIGN,
166174
crash_base, crash_max);
167175
if (!crash_base) {
176+
/*
177+
* If the first attempt was for low memory, fall back to
178+
* high memory, the minimum required low memory will be
179+
* reserved later.
180+
*/
181+
if (!fixed_base && (crash_max == CRASH_ADDR_LOW_MAX)) {
182+
crash_max = CRASH_ADDR_HIGH_MAX;
183+
crash_low_size = DEFAULT_CRASH_KERNEL_LOW_SIZE;
184+
goto retry;
185+
}
186+
168187
pr_warn("cannot allocate crashkernel (size:0x%llx)\n",
169188
crash_size);
170189
return;
171190
}
172191

173-
if ((crash_base >= CRASH_ADDR_LOW_MAX) &&
192+
if ((crash_base > CRASH_ADDR_LOW_MAX - crash_low_size) &&
174193
crash_low_size && reserve_crashkernel_low(crash_low_size)) {
175194
memblock_phys_free(crash_base, crash_size);
176195
return;

0 commit comments

Comments
 (0)