aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMitchell Horne <mhorne@FreeBSD.org>2021-11-17 15:35:18 +0000
committerMitchell Horne <mhorne@FreeBSD.org>2021-12-03 14:02:03 +0000
commit233ec6b12b56dcfb589479a82f1e973170f766d7 (patch)
tree8d6658e1e60589be0b24436f1ef0ba9d5e26d2bb
parent069d7fa63b219d526958b7e207d7843a7920d91c (diff)
minidump: Use the provided dump bitset
When constructing the set of dumpable pages, use the bitset provided by the state argument, rather than assuming vm_page_dump invariably. For normal kernel minidumps this will be a pointer to vm_page_dump, but when dumping the live system it will not. To do this, the functions in vm_dumpset.h are extended to accept the desired bitset as an argument. Note that this provided bitset is assumed to be derived from vm_page_dump, and therefore has the same size. Reviewed by: kib, markj, jhb MFC after: 2 weeks Sponsored by: Juniper Networks, Inc. Sponsored by: Klara, Inc. Differential Revision: https://reviews.freebsd.org/D31992 (cherry picked from commit 10fe6f80a6c871ba317ddc2684cecb8f02096943)
-rw-r--r--sys/amd64/amd64/minidump_machdep.c19
-rw-r--r--sys/arm/arm/minidump_machdep.c10
-rw-r--r--sys/arm64/arm64/minidump_machdep.c18
-rw-r--r--sys/i386/i386/minidump_machdep_base.c12
-rw-r--r--sys/mips/mips/minidump_machdep.c13
-rw-r--r--sys/powerpc/aim/mmu_oea64.c10
-rw-r--r--sys/powerpc/include/dump.h2
-rw-r--r--sys/powerpc/include/mmuvar.h2
-rw-r--r--sys/powerpc/powerpc/minidump_machdep.c8
-rw-r--r--sys/powerpc/powerpc/pmap_dispatch.c2
-rw-r--r--sys/riscv/riscv/minidump_machdep.c12
-rw-r--r--sys/vm/vm_dumpset.h20
12 files changed, 71 insertions, 57 deletions
diff --git a/sys/amd64/amd64/minidump_machdep.c b/sys/amd64/amd64/minidump_machdep.c
index 8d2bc3bca84a..de8433ae5a05 100644
--- a/sys/amd64/amd64/minidump_machdep.c
+++ b/sys/amd64/amd64/minidump_machdep.c
@@ -211,7 +211,8 @@ cpu_minidumpsys(struct dumperinfo *di, const struct minidumpstate *state)
pa = pdpe & PG_PS_FRAME;
for (n = 0; n < NPDEPG * NPTEPG; n++) {
if (vm_phys_is_dumpable(pa))
- dump_add_page(pa);
+ vm_page_dump_add(state->dump_bitset,
+ pa);
pa += PAGE_SIZE;
}
continue;
@@ -229,7 +230,8 @@ cpu_minidumpsys(struct dumperinfo *di, const struct minidumpstate *state)
pa = pde & PG_PS_FRAME;
for (k = 0; k < NPTEPG; k++) {
if (vm_phys_is_dumpable(pa))
- dump_add_page(pa);
+ vm_page_dump_add(
+ state->dump_bitset, pa);
pa += PAGE_SIZE;
}
continue;
@@ -238,7 +240,7 @@ cpu_minidumpsys(struct dumperinfo *di, const struct minidumpstate *state)
pa = pde & PG_FRAME;
/* set bit for this PTE page */
if (vm_phys_is_dumpable(pa))
- dump_add_page(pa);
+ vm_page_dump_add(state->dump_bitset, pa);
/* and for each valid page in this 2MB block */
pt = (uint64_t *)PHYS_TO_DMAP(pde & PG_FRAME);
for (k = 0; k < NPTEPG; k++) {
@@ -247,7 +249,8 @@ cpu_minidumpsys(struct dumperinfo *di, const struct minidumpstate *state)
continue;
pa = pte & PG_FRAME;
if (PHYS_IN_DMAP(pa) && vm_phys_is_dumpable(pa))
- dump_add_page(pa);
+ vm_page_dump_add(state->dump_bitset,
+ pa);
}
}
}
@@ -258,12 +261,12 @@ cpu_minidumpsys(struct dumperinfo *di, const struct minidumpstate *state)
dumpsize += round_page(mbp->msg_size);
dumpsize += round_page(sizeof(dump_avail));
dumpsize += round_page(BITSET_SIZE(vm_page_dump_pages));
- VM_PAGE_DUMP_FOREACH(pa) {
+ VM_PAGE_DUMP_FOREACH(state->dump_bitset, pa) {
/* Clear out undumpable pages now if needed */
if (PHYS_IN_DMAP(pa) && vm_phys_is_dumpable(pa)) {
dumpsize += PAGE_SIZE;
} else {
- dump_drop_page(pa);
+ vm_page_dump_drop(state->dump_bitset, pa);
}
}
dumpsize += PAGE_SIZE;
@@ -315,7 +318,7 @@ cpu_minidumpsys(struct dumperinfo *di, const struct minidumpstate *state)
goto fail;
/* Dump bitmap */
- error = blk_write(di, (char *)vm_page_dump, 0,
+ error = blk_write(di, (char *)state->dump_bitset, 0,
round_page(BITSET_SIZE(vm_page_dump_pages)));
if (error)
goto fail;
@@ -373,7 +376,7 @@ cpu_minidumpsys(struct dumperinfo *di, const struct minidumpstate *state)
}
/* Dump memory chunks */
- VM_PAGE_DUMP_FOREACH(pa) {
+ VM_PAGE_DUMP_FOREACH(state->dump_bitset, pa) {
error = blk_write(di, 0, pa, PAGE_SIZE);
if (error)
goto fail;
diff --git a/sys/arm/arm/minidump_machdep.c b/sys/arm/arm/minidump_machdep.c
index 76ce89f895e3..ab3034237d17 100644
--- a/sys/arm/arm/minidump_machdep.c
+++ b/sys/arm/arm/minidump_machdep.c
@@ -186,7 +186,7 @@ cpu_minidumpsys(struct dumperinfo *di, const struct minidumpstate *state)
for (va = KERNBASE; va < kva_end; va += PAGE_SIZE) {
pa = pmap_dump_kextract(va, NULL);
if (pa != 0 && vm_phys_is_dumpable(pa))
- dump_add_page(pa);
+ vm_page_dump_add(state->dump_bitset, pa);
ptesize += sizeof(pt2_entry_t);
}
@@ -196,12 +196,12 @@ cpu_minidumpsys(struct dumperinfo *di, const struct minidumpstate *state)
dumpsize += round_page(mbp->msg_size);
dumpsize += round_page(nitems(dump_avail) * sizeof(uint64_t));
dumpsize += round_page(BITSET_SIZE(vm_page_dump_pages));
- VM_PAGE_DUMP_FOREACH(pa) {
+ VM_PAGE_DUMP_FOREACH(state->dump_bitset, pa) {
/* Clear out undumpable pages now if needed */
if (vm_phys_is_dumpable(pa))
dumpsize += PAGE_SIZE;
else
- dump_drop_page(pa);
+ vm_page_dump_drop(state->dump_bitset, pa);
}
dumpsize += PAGE_SIZE;
@@ -255,7 +255,7 @@ cpu_minidumpsys(struct dumperinfo *di, const struct minidumpstate *state)
goto fail;
/* Dump bitmap */
- error = blk_write(di, (char *)vm_page_dump, 0,
+ error = blk_write(di, (char *)state->dump_bitset, 0,
round_page(BITSET_SIZE(vm_page_dump_pages)));
if (error)
goto fail;
@@ -279,7 +279,7 @@ cpu_minidumpsys(struct dumperinfo *di, const struct minidumpstate *state)
}
/* Dump memory chunks */
- VM_PAGE_DUMP_FOREACH(pa) {
+ VM_PAGE_DUMP_FOREACH(state->dump_bitset, pa) {
if (!count) {
prev_pa = pa;
count++;
diff --git a/sys/arm64/arm64/minidump_machdep.c b/sys/arm64/arm64/minidump_machdep.c
index 5a935d3c379d..8383d69fc5f8 100644
--- a/sys/arm64/arm64/minidump_machdep.c
+++ b/sys/arm64/arm64/minidump_machdep.c
@@ -187,14 +187,16 @@ cpu_minidumpsys(struct dumperinfo *di, const struct minidumpstate *state)
for (i = 0; i < Ln_ENTRIES * Ln_ENTRIES;
i++, pa += PAGE_SIZE)
if (vm_phys_is_dumpable(pa))
- dump_add_page(pa);
+ vm_page_dump_add(state->dump_bitset,
+ pa);
pmapsize += (Ln_ENTRIES - 1) * PAGE_SIZE;
va += L1_SIZE - L2_SIZE;
} else if ((l2e & ATTR_DESCR_MASK) == L2_BLOCK) {
pa = l2e & ~ATTR_MASK;
for (i = 0; i < Ln_ENTRIES; i++, pa += PAGE_SIZE) {
if (vm_phys_is_dumpable(pa))
- dump_add_page(pa);
+ vm_page_dump_add(state->dump_bitset,
+ pa);
}
} else if ((l2e & ATTR_DESCR_MASK) == L2_TABLE) {
for (i = 0; i < Ln_ENTRIES; i++) {
@@ -202,9 +204,9 @@ cpu_minidumpsys(struct dumperinfo *di, const struct minidumpstate *state)
if ((l3e & ATTR_DESCR_MASK) != L3_PAGE)
continue;
pa = l3e & ~ATTR_MASK;
- pa = l3e & ~ATTR_MASK;
if (PHYS_IN_DMAP(pa) && vm_phys_is_dumpable(pa))
- dump_add_page(pa);
+ vm_page_dump_add(state->dump_bitset,
+ pa);
}
}
}
@@ -215,11 +217,11 @@ cpu_minidumpsys(struct dumperinfo *di, const struct minidumpstate *state)
dumpsize += round_page(mbp->msg_size);
dumpsize += round_page(sizeof(dump_avail));
dumpsize += round_page(BITSET_SIZE(vm_page_dump_pages));
- VM_PAGE_DUMP_FOREACH(pa) {
+ VM_PAGE_DUMP_FOREACH(state->dump_bitset, pa) {
if (PHYS_IN_DMAP(pa) && vm_phys_is_dumpable(pa))
dumpsize += PAGE_SIZE;
else
- dump_drop_page(pa);
+ vm_page_dump_drop(state->dump_bitset, pa);
}
dumpsize += PAGE_SIZE;
@@ -270,7 +272,7 @@ cpu_minidumpsys(struct dumperinfo *di, const struct minidumpstate *state)
goto fail;
/* Dump bitmap */
- error = blk_write(di, (char *)vm_page_dump, 0,
+ error = blk_write(di, (char *)state->dump_bitset, 0,
round_page(BITSET_SIZE(vm_page_dump_pages)));
if (error)
goto fail;
@@ -351,7 +353,7 @@ cpu_minidumpsys(struct dumperinfo *di, const struct minidumpstate *state)
}
/* Dump memory chunks */
- VM_PAGE_DUMP_FOREACH(pa) {
+ VM_PAGE_DUMP_FOREACH(state->dump_bitset, pa) {
error = blk_write(di, 0, pa, PAGE_SIZE);
if (error)
goto fail;
diff --git a/sys/i386/i386/minidump_machdep_base.c b/sys/i386/i386/minidump_machdep_base.c
index 196c375bec56..a3f09228fa2d 100644
--- a/sys/i386/i386/minidump_machdep_base.c
+++ b/sys/i386/i386/minidump_machdep_base.c
@@ -191,7 +191,8 @@ cpu_minidumpsys(struct dumperinfo *di, const struct minidumpstate *state)
pa = pde & PG_PS_FRAME;
for (k = 0; k < NPTEPG; k++) {
if (vm_phys_is_dumpable(pa))
- dump_add_page(pa);
+ vm_page_dump_add(state->dump_bitset,
+ pa);
pa += PAGE_SIZE;
}
continue;
@@ -204,7 +205,8 @@ cpu_minidumpsys(struct dumperinfo *di, const struct minidumpstate *state)
if ((pte & PG_V) == PG_V) {
pa = pte & PG_FRAME;
if (vm_phys_is_dumpable(pa))
- dump_add_page(pa);
+ vm_page_dump_add(
+ state->dump_bitset, pa);
}
}
} else {
@@ -218,12 +220,12 @@ cpu_minidumpsys(struct dumperinfo *di, const struct minidumpstate *state)
dumpsize += round_page(mbp->msg_size);
dumpsize += round_page(sizeof(dump_avail));
dumpsize += round_page(BITSET_SIZE(vm_page_dump_pages));
- VM_PAGE_DUMP_FOREACH(pa) {
+ VM_PAGE_DUMP_FOREACH(state->dump_bitset, pa) {
/* Clear out undumpable pages now if needed */
if (vm_phys_is_dumpable(pa)) {
dumpsize += PAGE_SIZE;
} else {
- dump_drop_page(pa);
+ vm_page_dump_drop(state->dump_bitset, pa);
}
}
dumpsize += PAGE_SIZE;
@@ -317,7 +319,7 @@ cpu_minidumpsys(struct dumperinfo *di, const struct minidumpstate *state)
}
/* Dump memory chunks */
- VM_PAGE_DUMP_FOREACH(pa) {
+ VM_PAGE_DUMP_FOREACH(state->dump_bitset, pa) {
error = blk_write(di, 0, pa, PAGE_SIZE);
if (error)
goto fail;
diff --git a/sys/mips/mips/minidump_machdep.c b/sys/mips/mips/minidump_machdep.c
index 49a5ee3f15a7..abe45e999f13 100644
--- a/sys/mips/mips/minidump_machdep.c
+++ b/sys/mips/mips/minidump_machdep.c
@@ -134,7 +134,8 @@ cpu_minidumpsys(struct dumperinfo *di, const struct minidumpstate *state)
if (pte_test(&pte[i], PTE_V)) {
pa = TLBLO_PTE_TO_PA(pte[i]);
if (vm_phys_is_dumpable(pa))
- dump_add_page(pa);
+ vm_page_dump_add(state->dump_bitset,
+ pa);
}
}
}
@@ -145,7 +146,7 @@ cpu_minidumpsys(struct dumperinfo *di, const struct minidumpstate *state)
*/
for (pa = 0; pa < phys_avail[0]; pa += PAGE_SIZE) {
if (vm_phys_is_dumpable(pa))
- dump_add_page(pa);
+ vm_page_dump_add(state->dump_bitset, pa);
}
/* Calculate dump size. */
@@ -154,12 +155,12 @@ cpu_minidumpsys(struct dumperinfo *di, const struct minidumpstate *state)
dumpsize += round_page(mbp->msg_size);
dumpsize += round_page(nitems(dump_avail) * sizeof(uint64_t));
dumpsize += round_page(BITSET_SIZE(vm_page_dump_pages));
- VM_PAGE_DUMP_FOREACH(pa) {
+ VM_PAGE_DUMP_FOREACH(state->dump_bitset, pa) {
/* Clear out undumpable pages now if needed */
if (vm_phys_is_dumpable(pa))
dumpsize += PAGE_SIZE;
else
- dump_drop_page(pa);
+ vm_page_dump_drop(state->dump_bitset, pa);
}
dumpsize += PAGE_SIZE;
@@ -249,8 +250,8 @@ cpu_minidumpsys(struct dumperinfo *di, const struct minidumpstate *state)
prev_pte = 0;
}
- /* Dump memory chunks page by page*/
- VM_PAGE_DUMP_FOREACH(pa) {
+ /* Dump memory chunks page by page */
+ VM_PAGE_DUMP_FOREACH(state->dump_bitset, pa) {
dump_va = pmap_kenter_temporary(pa, 0);
error = write_buffer(di, dump_va, PAGE_SIZE);
if (error)
diff --git a/sys/powerpc/aim/mmu_oea64.c b/sys/powerpc/aim/mmu_oea64.c
index 2f7f6ce29422..41771c3650f3 100644
--- a/sys/powerpc/aim/mmu_oea64.c
+++ b/sys/powerpc/aim/mmu_oea64.c
@@ -438,7 +438,7 @@ static int moea64_map_user_ptr(pmap_t pm,
volatile const void *uaddr, void **kaddr, size_t ulen, size_t *klen);
static int moea64_decode_kernel_ptr(vm_offset_t addr,
int *is_user, vm_offset_t *decoded_addr);
-static size_t moea64_scan_pmap(void);
+static size_t moea64_scan_pmap(struct bitset *dump_bitset);
static void *moea64_dump_pmap_init(unsigned blkpgs);
#ifdef __powerpc64__
static void moea64_page_array_startup(long);
@@ -3324,7 +3324,7 @@ moea64_scan_init()
#ifdef __powerpc64__
static size_t
-moea64_scan_pmap()
+moea64_scan_pmap(struct bitset *dump_bitset)
{
struct pvo_entry *pvo;
vm_paddr_t pa, pa_end;
@@ -3367,11 +3367,11 @@ moea64_scan_pmap()
pa_end = pa + lpsize;
for (; pa < pa_end; pa += PAGE_SIZE) {
if (vm_phys_is_dumpable(pa))
- dump_add_page(pa);
+ vm_page_dump_add(dump_bitset, pa);
}
} else {
if (vm_phys_is_dumpable(pa))
- dump_add_page(pa);
+ vm_page_dump_add(dump_bitset, pa);
}
}
PMAP_UNLOCK(kernel_pmap);
@@ -3393,7 +3393,7 @@ moea64_dump_pmap_init(unsigned blkpgs)
#else
static size_t
-moea64_scan_pmap()
+moea64_scan_pmap(struct bitset *dump_bitset __unused)
{
return (0);
}
diff --git a/sys/powerpc/include/dump.h b/sys/powerpc/include/dump.h
index 3debbfbe25f9..c45ccd2158de 100644
--- a/sys/powerpc/include/dump.h
+++ b/sys/powerpc/include/dump.h
@@ -40,7 +40,7 @@
void dumpsys_pa_init(void);
void dumpsys_unmap_chunk(vm_paddr_t, size_t, void *);
-size_t dumpsys_scan_pmap(void);
+size_t dumpsys_scan_pmap(struct bitset *);
void *dumpsys_dump_pmap_init(unsigned blkpgs);
void *dumpsys_dump_pmap(void *ctx, void *buf, u_long *nbytes);
diff --git a/sys/powerpc/include/mmuvar.h b/sys/powerpc/include/mmuvar.h
index f94ca56df441..b449064e009f 100644
--- a/sys/powerpc/include/mmuvar.h
+++ b/sys/powerpc/include/mmuvar.h
@@ -96,7 +96,7 @@ typedef void (*pmap_sync_icache_t)(pmap_t, vm_offset_t, vm_size_t);
typedef void (*pmap_dumpsys_map_chunk_t)(vm_paddr_t, size_t, void **);
typedef void (*pmap_dumpsys_unmap_chunk_t)(vm_paddr_t, size_t, void *);
typedef void (*pmap_dumpsys_pa_init_t)(void);
-typedef size_t (*pmap_dumpsys_scan_pmap_t)(void);
+typedef size_t (*pmap_dumpsys_scan_pmap_t)(struct bitset *dump_bitset);
typedef void *(*pmap_dumpsys_dump_pmap_init_t)(unsigned);
typedef void *(*pmap_dumpsys_dump_pmap_t)(void *, void *, u_long *);
typedef vm_offset_t (*pmap_quick_enter_page_t)(vm_page_t);
diff --git a/sys/powerpc/powerpc/minidump_machdep.c b/sys/powerpc/powerpc/minidump_machdep.c
index c7e8d1965b98..396c6487823e 100644
--- a/sys/powerpc/powerpc/minidump_machdep.c
+++ b/sys/powerpc/powerpc/minidump_machdep.c
@@ -204,7 +204,7 @@ retry:
DBG(total = dumptotal = 0;)
/* Build set of dumpable pages from kernel pmap */
- pmapsize = dumpsys_scan_pmap();
+ pmapsize = dumpsys_scan_pmap(state->dump_bitset);
if (pmapsize % PAGE_SIZE != 0) {
printf("pmapsize not page aligned: 0x%x\n", pmapsize);
return (EINVAL);
@@ -217,12 +217,12 @@ retry:
dumpsize += round_page(sizeof(dump_avail));
dumpsize += round_page(BITSET_SIZE(vm_page_dump_pages));
dumpsize += pmapsize;
- VM_PAGE_DUMP_FOREACH(pa) {
+ VM_PAGE_DUMP_FOREACH(state->dump_bitset, pa) {
/* Clear out undumpable pages now if needed */
if (vm_phys_is_dumpable(pa))
dumpsize += PAGE_SIZE;
else
- dump_drop_page(pa);
+ vm_page_dump_drop(state->dump_bitset, pa);
}
dumpsys_pb_init(dumpsize);
@@ -289,7 +289,7 @@ retry:
dump_total("pmap", pmapsize);
/* Dump memory chunks */
- VM_PAGE_DUMP_FOREACH(pa) {
+ VM_PAGE_DUMP_FOREACH(state->dump_bitset, pa) {
error = blk_write(di, 0, pa, PAGE_SIZE);
if (error)
goto fail;
diff --git a/sys/powerpc/powerpc/pmap_dispatch.c b/sys/powerpc/powerpc/pmap_dispatch.c
index 5a47b6d8bf31..a3c227bbde7d 100644
--- a/sys/powerpc/powerpc/pmap_dispatch.c
+++ b/sys/powerpc/powerpc/pmap_dispatch.c
@@ -188,7 +188,7 @@ DEFINE_PMAP_IFUNC(void, tlbie_all, (void));
DEFINE_DUMPSYS_IFUNC(void, map_chunk, (vm_paddr_t, size_t, void **));
DEFINE_DUMPSYS_IFUNC(void, unmap_chunk, (vm_paddr_t, size_t, void *));
DEFINE_DUMPSYS_IFUNC(void, pa_init, (void));
-DEFINE_DUMPSYS_IFUNC(size_t, scan_pmap, (void));
+DEFINE_DUMPSYS_IFUNC(size_t, scan_pmap, (struct bitset *));
DEFINE_DUMPSYS_IFUNC(void *, dump_pmap_init, (unsigned));
DEFINE_DUMPSYS_IFUNC(void *, dump_pmap, (void *, void *, u_long *));
diff --git a/sys/riscv/riscv/minidump_machdep.c b/sys/riscv/riscv/minidump_machdep.c
index 814c2dd00697..ee6faaa6680f 100644
--- a/sys/riscv/riscv/minidump_machdep.c
+++ b/sys/riscv/riscv/minidump_machdep.c
@@ -197,7 +197,8 @@ retry:
pa = (l2e >> PTE_PPN1_S) << L2_SHIFT;
for (i = 0; i < Ln_ENTRIES; i++, pa += PAGE_SIZE) {
if (vm_phys_is_dumpable(pa))
- dump_add_page(pa);
+ vm_page_dump_add(state->dump_bitset,
+ pa);
}
} else {
for (i = 0; i < Ln_ENTRIES; i++) {
@@ -206,7 +207,8 @@ retry:
continue;
pa = (l3e >> PTE_PPN0_S) * PAGE_SIZE;
if (PHYS_IN_DMAP(pa) && vm_phys_is_dumpable(pa))
- dump_add_page(pa);
+ vm_page_dump_add(state->dump_bitset,
+ pa);
}
}
}
@@ -217,12 +219,12 @@ retry:
dumpsize += round_page(mbp->msg_size);
dumpsize += round_page(sizeof(dump_avail));
dumpsize += round_page(BITSET_SIZE(vm_page_dump_pages));
- VM_PAGE_DUMP_FOREACH(pa) {
+ VM_PAGE_DUMP_FOREACH(state->dump_bitset, pa) {
/* Clear out undumpable pages now if needed */
if (PHYS_IN_DMAP(pa) && vm_phys_is_dumpable(pa))
dumpsize += PAGE_SIZE;
else
- dump_drop_page(pa);
+ vm_page_dump_drop(state->dump_bitset, pa);
}
dumpsize += PAGE_SIZE;
@@ -327,7 +329,7 @@ retry:
/* Dump memory chunks */
/* XXX cluster it up and use blk_dump() */
- VM_PAGE_DUMP_FOREACH(pa) {
+ VM_PAGE_DUMP_FOREACH(state->dump_bitset, pa) {
error = blk_write(di, 0, pa, PAGE_SIZE);
if (error)
goto fail;
diff --git a/sys/vm/vm_dumpset.h b/sys/vm/vm_dumpset.h
index 6be417344263..f9ba6b2429c5 100644
--- a/sys/vm/vm_dumpset.h
+++ b/sys/vm/vm_dumpset.h
@@ -37,8 +37,12 @@ extern struct bitset *vm_page_dump;
extern long vm_page_dump_pages;
extern vm_paddr_t dump_avail[PHYS_AVAIL_COUNT];
+/* For the common case: add/remove a page from the minidump bitset. */
+#define dump_add_page(pa) vm_page_dump_add(vm_page_dump, pa)
+#define dump_drop_page(pa) vm_page_dump_drop(vm_page_dump, pa)
+
static inline void
-dump_add_page(vm_paddr_t pa)
+vm_page_dump_add(struct bitset *bitset, vm_paddr_t pa)
{
vm_pindex_t adj;
int i;
@@ -48,7 +52,7 @@ dump_add_page(vm_paddr_t pa)
if (pa >= dump_avail[i] && pa < dump_avail[i + 1]) {
BIT_SET_ATOMIC(vm_page_dump_pages,
(pa >> PAGE_SHIFT) - (dump_avail[i] >> PAGE_SHIFT) +
- adj, vm_page_dump);
+ adj, bitset);
return;
}
adj += howmany(dump_avail[i + 1], PAGE_SIZE) -
@@ -57,7 +61,7 @@ dump_add_page(vm_paddr_t pa)
}
static inline void
-dump_drop_page(vm_paddr_t pa)
+vm_page_dump_drop(struct bitset *bitset, vm_paddr_t pa)
{
vm_pindex_t adj;
int i;
@@ -67,7 +71,7 @@ dump_drop_page(vm_paddr_t pa)
if (pa >= dump_avail[i] && pa < dump_avail[i + 1]) {
BIT_CLR_ATOMIC(vm_page_dump_pages,
(pa >> PAGE_SHIFT) - (dump_avail[i] >> PAGE_SHIFT) +
- adj, vm_page_dump);
+ adj, bitset);
return;
}
adj += howmany(dump_avail[i + 1], PAGE_SIZE) -
@@ -91,9 +95,9 @@ vm_page_dump_index_to_pa(int bit)
return ((vm_paddr_t)NULL);
}
-#define VM_PAGE_DUMP_FOREACH(pa) \
- for (vm_pindex_t __b = BIT_FFS(vm_page_dump_pages, vm_page_dump); \
- (pa) = vm_page_dump_index_to_pa(__b - 1), __b != 0; \
- __b = BIT_FFS_AT(vm_page_dump_pages, vm_page_dump, __b))
+#define VM_PAGE_DUMP_FOREACH(bitset, pa) \
+ for (vm_pindex_t __b = BIT_FFS(vm_page_dump_pages, bitset); \
+ (pa) = vm_page_dump_index_to_pa(__b - 1), __b != 0; \
+ __b = BIT_FFS_AT(vm_page_dump_pages, bitset, __b))
#endif /* _SYS_DUMPSET_H_ */