summaryrefslogtreecommitdiffstats
path: root/sys/kern/vfs_subr.c
diff options
context:
space:
mode:
authordyson <dyson@FreeBSD.org>1996-01-19 04:00:31 +0000
committerdyson <dyson@FreeBSD.org>1996-01-19 04:00:31 +0000
commit8fc8a772af22f6e03233d248fa2dbd9b5c2bdd7d (patch)
tree3c31fd95ea745005a9cd6733db5a16f31bd828a6 /sys/kern/vfs_subr.c
parent6755beedbf0ddaa9e66e91c8e74f620ede6bfad5 (diff)
downloadFreeBSD-src-8fc8a772af22f6e03233d248fa2dbd9b5c2bdd7d.zip
FreeBSD-src-8fc8a772af22f6e03233d248fa2dbd9b5c2bdd7d.tar.gz
Eliminated many redundant vm_map_lookup operations for vm_mmap.
Speed up for vfs_bio -- addition of a routine bqrelse to greatly diminish overhead for merged cache. Efficiency improvement for vfs_cluster. It used to do alot of redundant calls to cluster_rbuild. Correct the ordering for vrele of .text and release of credentials. Use the selective tlb update for 486/586/P6. Numerous fixes to the size of objects allocated for files. Additionally, fixes in the various pagers. Fixes for proper positioning of vnode_pager_setsize in msdosfs and ext2fs. Fixes in the swap pager for exhausted resources. The pageout code will not as readily thrash. Change the page queue flags (PG_ACTIVE, PG_INACTIVE, PG_FREE, PG_CACHE) into page queue indices (PQ_ACTIVE, PQ_INACTIVE, PQ_FREE, PQ_CACHE), thereby improving efficiency of several routines. Eliminate even more unnecessary vm_page_protect operations. Significantly speed up process forks. Make vm_object_page_clean more efficient, thereby eliminating the pause that happens every 30seconds. Make sequential clustered writes B_ASYNC instead of B_DELWRI even in the case of filesystems mounted async. Fix a panic with busy pages when write clustering is done for non-VMIO buffers.
Diffstat (limited to 'sys/kern/vfs_subr.c')
-rw-r--r--sys/kern/vfs_subr.c19
1 files changed, 14 insertions, 5 deletions
diff --git a/sys/kern/vfs_subr.c b/sys/kern/vfs_subr.c
index cd0c7247..7fec92b 100644
--- a/sys/kern/vfs_subr.c
+++ b/sys/kern/vfs_subr.c
@@ -36,7 +36,7 @@
* SUCH DAMAGE.
*
* @(#)vfs_subr.c 8.13 (Berkeley) 4/18/94
- * $Id: vfs_subr.c,v 1.50 1996/01/02 18:13:20 davidg Exp $
+ * $Id: vfs_subr.c,v 1.51 1996/01/04 21:12:26 wollman Exp $
*/
/*
@@ -340,6 +340,7 @@ getnewvnode(tag, mp, vops, vpp)
{
register struct vnode *vp;
+retry:
vp = vnode_free_list.tqh_first;
/*
* we allocate a new vnode if
@@ -360,16 +361,21 @@ getnewvnode(tag, mp, vops, vpp)
numvnodes++;
} else {
TAILQ_REMOVE(&vnode_free_list, vp, v_freelist);
+ if (vp->v_usage > 0) {
+ --vp->v_usage;
+ TAILQ_INSERT_TAIL(&vnode_free_list, vp, v_freelist);
+ goto retry;
+ }
freevnodes--;
- if (vp->v_usecount)
- panic("free vnode isn't");
-
/* see comment on why 0xdeadb is set at end of vgone (below) */
vp->v_freelist.tqe_prev = (struct vnode **) 0xdeadb;
vp->v_lease = NULL;
if (vp->v_type != VBAD)
vgone(vp);
+ if (vp->v_usecount)
+ panic("free vnode isn't");
+
#ifdef DIAGNOSTIC
{
int s;
@@ -392,6 +398,7 @@ getnewvnode(tag, mp, vops, vpp)
vp->v_clen = 0;
vp->v_socket = 0;
vp->v_writecount = 0; /* XXX */
+ vp->v_usage = 0;
}
vp->v_type = VNON;
cache_purge(vp);
@@ -653,7 +660,8 @@ reassignbuf(bp, newvp)
if (!tbp || (tbp->b_lblkno > bp->b_lblkno)) {
bufinsvn(bp, &newvp->v_dirtyblkhd);
} else {
- while (tbp->b_vnbufs.le_next && (tbp->b_vnbufs.le_next->b_lblkno < bp->b_lblkno)) {
+ while (tbp->b_vnbufs.le_next &&
+ (tbp->b_vnbufs.le_next->b_lblkno < bp->b_lblkno)) {
tbp = tbp->b_vnbufs.le_next;
}
LIST_INSERT_AFTER(tbp, bp, b_vnbufs);
@@ -845,6 +853,7 @@ vrele(vp)
if (vp->v_flag & VAGE) {
TAILQ_INSERT_HEAD(&vnode_free_list, vp, v_freelist);
vp->v_flag &= ~VAGE;
+ vp->v_usage = 0;
} else {
TAILQ_INSERT_TAIL(&vnode_free_list, vp, v_freelist);
}
OpenPOWER on IntegriCloud