summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorHongyan Xia <hongyxia@amazon.com>2021-04-06 15:11:53 +0100
committerSimon Horman <horms@verge.net.au>2021-04-07 21:27:38 +0200
commit0b69943f26ca4e126c46d52a7a94efdd82729511 (patch)
treea164dd7f86f06dbdd3d7145bed2fb370a976e1f9
parent774a16b16328310c2be41794fa462a0f6691c121 (diff)
downloadkexec-tools-0b69943f26ca4e126c46d52a7a94efdd82729511.tar.gz
Shrink segments to fit alignment instead of throwing them away
We risk throwing an entire large chunk away if it is just slightly unaligned which then causes the crash kernel to run out of RAM. Keep them and shrink them to alignment. Signed-off-by: Hongyan Xia <hongyxia@amazon.com> Signed-off-by: Simon Horman <horms@verge.net.au>
-rw-r--r--kexec/arch/i386/crashdump-x86.c15
1 files changed, 12 insertions, 3 deletions
diff --git a/kexec/arch/i386/crashdump-x86.c b/kexec/arch/i386/crashdump-x86.c
index df84185d..0dada99a 100644
--- a/kexec/arch/i386/crashdump-x86.c
+++ b/kexec/arch/i386/crashdump-x86.c
@@ -483,9 +483,18 @@ static int add_memmap(struct memory_range *memmap_p, int *nr_memmap,
int i, j, nr_entries = 0, tidx = 0, align = 1024;
unsigned long long mstart, mend;
- /* Do alignment check if it's RANGE_RAM */
- if ((type == RANGE_RAM) && ((addr%align) || (size%align)))
- return -1;
+ /* Shrink to 1KiB alignment if needed. */
+ if (type == RANGE_RAM && ((addr%align) || (size%align))) {
+ unsigned long long end = addr + size;
+
+ printf("%s: RAM chunk %#llx - %#llx unaligned\n", __func__, addr, end);
+ addr = _ALIGN_UP(addr, align);
+ end = _ALIGN_DOWN(end, align);
+ if (addr >= end)
+ return -1;
+ size = end - addr;
+ printf("%s: RAM chunk shrunk to %#llx - %#llx\n", __func__, addr, end);
+ }
/* Make sure at least one entry in list is free. */
for (i = 0; i < CRASH_MAX_MEMMAP_NR; i++) {