Skip site navigation (1)Skip section navigation (2)
Date:      Mon, 25 Jul 2011 01:42:52 +0000 (UTC)
From:      Maxim Sobolev <sobomax@FreeBSD.org>
To:        src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-stable@freebsd.org, svn-src-stable-8@freebsd.org
Subject:   svn commit: r224302 - stable/8/sys/amd64/amd64
Message-ID:  <201107250142.p6P1gq5t032691@svn.freebsd.org>

next in thread | raw e-mail | index | archive | help
Author: sobomax
Date: Mon Jul 25 01:42:51 2011
New Revision: 224302
URL: http://svn.freebsd.org/changeset/base/224302

Log:
  MFC: re-work dump progress indicator to work better with more than few gigs
  of RAM.

Modified:
  stable/8/sys/amd64/amd64/minidump_machdep.c

Modified: stable/8/sys/amd64/amd64/minidump_machdep.c
==============================================================================
--- stable/8/sys/amd64/amd64/minidump_machdep.c	Mon Jul 25 00:17:20 2011	(r224301)
+++ stable/8/sys/amd64/amd64/minidump_machdep.c	Mon Jul 25 01:42:51 2011	(r224302)
@@ -69,7 +69,7 @@ static off_t dumplo;
 /* Handle chunked writes. */
 static size_t fragsz;
 static void *dump_va;
-static size_t counter, progress;
+static size_t counter, progress, dumpsize;
 
 CTASSERT(sizeof(*vm_page_dump) == 8);
 
@@ -101,6 +101,40 @@ blk_flush(struct dumperinfo *di)
 	return (error);
 }
 
+static struct {
+	int min_per;
+	int max_per;
+	int visited;
+} progress_track[10] = {
+	{  0,  10, 0},
+	{ 10,  20, 0},
+	{ 20,  30, 0},
+	{ 30,  40, 0},
+	{ 40,  50, 0},
+	{ 50,  60, 0},
+	{ 60,  70, 0},
+	{ 70,  80, 0},
+	{ 80,  90, 0},
+	{ 90, 100, 0}
+};
+
+static void
+report_progress(size_t progress, size_t dumpsize)
+{
+	int sofar, i;
+
+	sofar = 100 - ((progress * 100) / dumpsize);
+	for (i = 0; i < 10; i++) {
+		if (sofar < progress_track[i].min_per || sofar > progress_track[i].max_per)
+			continue;
+		if (progress_track[i].visited)
+			return;
+		progress_track[i].visited = 1;
+		printf("..%d%%", sofar);
+		return;
+	}
+}
+
 static int
 blk_write(struct dumperinfo *di, char *ptr, vm_paddr_t pa, size_t sz)
 {
@@ -137,7 +171,7 @@ blk_write(struct dumperinfo *di, char *p
 		counter += len;
 		progress -= len;
 		if (counter >> 24) {
-			printf(" %ld", PG2MB(progress >> PAGE_SHIFT));
+			report_progress(progress, dumpsize);
 			counter &= (1<<24) - 1;
 		}
 #ifdef SW_WATCHDOG
@@ -180,7 +214,6 @@ static pd_entry_t fakepd[NPDEPG];
 void
 minidumpsys(struct dumperinfo *di)
 {
-	uint64_t dumpsize;
 	uint32_t pmapsize;
 	vm_offset_t va;
 	int error;
@@ -300,8 +333,8 @@ minidumpsys(struct dumperinfo *di)
 
 	mkdumpheader(&kdh, KERNELDUMPMAGIC, KERNELDUMP_AMD64_VERSION, dumpsize, di->blocksize);
 
-	printf("Physical memory: %ju MB\n", ptoa((uintmax_t)physmem) / 1048576);
-	printf("Dumping %llu MB:", (long long)dumpsize >> 20);
+	printf("Dumping %llu out of %ju MB:", (long long)dumpsize >> 20,
+	    ptoa((uintmax_t)physmem) / 1048576);
 
 	/* Dump leader */
 	error = dump_write(di, &kdh, 0, dumplo, sizeof(kdh));



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