aboutsummaryrefslogtreecommitdiff
path: root/sys/arm
diff options
context:
space:
mode:
authorD Scott Phillips <scottph@FreeBSD.org>2020-09-21 22:21:59 +0000
committerD Scott Phillips <scottph@FreeBSD.org>2020-09-21 22:21:59 +0000
commit00e6614750deca2457373aecd5bfa7aebbde3865 (patch)
tree73c950caf7bef81919555e2270ded794535c1b37 /sys/arm
parentab041f713aeccdf23b4805ffb71815c8d4aa9c88 (diff)
downloadsrc-00e6614750deca2457373aecd5bfa7aebbde3865.tar.gz
src-00e6614750deca2457373aecd5bfa7aebbde3865.zip
Sparsify the vm_page_dump bitmap
On Ampere Altra systems, the sparse population of RAM within the physical address space causes the vm_page_dump bitmap to be much larger than necessary, increasing the size from ~8 Mib to > 2 Gib (and overflowing `int` for the size). Changing the page dump bitmap also changes the minidump file format, so changes are also necessary in libkvm. Reviewed by: jhb Approved by: scottl (implicit) MFC after: 1 week Sponsored by: Ampere Computing, Inc. Differential Revision: https://reviews.freebsd.org/D26131
Notes
Notes: svn path=/head/; revision=365978
Diffstat (limited to 'sys/arm')
-rw-r--r--sys/arm/arm/minidump_machdep.c11
-rw-r--r--sys/arm/include/minidump.h3
2 files changed, 13 insertions, 1 deletions
diff --git a/sys/arm/arm/minidump_machdep.c b/sys/arm/arm/minidump_machdep.c
index 4d4d565885b7..332c946dd92b 100644
--- a/sys/arm/arm/minidump_machdep.c
+++ b/sys/arm/arm/minidump_machdep.c
@@ -206,6 +206,7 @@ minidumpsys(struct dumperinfo *di)
/* Calculate dump size. */
dumpsize = ptesize;
dumpsize += round_page(msgbufp->msg_size);
+ dumpsize += round_page(sizeof(dump_avail));
dumpsize += round_page(BITSET_SIZE(vm_page_dump_pages));
VM_PAGE_DUMP_FOREACH(pa) {
/* Clear out undumpable pages now if needed */
@@ -232,6 +233,7 @@ minidumpsys(struct dumperinfo *di)
#else
mdhdr.mmuformat = MINIDUMP_MMU_FORMAT_V4;
#endif
+ mdhdr.dumpavailsize = round_page(sizeof(dump_avail));
dump_init_header(di, &kdh, KERNELDUMPMAGIC, KERNELDUMP_ARM_VERSION,
dumpsize);
@@ -255,6 +257,15 @@ minidumpsys(struct dumperinfo *di)
if (error)
goto fail;
+ /* Dump dump_avail */
+ _Static_assert(sizeof(dump_avail) <= sizeof(dumpbuf),
+ "Large dump_avail not handled");
+ bzero(dumpbuf, sizeof(dumpbuf));
+ memcpy(dumpbuf, dump_avail, sizeof(dump_avail));
+ error = blk_write(di, dumpbuf, 0, PAGE_SIZE);
+ if (error)
+ goto fail;
+
/* Dump bitmap */
error = blk_write(di, (char *)vm_page_dump, 0,
round_page(BITSET_SIZE(vm_page_dump_pages)));
diff --git a/sys/arm/include/minidump.h b/sys/arm/include/minidump.h
index 2708030f27c3..d11e997d94dc 100644
--- a/sys/arm/include/minidump.h
+++ b/sys/arm/include/minidump.h
@@ -33,7 +33,7 @@
#define _MACHINE_MINIDUMP_H_
#define MINIDUMP_MAGIC "minidump FreeBSD/arm"
-#define MINIDUMP_VERSION 1
+#define MINIDUMP_VERSION 2
/*
* The first page of vmcore is dedicated to the following header.
@@ -51,6 +51,7 @@ struct minidumphdr {
uint32_t kernbase;
uint32_t arch;
uint32_t mmuformat;
+ uint32_t dumpavailsize;
};
#define MINIDUMP_MMU_FORMAT_UNKNOWN 0