Skip site navigation (1)Skip section navigation (2)
Date:      Sun, 06 Aug 2000 01:49:49 +1000
From:      Stephen McKay <mckay@thehub.com.au>
To:        freebsd-current@freebsd.org
Cc:        mckay@thehub.com.au
Subject:   Ugly, slow shutdown
Message-ID:  <200008051549.BAA10791@dungeon.home>

next in thread | raw e-mail | index | archive | help
I'm off in a few days for a couple months of tourism in Europe (no, no need
for sympathy!), so I'm dumping these couple ideas on you and running.

I think shutdown time has gotten uglier and slower than it needs to be.
I want to apply these patches (well, at least the first one) before I escape
radar range.  Your job is to not object much. :-)

Patch 1 replaces:

  Waiting (max 60 seconds) for system process `bufdaemon' to stop...stopped

with

  Stopping bufdaemon

Also:

  syncing disks... 10 10 3
  done

returns to the traditional

  syncing disks... 10 10 3 done

Patch 2 is smaller and possibly controversial.  Normally bufdaemon and
syncer are sleeping when they are told to suspend.  This delays shutdown
by a few boring seconds.  With this patch, it is zippier.  I expect people
to complain about this shortcut, but every sleeping process should expect
to be woken for no reason at all.  Basic kernel premise.

I've been running these patches on a 4.x machine for a while now.  No
problems except I am now surprised by the slow and ugly shutdown of
unpatched machines. :-)

I apologise that I've not tested these against -current.  That's the bit
that I've skipped because I'm out of time.  There should be no difference
between 4.x and -current in this area though.  These patches will apply
cleanly against both.

Cheers,

Stephen.

Patch 1:
Index: kern_shutdown.c
===================================================================
RCS file: /cvs/src/sys/kern/kern_shutdown.c,v
retrieving revision 1.76
diff -u -r1.76 kern_shutdown.c
--- kern_shutdown.c	2000/07/04 11:25:22	1.76
+++ kern_shutdown.c	2000/07/06 15:02:21
@@ -247,7 +247,6 @@
 			sync(&proc0, NULL);
 			DELAY(50000 * iter);
 		}
-		printf("\n");
 		/*
 		 * Count only busy local buffers to prevent forcing 
 		 * a fsck if we're just a client of a wedged NFS server
@@ -261,6 +260,8 @@
 					    bp->b_vp->v_mount, mnt_list);
 					continue;
 				}
+				if (nbusy == 0)
+					printf("\n");
 				nbusy++;
 #if defined(SHOW_BUSYBUFS) || defined(DIAGNOSTIC)
 				printf(
@@ -593,12 +594,11 @@
 		return;
 
 	p = (struct proc *)arg;
-	printf("Waiting (max %d seconds) for system process `%s' to stop...",
-	    kproc_shutdown_wait, p->p_comm);
+	printf("Stopping %s", p->p_comm);
 	error = suspend_kproc(p, kproc_shutdown_wait * hz);
 
 	if (error == EWOULDBLOCK)
-		printf("timed out\n");
+		printf(": timed out\n");
 	else
-		printf("stopped\n");
+		printf("\n");
 }


Patch 2:
Index: kern_kthread.c
===================================================================
RCS file: /cvs/src/sys/kern/kern_kthread.c,v
retrieving revision 1.5
diff -u -r1.5 kern_kthread.c
--- kern_kthread.c	2000/01/10 08:00:58	1.5
+++ kern_kthread.c	2000/08/05 15:32:06
@@ -116,6 +116,12 @@
 	 */
 	if ((p->p_flag & P_SYSTEM) == 0)
 		return (EINVAL);
+	/*
+	 * The target process is probably just snoozing.  Wake it up so
+	 * that it will notice that it should suspend itself.
+	 */
+	if (p->p_wchan != NULL)
+		wakeup(p->p_wchan);
 	SIGADDSET(p->p_siglist, SIGSTOP);
 	return tsleep((caddr_t)&p->p_siglist, PPAUSE, "suspkp", timo);
 }

TheEnd


To Unsubscribe: send mail to majordomo@FreeBSD.org
with "unsubscribe freebsd-current" in the body of the message




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