summaryrefslogtreecommitdiff
path: root/sys/kern
diff options
context:
space:
mode:
authorKirk McKusick <mckusick@FreeBSD.org>1999-06-15 23:37:29 +0000
committerKirk McKusick <mckusick@FreeBSD.org>1999-06-15 23:37:29 +0000
commite4ab40bcb6812d9cd659847e86cb753565ea452c (patch)
treeb4b29849dde9c900efe7a91ab93cc25ad75bc579 /sys/kern
parente672bf9cd69073d5b291156d26d1d7a9f0e13bb6 (diff)
Notes
Diffstat (limited to 'sys/kern')
-rw-r--r--sys/kern/vfs_bio.c5
-rw-r--r--sys/kern/vfs_export.c42
-rw-r--r--sys/kern/vfs_subr.c42
3 files changed, 74 insertions, 15 deletions
diff --git a/sys/kern/vfs_bio.c b/sys/kern/vfs_bio.c
index 59dd7306c4db..e15e396fe7ab 100644
--- a/sys/kern/vfs_bio.c
+++ b/sys/kern/vfs_bio.c
@@ -11,7 +11,7 @@
* 2. Absolutely no warranty of function or purpose is made by the author
* John S. Dyson.
*
- * $Id: vfs_bio.c,v 1.210 1999/05/06 20:00:26 phk Exp $
+ * $Id: vfs_bio.c,v 1.211 1999/05/12 22:30:50 peter Exp $
*/
/*
@@ -1475,8 +1475,7 @@ dosleep:
else
flags = VFS_BIO_NEED_ANY;
- if (rushjob < syncdelay / 2)
- ++rushjob;
+ (void) speedup_syncer();
needsbuffer |= flags;
while (needsbuffer & flags) {
if (tsleep(&needsbuffer, (PRIBIO + 4) | slpflag,
diff --git a/sys/kern/vfs_export.c b/sys/kern/vfs_export.c
index b15430079c80..982850f4430b 100644
--- a/sys/kern/vfs_export.c
+++ b/sys/kern/vfs_export.c
@@ -36,7 +36,7 @@
* SUCH DAMAGE.
*
* @(#)vfs_subr.c 8.31 (Berkeley) 5/26/95
- * $Id: vfs_subr.c,v 1.199 1999/05/24 00:34:10 jb Exp $
+ * $Id: vfs_subr.c,v 1.200 1999/05/31 11:27:44 phk Exp $
*/
/*
@@ -125,8 +125,16 @@ static vm_zone_t vnode_zone;
*/
#define SYNCER_MAXDELAY 32
static int syncer_maxdelay = SYNCER_MAXDELAY; /* maximum delay time */
-time_t syncdelay = 30;
-int rushjob; /* number of slots to run ASAP */
+time_t syncdelay = 30; /* max time to delay syncing data */
+time_t filedelay = 30; /* time to delay syncing files */
+SYSCTL_INT(_kern, OID_AUTO, filedelay, CTLFLAG_RW, &filedelay, 0, "");
+time_t dirdelay = 15; /* time to delay syncing directories */
+SYSCTL_INT(_kern, OID_AUTO, dirdelay, CTLFLAG_RW, &dirdelay, 0, "");
+time_t metadelay = 10; /* time to delay syncing metadata */
+SYSCTL_INT(_kern, OID_AUTO, metadelay, CTLFLAG_RW, &metadelay, 0, "");
+static int rushjob; /* number of slots to run ASAP */
+static int stat_rush_requests; /* number of times I/O speeded up */
+SYSCTL_INT(_debug, OID_AUTO, rush_requests, CTLFLAG_RW, &stat_rush_requests, 0, "");
static int syncer_delayno = 0;
static long syncer_mask;
@@ -999,6 +1007,28 @@ sched_sync(void)
}
/*
+ * Request the syncer daemon to speed up its work.
+ * We never push it to speed up more than half of its
+ * normal turn time, otherwise it could take over the cpu.
+ */
+int
+speedup_syncer()
+{
+ int s;
+
+ s = splhigh();
+ if (updateproc->p_wchan == &lbolt)
+ setrunnable(updateproc);
+ splx(s);
+ if (rushjob < syncdelay / 2) {
+ rushjob += 1;
+ stat_rush_requests += 1;
+ return (1);
+ }
+ return(0);
+}
+
+/*
* Associate a p-buffer with a vnode.
*
* Also sets B_PAGING flag to indicate that vnode is not fully associated
@@ -1116,16 +1146,16 @@ reassignbuf(bp, newvp)
if ((newvp->v_flag & VONWORKLST) == 0) {
switch (newvp->v_type) {
case VDIR:
- delay = syncdelay / 2;
+ delay = dirdelay;
break;
case VBLK:
if (newvp->v_specmountpoint != NULL) {
- delay = syncdelay / 3;
+ delay = metadelay;
break;
}
/* fall through */
default:
- delay = syncdelay;
+ delay = filedelay;
}
vn_syncer_add_to_worklist(newvp, delay);
}
diff --git a/sys/kern/vfs_subr.c b/sys/kern/vfs_subr.c
index b15430079c80..982850f4430b 100644
--- a/sys/kern/vfs_subr.c
+++ b/sys/kern/vfs_subr.c
@@ -36,7 +36,7 @@
* SUCH DAMAGE.
*
* @(#)vfs_subr.c 8.31 (Berkeley) 5/26/95
- * $Id: vfs_subr.c,v 1.199 1999/05/24 00:34:10 jb Exp $
+ * $Id: vfs_subr.c,v 1.200 1999/05/31 11:27:44 phk Exp $
*/
/*
@@ -125,8 +125,16 @@ static vm_zone_t vnode_zone;
*/
#define SYNCER_MAXDELAY 32
static int syncer_maxdelay = SYNCER_MAXDELAY; /* maximum delay time */
-time_t syncdelay = 30;
-int rushjob; /* number of slots to run ASAP */
+time_t syncdelay = 30; /* max time to delay syncing data */
+time_t filedelay = 30; /* time to delay syncing files */
+SYSCTL_INT(_kern, OID_AUTO, filedelay, CTLFLAG_RW, &filedelay, 0, "");
+time_t dirdelay = 15; /* time to delay syncing directories */
+SYSCTL_INT(_kern, OID_AUTO, dirdelay, CTLFLAG_RW, &dirdelay, 0, "");
+time_t metadelay = 10; /* time to delay syncing metadata */
+SYSCTL_INT(_kern, OID_AUTO, metadelay, CTLFLAG_RW, &metadelay, 0, "");
+static int rushjob; /* number of slots to run ASAP */
+static int stat_rush_requests; /* number of times I/O speeded up */
+SYSCTL_INT(_debug, OID_AUTO, rush_requests, CTLFLAG_RW, &stat_rush_requests, 0, "");
static int syncer_delayno = 0;
static long syncer_mask;
@@ -999,6 +1007,28 @@ sched_sync(void)
}
/*
+ * Request the syncer daemon to speed up its work.
+ * We never push it to speed up more than half of its
+ * normal turn time, otherwise it could take over the cpu.
+ */
+int
+speedup_syncer()
+{
+ int s;
+
+ s = splhigh();
+ if (updateproc->p_wchan == &lbolt)
+ setrunnable(updateproc);
+ splx(s);
+ if (rushjob < syncdelay / 2) {
+ rushjob += 1;
+ stat_rush_requests += 1;
+ return (1);
+ }
+ return(0);
+}
+
+/*
* Associate a p-buffer with a vnode.
*
* Also sets B_PAGING flag to indicate that vnode is not fully associated
@@ -1116,16 +1146,16 @@ reassignbuf(bp, newvp)
if ((newvp->v_flag & VONWORKLST) == 0) {
switch (newvp->v_type) {
case VDIR:
- delay = syncdelay / 2;
+ delay = dirdelay;
break;
case VBLK:
if (newvp->v_specmountpoint != NULL) {
- delay = syncdelay / 3;
+ delay = metadelay;
break;
}
/* fall through */
default:
- delay = syncdelay;
+ delay = filedelay;
}
vn_syncer_add_to_worklist(newvp, delay);
}