From owner-freebsd-current Wed Apr 30 09:51:47 1997 Return-Path: Received: (from root@localhost) by hub.freebsd.org (8.8.5/8.8.5) id JAA05756 for current-outgoing; Wed, 30 Apr 1997 09:51:47 -0700 (PDT) Received: from critter.dk.tfs.com (phk.cybercity.dk [195.8.129.17]) by hub.freebsd.org (8.8.5/8.8.5) with ESMTP id JAA05745; Wed, 30 Apr 1997 09:51:38 -0700 (PDT) Received: from critter (localhost [127.0.0.1]) by critter.dk.tfs.com (8.8.5/8.8.5) with ESMTP id SAA00209; Wed, 30 Apr 1997 18:31:02 +0200 (CEST) To: Doug Rabson cc: Poul-Henning Kamp , current@freebsd.org From: Poul-Henning Kamp Subject: Re: vnode->v_usage In-reply-to: Your message of "Sun, 27 Apr 1997 14:36:36 BST." Date: Wed, 30 Apr 1997 18:31:02 +0200 Message-ID: <207.862417862@critter> Sender: owner-current@freebsd.org X-Loop: FreeBSD.org Precedence: bulk In message , Dou g Rabson writes: >On Sun, 27 Apr 1997, Poul-Henning Kamp wrote: >> >> Unless somebody convinces me of the utility of this field, I will remove >> it from the vnodes. >> >I think it is intended to be used to keep frequently used vnodes from >being recycled by getnewvnode. Well, I've done it. Here is a patch that implements LRU for name-cache hits on the vnode freelist. I doubt that it has any performance impact, but it makes the vnode 4 bytes smaller, which is a good thing. Please test and report. Recompile or rename your LKMs before trying this! Poul-Henning Index: sys/vnode.h =================================================================== RCS file: /home/ncvs/src/sys/sys/vnode.h,v retrieving revision 1.43 diff -u -r1.43 vnode.h --- vnode.h 1997/04/04 17:43:32 1.43 +++ vnode.h 1997/04/30 16:12:08 @@ -104,7 +104,6 @@ daddr_t v_cstart; /* start block of cluster */ daddr_t v_lasta; /* last allocation */ int v_clen; /* length of current cluster */ - int v_usage; /* Vnode usage counter */ struct vm_object *v_object; /* Place to store VM object */ struct simplelock v_interlock; /* lock on usecount and flag */ struct lock *v_vnlock; /* used for non-locking fs's */ @@ -506,6 +505,7 @@ checkalias __P((struct vnode *vp, dev_t nvp_rdev, struct mount *mp)); void vput __P((struct vnode *vp)); void vrele __P((struct vnode *vp)); +void vtouch __P((struct vnode *vp)); #endif /* KERNEL */ #endif /* !_SYS_VNODE_H_ */ Index: kern/vfs_cache.c =================================================================== RCS file: /home/ncvs/src/sys/kern/vfs_cache.c,v retrieving revision 1.24 diff -u -r1.24 vfs_cache.c --- vfs_cache.c 1997/03/08 15:22:14 1.24 +++ vfs_cache.c 1997/04/30 16:15:56 @@ -187,9 +187,9 @@ if (ncp->nc_vp) { nchstats.ncs_goodhits++; TOUCH(ncp); + if (!ncp->nc_vp->v_usecount) /* on the freelist, LRU it */ + vtouch(ncp->nc_vp); *vpp = ncp->nc_vp; - if ((*vpp)->v_usage < MAXVNODEUSE) - (*vpp)->v_usage++; return (-1); } @@ -263,9 +263,9 @@ */ ncp->nc_vp = vp; if (vp) { + if (!vp->v_usecount) /* on the freelist, LRU it */ + vtouch(vp); ncp->nc_vpid = vp->v_id; - if (vp->v_usage < MAXVNODEUSE) - ++vp->v_usage; } else ncp->nc_vpid = cnp->cn_flags & ISWHITEOUT; ncp->nc_dvp = dvp; Index: kern/vfs_subr.c =================================================================== RCS file: /home/ncvs/src/sys/kern/vfs_subr.c,v retrieving revision 1.83 diff -u -r1.83 vfs_subr.c --- vfs_subr.c 1997/04/25 06:47:12 1.83 +++ vfs_subr.c 1997/04/30 16:13:35 @@ -382,12 +382,6 @@ if (vp->v_usecount) panic("free vnode isn't"); TAILQ_REMOVE(&vnode_free_list, vp, v_freelist); - if (vp->v_usage > 0) { - simple_unlock(&vp->v_interlock); - --vp->v_usage; - TAILQ_INSERT_TAIL(&vnode_free_list, vp, v_freelist); - goto retry; - } freevnodes--; /* see comment on why 0xdeadb is set at end of vgone (below) */ @@ -420,7 +414,6 @@ vp->v_clen = 0; vp->v_socket = 0; vp->v_writecount = 0; /* XXX */ - vp->v_usage = 0; } vp->v_type = VNON; cache_purge(vp); @@ -1119,7 +1112,6 @@ simple_lock(&vnode_free_list_slock); if (vp->v_flag & VAGE) { vp->v_flag &= ~VAGE; - vp->v_usage = 0; if(vp->v_tag != VT_TFS) TAILQ_INSERT_HEAD(&vnode_free_list, vp, v_freelist); } else { @@ -2146,4 +2138,16 @@ retn: return error; +} + +void +vtouch(vp) + struct vnode *vp; +{ + if (vp->v_usecount) + return; + simple_lock(&vnode_free_list_slock); + TAILQ_REMOVE(&vnode_free_list, vp, v_freelist); + TAILQ_INSERT_TAIL(&vnode_free_list, vp, v_freelist); + simple_unlock(&vnode_free_list_slock); } -- Poul-Henning Kamp | phk@FreeBSD.ORG FreeBSD Core-team. http://www.freebsd.org/~phk | phk@login.dknet.dk Private mailbox. whois: [PHK] | phk@tfs.com TRW Financial Systems, Inc. Power and ignorance is a disgusting cocktail.