svn commit: r224302 - stable/8/sys/amd64/amd64
Maxim Sobolev
sobomax at FreeBSD.org
Mon Jul 25 01:42:52 UTC 2011
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));
More information about the svn-src-all
mailing list