Skip site navigation (1)Skip section navigation (2)
Date:      Fri, 10 Jul 2009 21:38:06 +0000 (UTC)
From:      Kip Macy <kmacy@FreeBSD.org>
To:        src-committers@freebsd.org, svn-src-user@freebsd.org
Subject:   svn commit: r195591 - in user/kmacy/releng_7_2_fcs_1/sys/amd64: amd64 include
Message-ID:  <200907102138.n6ALc6wL032873@svn.freebsd.org>

next in thread | raw e-mail | index | archive | help
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



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?200907102138.n6ALc6wL032873>