summaryrefslogtreecommitdiff
path: root/sys/kern/vfs_subr.c
diff options
context:
space:
mode:
Diffstat (limited to 'sys/kern/vfs_subr.c')
-rw-r--r--sys/kern/vfs_subr.c42
1 files changed, 36 insertions, 6 deletions
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);
}