From owner-svn-src-user@FreeBSD.ORG Fri Jul 10 21:38:06 2009 Return-Path: Delivered-To: svn-src-user@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:4f8:fff6::34]) by hub.freebsd.org (Postfix) with ESMTP id 3A053106566B; Fri, 10 Jul 2009 21:38:06 +0000 (UTC) (envelope-from kmacy@FreeBSD.org) Received: from svn.freebsd.org (svn.freebsd.org [IPv6:2001:4f8:fff6::2c]) by mx1.freebsd.org (Postfix) with ESMTP id 28E128FC0A; Fri, 10 Jul 2009 21:38:06 +0000 (UTC) (envelope-from kmacy@FreeBSD.org) Received: from svn.freebsd.org (localhost [127.0.0.1]) by svn.freebsd.org (8.14.3/8.14.3) with ESMTP id n6ALc6wM032877; Fri, 10 Jul 2009 21:38:06 GMT (envelope-from kmacy@svn.freebsd.org) Received: (from kmacy@localhost) by svn.freebsd.org (8.14.3/8.14.3/Submit) id n6ALc6wL032873; Fri, 10 Jul 2009 21:38:06 GMT (envelope-from kmacy@svn.freebsd.org) Message-Id: <200907102138.n6ALc6wL032873@svn.freebsd.org> From: Kip Macy Date: Fri, 10 Jul 2009 21:38:06 +0000 (UTC) To: src-committers@freebsd.org, svn-src-user@freebsd.org X-SVN-Group: user MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Cc: Subject: svn commit: r195591 - in user/kmacy/releng_7_2_fcs_1/sys/amd64: amd64 include X-BeenThere: svn-src-user@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: "SVN commit messages for the experimental " user" src tree" List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Fri, 10 Jul 2009 21:38:06 -0000 Author: kmacy Date: Fri Jul 10 21:38:05 2009 New Revision: 195591 URL: http://svn.freebsd.org/changeset/base/195591 Log: ignore kernel mapped pages that have the dump bit cleared Modified: user/kmacy/releng_7_2_fcs_1/sys/amd64/amd64/minidump_machdep.c user/kmacy/releng_7_2_fcs_1/sys/amd64/amd64/uma_machdep.c user/kmacy/releng_7_2_fcs_1/sys/amd64/include/vmparam.h Modified: user/kmacy/releng_7_2_fcs_1/sys/amd64/amd64/minidump_machdep.c ============================================================================== --- user/kmacy/releng_7_2_fcs_1/sys/amd64/amd64/minidump_machdep.c Fri Jul 10 21:36:40 2009 (r195590) +++ user/kmacy/releng_7_2_fcs_1/sys/amd64/amd64/minidump_machdep.c Fri Jul 10 21:38:05 2009 (r195591) @@ -69,12 +69,18 @@ static size_t counter, progress; CTASSERT(sizeof(*vm_page_dump) == 8); static int -is_dumpable(vm_paddr_t pa) +is_dumpable(vm_paddr_t pa, int ignorebit) { - int i; + int i, idx, bit, isdata; + uint64_t pfn = pa; + + pfn >>= PAGE_SHIFT; + idx = pfn >> 6; /* 2^6 = 64 */ + bit = pfn & 63; + isdata = (ignorebit == TRUE) ? 1 : vm_page_dump[idx] & (1ul << bit); for (i = 0; dump_avail[i] != 0 || dump_avail[i + 1] != 0; i += 2) { - if (pa >= dump_avail[i] && pa < dump_avail[i + 1]) + if (pa >= dump_avail[i] && pa < dump_avail[i + 1] && isdata) return (1); } return (0); @@ -195,7 +201,7 @@ minidumpsys(struct dumperinfo *di) int error; uint64_t bits; uint64_t *pdp, *pd, *pt, pa; - int i, j, k, bit; + int i, j, k, bit, pages_written; struct minidumphdr mdhdr; counter = 0; @@ -218,7 +224,7 @@ minidumpsys(struct dumperinfo *di) /* This is an entire 2M page. */ pa = pd[j] & PG_PS_FRAME; for (k = 0; k < NPTEPG; k++) { - if (is_dumpable(pa)) + if (is_dumpable(pa, TRUE)) dump_add_page(pa); pa += PAGE_SIZE; } @@ -230,7 +236,7 @@ minidumpsys(struct dumperinfo *di) for (k = 0; k < NPTEPG; k++) { if ((pt[k] & PG_V) == PG_V) { pa = pt[k] & PG_FRAME; - if (is_dumpable(pa)) + if (is_dumpable(pa, TRUE)) dump_add_page(pa); } } @@ -243,22 +249,26 @@ minidumpsys(struct dumperinfo *di) dumpsize = ptesize; dumpsize += round_page(msgbufp->msg_size); dumpsize += round_page(vm_page_dump_size); + printf("dumpsize: "); for (i = 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; /* Clear out undumpable pages now if needed */ - if (is_dumpable(pa)) { + if (is_dumpable(pa, FALSE)) { dumpsize += PAGE_SIZE; } else { dump_drop_page(pa); } bits &= ~(1ul << bit); + if (dumpsize % (1<<29)) + printf("%dMB ", (dumpsize>>20)); } } dumpsize += PAGE_SIZE; + printf("\n"); /* Determine dump offset on device. */ if (di->mediasize < SIZEOF_METADATA + dumpsize + sizeof(kdh) * 2) { error = ENOSPC; @@ -307,6 +317,7 @@ minidumpsys(struct dumperinfo *di) if (error) goto fail; + printf("\nDump kernel page table pages\n"); /* Dump kernel page table pages */ pdp = (uint64_t *)PHYS_TO_DMAP(KPDPphys); for (va = VM_MIN_KERNEL_ADDRESS; va < MAX(KERNBASE + NKPT * NBPDR, @@ -360,18 +371,23 @@ 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++) { + printf("\nclustering memory chunks\n"); + for (pages_written = i = 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; + pages_written++; + if (pages_written && (pages_written % 1024) == 0) + printf("%dMB ", pages_written*PAGE_SIZE); error = blk_write(di, 0, pa, PAGE_SIZE); if (error) goto fail; bits &= ~(1ul << bit); } } - + printf("\n"); error = blk_flush(di); if (error) goto fail; @@ -382,6 +398,7 @@ minidumpsys(struct dumperinfo *di) goto fail; dumplo += sizeof(kdh); + printf("\nstarting dump\n"); /* Signal completion, signoff and exit stage left. */ dump_write(di, NULL, 0, 0, 0); printf("\nDump complete\n"); Modified: user/kmacy/releng_7_2_fcs_1/sys/amd64/amd64/uma_machdep.c ============================================================================== --- user/kmacy/releng_7_2_fcs_1/sys/amd64/amd64/uma_machdep.c Fri Jul 10 21:36:40 2009 (r195590) +++ user/kmacy/releng_7_2_fcs_1/sys/amd64/amd64/uma_machdep.c Fri Jul 10 21:38:05 2009 (r195591) @@ -66,7 +66,8 @@ uma_small_alloc(uma_zone_t zone, int byt break; } pa = m->phys_addr; - dump_add_page(pa); + if ((wait & M_NODUMP) == 0) + dump_add_page(pa); va = (void *)PHYS_TO_DMAP(pa); if ((wait & M_ZERO) && (m->flags & PG_ZERO) == 0) pagezero(va); Modified: user/kmacy/releng_7_2_fcs_1/sys/amd64/include/vmparam.h ============================================================================== --- user/kmacy/releng_7_2_fcs_1/sys/amd64/include/vmparam.h Fri Jul 10 21:36:40 2009 (r195590) +++ user/kmacy/releng_7_2_fcs_1/sys/amd64/include/vmparam.h Fri Jul 10 21:38:05 2009 (r195591) @@ -88,6 +88,11 @@ #define UMA_MD_SMALL_ALLOC /* + * We machine specific sparse kernel dump + */ +#define VM_MD_MINIDUMP + +/* * The physical address space is densely populated. */ #define VM_PHYSSEG_DENSE