diff options
author | D Scott Phillips <scottph@FreeBSD.org> | 2020-09-21 22:21:59 +0000 |
---|---|---|
committer | D Scott Phillips <scottph@FreeBSD.org> | 2020-09-21 22:21:59 +0000 |
commit | 00e6614750deca2457373aecd5bfa7aebbde3865 (patch) | |
tree | 73c950caf7bef81919555e2270ded794535c1b37 /sys/arm | |
parent | ab041f713aeccdf23b4805ffb71815c8d4aa9c88 (diff) | |
download | src-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.c | 11 | ||||
-rw-r--r-- | sys/arm/include/minidump.h | 3 |
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 |