Skip site navigation (1)Skip section navigation (2)
Date:      Tue, 27 Mar 2001 13:46:40 -0800 (PST)
From:      Gersh <gersh@sonn.com>
To:        freebsd-hackers@FreeBSD.ORG
Subject:   crash dump speed up patch.
Message-ID:  <Pine.BSF.4.21.0103271335580.3635-200000@tabby.sonn.com>

next in thread | raw e-mail | index | archive | help

[-- Attachment #1 --]
Ive writen a quick patch for dev/ata/ata-disk.c:addump under
4.0-stable (03/26/01) which is considerbally faster.

I did dumps on a SMP system with 512 megs of ram.

Old:  201 seconds.
New:   59 seconds.

What I could gather from talking to people over irc/email about the
problem was that there was a DELAY(1000) in between each printf
to deal with problems with serial connections to the debugger.  The
soultion I came up with simply to display a smaller ammount of printf's
the output looks like this:

Dump in progress, percentage complete: 10 20 30 40 50 60 70 80 100.  Done.

The dump_stats() routine probally belongs in some kern/subr_whatever.c
and should probally be used in the other dump routines for da/ide etc.

Any thoughts or comments ?

[-- Attachment #2 --]
--- ata-disk.c.orig	Tue Mar 27 10:31:59 2001
+++ ata-disk.c	Tue Mar 27 14:39:24 2001
@@ -91,6 +91,7 @@
 static struct cdevsw fakewddisk_cdevsw;
 
 /* prototypes */
+int dump_stats(int, int, int *);
 static void ad_timeout(struct ad_request *);
 static int32_t ad_version(u_int16_t);
 
@@ -259,7 +260,7 @@
     struct ad_request request;
     u_int count, blkno, secsize;
     vm_offset_t addr = 0;
-    int error;
+    int error, left, state, total, percent;
 
     if ((error = disk_dumpcheck(dev, &count, &blkno, &secsize)))
 	return error;
@@ -271,8 +272,12 @@
     adp->controller->mode[ATA_DEV(adp->unit)] = ATA_PIO;
     ata_reinit(adp->controller);
 
+    state = left = 0;
+    total = (count * DEV_BSIZE) / (1024 * 1024);
+
+    printf("Dump in progress, percentage complete: ");
+
     while (count > 0) {
-	DELAY(1000);
 	if (is_physical_memory(addr))
 	    pmap_enter(kernel_pmap, (vm_offset_t)CADDR1,
 		       trunc_page(addr), VM_PROT_READ, TRUE);
@@ -300,9 +305,17 @@
 	    if (wdog_tickler)
 		(*wdog_tickler)();
 #endif
-	    printf("%ld ", (long)(count * DEV_BSIZE) / (1024 * 1024));
-	}
+	    left++;
+	    percent = left * 100 / total;
 
+	    /*
+	     *  Rate limit printf's to replace old DELAY(1000)
+	     *  This is done so that old slow serial connections
+	     *  do not get hosed.
+	     */
+
+	    dump_stats(percent, total, &state);
+	}
 	blkno += howmany(PAGE_SIZE, secsize);
 	count -= howmany(PAGE_SIZE, secsize);
 	addr += PAGE_SIZE;
@@ -619,4 +632,96 @@
 	if (version & (1<<bit))
 	    return bit;
     return 0;
+}
+
+int
+dump_stats(count, total, state)
+	int count;
+	int total;
+	int *state;
+{
+	switch (*state)
+	{
+	    case 0:
+		if (count > 10)
+		    *state = 10;
+	    break;
+
+	    case 10:
+		if (count > 20)
+		{
+		    printf("%d ", *state);
+		    *state = 20; 
+		}
+	    break;
+
+	    case 20:
+		if (count > 30)
+		{
+		    printf("%d ", *state);
+		    *state = 30; 
+		}
+	    break;
+
+	    case 30:
+		if (count > 40)
+		{
+		    printf("%d ", *state);
+		    *state = 40; 
+		}
+	    break;
+
+	    case 40:
+		if (count > 50)
+		{
+		    printf("%d ", *state);
+		    *state = 50; 
+		}
+	    break;
+
+	    case 50:
+		if (count > 60)
+		{
+		    printf("%d ", *state);
+		    *state = 60; 
+		}
+	    break;
+
+	    case 60:
+		if (count > 70)
+		{
+		    printf("%d ", *state);
+		    *state = 70; 
+		}
+	    break;
+
+	    case 70:
+		if (count > 80)
+		{
+		    printf("%d ", *state);
+		    *state = 80; 
+		}
+	    break;
+
+	    case 80:
+		if (count > 90)
+		{
+		    printf("%d ", *state);
+		    *state = 90; 
+		}
+	    break;
+
+	    case 90:
+		if (count == 100)
+		{
+		    *state = 100; 
+		    printf("%d.  Done", *state);
+		}
+	    break;
+
+	    default:
+	    break;
+	}
+
+	return 0;
 }

Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?Pine.BSF.4.21.0103271335580.3635-200000>