diff options
Diffstat (limited to 'sys/kern')
-rw-r--r-- | sys/kern/vfs_bio.c | 40 |
1 files changed, 33 insertions, 7 deletions
diff --git a/sys/kern/vfs_bio.c b/sys/kern/vfs_bio.c index 045bd969ee3..f2821c6b233 100644 --- a/sys/kern/vfs_bio.c +++ b/sys/kern/vfs_bio.c @@ -1,4 +1,4 @@ -/* $OpenBSD: vfs_bio.c,v 1.119 2009/08/02 16:28:40 beck Exp $ */ +/* $OpenBSD: vfs_bio.c,v 1.120 2009/08/08 15:04:43 beck Exp $ */ /* $NetBSD: vfs_bio.c,v 1.44 1996/06/11 11:15:36 pk Exp $ */ /* @@ -112,6 +112,7 @@ long maxcleanpages; long backoffpages; /* backoff counter for page allocations */ long buflowpages; /* bufpages low water mark */ long bufhighpages; /* bufpages high water mark */ +long bufbackpages; /* number of pages we back off when asked to shrink */ /* XXX - should be defined here. */ extern int bufcachepercent; @@ -213,6 +214,14 @@ bufinit(void) */ buflowpages = physmem * 10 / 100; + /* + * set bufbackpages to 100 pages, or 10 percent of the low water mark + * if we don't have that many pages. + */ + + bufbackpages = buflowpages * 10 / 100; + if (bufbackpages > 100) + bufbackpages = 100; if (bufkvm == 0) bufkvm = (VM_MAX_KERNEL_ADDRESS - VM_MIN_KERNEL_ADDRESS) / 10; @@ -341,13 +350,13 @@ bufbackoff() if (bufpages <= buflowpages) return(-1); - if (bufpages - BACKPAGES >= buflowpages) - d = BACKPAGES; + if (bufpages - bufbackpages >= buflowpages) + d = bufbackpages; else d = bufpages - buflowpages; - backoffpages = BACKPAGES; + backoffpages = bufbackpages; bufadjust(bufpages - d); - backoffpages = BACKPAGES; + backoffpages = bufbackpages; return(0); } @@ -963,8 +972,8 @@ buf_get(struct vnode *vp, daddr64_t blkno, size_t size) */ if ((backoffpages == 0) && (bufpages < bufhighpages)) { if ( gcount == 0 ) { - bufadjust(bufpages + BACKPAGES); - gcount += BACKPAGES; + bufadjust(bufpages + bufbackpages); + gcount += bufbackpages; } else gcount--; } @@ -1220,3 +1229,20 @@ biodone(struct buf *bp) } } } + +#ifdef DDB +void bcstats_print(int (*)(const char *, ...)); +/* + * bcstats_print: ddb hook to print interesting buffer cache counters + */ +void +bcstats_print(int (*pr)(const char *, ...)) +{ + (*pr)("Current Buffer Cache status:\n"); + (*pr)("numbufs %d freebufs %d\n", bcstats.numbufs, bcstats.freebufs); + (*pr)("bufpages %d freepages %d dirtypages %d\n", bcstats.numbufpages, + bcstats.numfreepages, bcstats.numdirtypages); + (*pr)("pendingreads %d, pendingwrites %d\n", + bcstats.pendingreads, bcstats.pendingwrites); +} +#endif |