summaryrefslogtreecommitdiffstats
path: root/sys/kern/kern_shutdown.c
diff options
context:
space:
mode:
authorjasone <jasone@FreeBSD.org>2000-09-10 23:06:50 +0000
committerjasone <jasone@FreeBSD.org>2000-09-10 23:06:50 +0000
commit7a63f3f75c0fa73d989787cc3df1adfdc597b86f (patch)
tree54f8d5b36d8547747ede80b0f31b0771b27e342f /sys/kern/kern_shutdown.c
parent4b57274ae448998ee3e93a7657d5fa17e6496036 (diff)
downloadFreeBSD-src-7a63f3f75c0fa73d989787cc3df1adfdc597b86f.zip
FreeBSD-src-7a63f3f75c0fa73d989787cc3df1adfdc597b86f.tar.gz
Allow interrupt threads to run during shutdown. This should fix the
"dirty buffers during shutdown" problem introduced by the SMPng commit. Submitted by: tegge, cg
Diffstat (limited to 'sys/kern/kern_shutdown.c')
-rw-r--r--sys/kern/kern_shutdown.c17
1 files changed, 15 insertions, 2 deletions
diff --git a/sys/kern/kern_shutdown.c b/sys/kern/kern_shutdown.c
index 8a6ccd8..534791d 100644
--- a/sys/kern/kern_shutdown.c
+++ b/sys/kern/kern_shutdown.c
@@ -219,7 +219,8 @@ boot(int howto)
*/
if (!cold && (howto & RB_NOSYNC) == 0 && waittime < 0) {
register struct buf *bp;
- int iter, nbusy;
+ int iter, nbusy, pbusy;
+ int subiter;
waittime = 0;
printf("\nsyncing disks... ");
@@ -231,7 +232,7 @@ boot(int howto)
* written will be remarked as dirty until other
* buffers are written.
*/
- for (iter = 0; iter < 20; iter++) {
+ for (iter = pbusy = 0; iter < 20; iter++) {
nbusy = 0;
for (bp = &buf[nbuf]; --bp >= buf; ) {
if ((bp->b_flags & B_INVAL) == 0 &&
@@ -246,7 +247,19 @@ boot(int howto)
if (nbusy == 0)
break;
printf("%d ", nbusy);
+ if (nbusy < pbusy)
+ iter = 0;
+ pbusy = nbusy;
sync(&proc0, NULL);
+ if (curproc != NULL) {
+ for (subiter = 0; subiter < 50 * iter; subiter++) {
+ mtx_enter(&sched_lock, MTX_SPIN);
+ setrunqueue(curproc);
+ mi_switch(); /* Allow interrupt threads to run */
+ mtx_exit(&sched_lock, MTX_SPIN);
+ DELAY(1000);
+ }
+ } else
DELAY(50000 * iter);
}
printf("\n");
OpenPOWER on IntegriCloud