diff options
| author | Kirk McKusick <mckusick@FreeBSD.org> | 1999-06-15 23:37:29 +0000 |
|---|---|---|
| committer | Kirk McKusick <mckusick@FreeBSD.org> | 1999-06-15 23:37:29 +0000 |
| commit | e4ab40bcb6812d9cd659847e86cb753565ea452c (patch) | |
| tree | b4b29849dde9c900efe7a91ab93cc25ad75bc579 /sys/kern | |
| parent | e672bf9cd69073d5b291156d26d1d7a9f0e13bb6 (diff) | |
Notes
Diffstat (limited to 'sys/kern')
| -rw-r--r-- | sys/kern/vfs_bio.c | 5 | ||||
| -rw-r--r-- | sys/kern/vfs_export.c | 42 | ||||
| -rw-r--r-- | sys/kern/vfs_subr.c | 42 |
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); } |
