commit 25f9e82e4ac93e71c6cf06fe2faa1899967db725 Author: Bryan Venteicher Date: Sun Sep 29 13:56:42 2013 -0500 Call blk_write() with a run of physically contiguous pages Previously, blk_write() was being called one page at a time, which would cause it to poll the console for every page. This change makes dumping a magnitude faster, and is especially useful on large memory machines. diff --git a/sys/amd64/amd64/minidump_machdep.c b/sys/amd64/amd64/minidump_machdep.c index f14c539..26b2b31 100644 --- a/sys/amd64/amd64/minidump_machdep.c +++ b/sys/amd64/amd64/minidump_machdep.c @@ -221,7 +221,8 @@ minidumpsys(struct dumperinfo *di) vm_offset_t va; int error; uint64_t bits; - uint64_t *pml4, *pdp, *pd, *pt, pa; + uint64_t *pml4, *pdp, *pd, *pt, start_pa, pa; + size_t sz; int i, ii, j, k, n, bit; int retry_count; struct minidumphdr mdhdr; @@ -412,18 +413,29 @@ minidumpsys(struct dumperinfo *di) } /* Dump memory chunks */ - /* XXX cluster it up and use blk_dump() */ - for (i = 0; i < vm_page_dump_size / sizeof(*vm_page_dump); i++) { + for (i = 0, start_pa = 0, sz = 0; + i < vm_page_dump_size / sizeof(*vm_page_dump); i++) { bits = vm_page_dump[i]; while (bits) { bit = bsfq(bits); pa = (((uint64_t)i * sizeof(*vm_page_dump) * NBBY) + bit) * PAGE_SIZE; - error = blk_write(di, 0, pa, PAGE_SIZE); - if (error) - goto fail; + if (sz == 0 || start_pa + sz == pa) { + if (sz == 0) + start_pa = pa; + sz += PAGE_SIZE; + } else { + error = blk_write(di, 0, start_pa, sz); + if (error) + goto fail; + start_pa = pa; + sz = PAGE_SIZE; + } bits &= ~(1ul << bit); } } + error = blk_write(di, 0, start_pa, sz); + if (error) + goto fail; error = blk_flush(di); if (error)