Source-Changes-HG archive

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]

[src/trunk]: src Vnode API cleanup pass 1.



details:   https://anonhg.NetBSD.org/src/rev/ca113b7becc3
branches:  trunk
changeset: 790980:ca113b7becc3
user:      hannken <hannken%NetBSD.org@localhost>
date:      Tue Oct 29 09:53:51 2013 +0000

description:
Vnode API cleanup pass 1.

- Make these defines and functions private to vfs_vnode.c:

  VC_MASK, VC_LOCK, DOCLOSE, VI_IANCTREDO and VI_INACTNOW
  vclean() and vrelel()

- Remove the long time unused lwp argument from vrecycle().

- Remove vtryget(), it is responsible for ugly hacks and doesn't
  look that effective.

Presented on tech-kern.

Welcome to 6.99.25

diffstat:

 external/cddl/osnet/sys/sys/vnode.h |   3 +-
 share/man/man9/vnode.9              |   8 +-
 sys/kern/uipc_usrreq.c              |   7 +-
 sys/kern/vfs_cache.c                |  91 +++++++++++++++---------------------
 sys/kern/vfs_mount.c                |  42 ++++------------
 sys/kern/vfs_vnode.c                |  70 +++++++++++++--------------
 sys/miscfs/procfs/procfs_subr.c     |  21 ++++----
 sys/sys/param.h                     |   4 +-
 sys/sys/vnode.h                     |  16 +----
 sys/ufs/ext2fs/ext2fs_vfsops.c      |   6 +-
 sys/ufs/ffs/ffs_vfsops.c            |   6 +-
 sys/ufs/lfs/lfs_segment.c           |  15 ++---
 sys/ufs/lfs/lfs_syscalls.c          |   8 +-
 13 files changed, 125 insertions(+), 172 deletions(-)

diffs (truncated from 687 to 300 lines):

diff -r 1c3221ad53a9 -r ca113b7becc3 external/cddl/osnet/sys/sys/vnode.h
--- a/external/cddl/osnet/sys/sys/vnode.h       Tue Oct 29 09:40:43 2013 +0000
+++ b/external/cddl/osnet/sys/sys/vnode.h       Tue Oct 29 09:53:51 2013 +0000
@@ -1,5 +1,5 @@
 
-/*     $NetBSD: vnode.h,v 1.11 2013/09/23 20:44:24 christos Exp $      */
+/*     $NetBSD: vnode.h,v 1.12 2013/10/29 09:53:51 hannken Exp $       */
 
 /*
  * CDDL HEADER START
@@ -686,7 +686,6 @@
 
 #define VN_RELE_ASYNC(vp, taskq)       vrele_async((vp))
 #define vn_exists(a)   do { } while(0)
-#define vn_reinit(a)   vclean((a), 0)
 
 /*
  * Flags for VOP_LOOKUP
diff -r 1c3221ad53a9 -r ca113b7becc3 share/man/man9/vnode.9
--- a/share/man/man9/vnode.9    Tue Oct 29 09:40:43 2013 +0000
+++ b/share/man/man9/vnode.9    Tue Oct 29 09:53:51 2013 +0000
@@ -1,4 +1,4 @@
-.\"     $NetBSD: vnode.9,v 1.56 2012/02/08 09:32:47 wiz Exp $
+.\"     $NetBSD: vnode.9,v 1.57 2013/10/29 09:53:51 hannken Exp $
 .\"
 .\" Copyright (c) 2001, 2005, 2006 The NetBSD Foundation, Inc.
 .\" All rights reserved.
@@ -27,7 +27,7 @@
 .\" ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
 .\" POSSIBILITY OF SUCH DAMAGE.
 .\"
-.Dd February 8, 2012
+.Dd October 29, 2013
 .Dt VNODE 9
 .Os
 .Sh NAME
@@ -79,7 +79,7 @@
 .Ft void
 .Fn ungetnewvnode "struct vnode *vp"
 .Ft int
-.Fn vrecycle "struct vnode *vp" "struct simplelock *inter_lkp" "struct lwp *l"
+.Fn vrecycle "struct vnode *vp" "struct simplelock *inter_lkp"
 .Ft void
 .Fn vgone "struct vnode *vp"
 .Ft void
@@ -617,7 +617,7 @@
 .Xr VFS_VGET 9
 which may need to push back a vnode in case of a locking race
 condition.
-.It Fn vrecycle "vp" "inter_lkp" "l"
+.It Fn vrecycle "vp" "inter_lkp"
 Recycle the unused vnode
 .Fa vp
 to the front of the freelist.
diff -r 1c3221ad53a9 -r ca113b7becc3 sys/kern/uipc_usrreq.c
--- a/sys/kern/uipc_usrreq.c    Tue Oct 29 09:40:43 2013 +0000
+++ b/sys/kern/uipc_usrreq.c    Tue Oct 29 09:53:51 2013 +0000
@@ -1,4 +1,4 @@
-/*     $NetBSD: uipc_usrreq.c,v 1.147 2013/10/25 19:55:22 martin Exp $ */
+/*     $NetBSD: uipc_usrreq.c,v 1.148 2013/10/29 09:53:51 hannken Exp $        */
 
 /*-
  * Copyright (c) 1998, 2000, 2004, 2008, 2009 The NetBSD Foundation, Inc.
@@ -96,7 +96,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: uipc_usrreq.c,v 1.147 2013/10/25 19:55:22 martin Exp $");
+__KERNEL_RCSID(0, "$NetBSD: uipc_usrreq.c,v 1.148 2013/10/29 09:53:51 hannken Exp $");
 
 #include <sys/param.h>
 #include <sys/systm.h>
@@ -851,7 +851,8 @@
                /* XXXAD racy */
                mutex_enter(vp->v_interlock);
                vp->v_socket = NULL;
-               vrelel(vp, 0);
+               mutex_exit(vp->v_interlock);
+               vrele(vp);
                solock(so);
                unp->unp_vnode = NULL;
        }
diff -r 1c3221ad53a9 -r ca113b7becc3 sys/kern/vfs_cache.c
--- a/sys/kern/vfs_cache.c      Tue Oct 29 09:40:43 2013 +0000
+++ b/sys/kern/vfs_cache.c      Tue Oct 29 09:53:51 2013 +0000
@@ -1,4 +1,4 @@
-/*     $NetBSD: vfs_cache.c,v 1.91 2012/11/05 17:27:39 dholland Exp $  */
+/*     $NetBSD: vfs_cache.c,v 1.92 2013/10/29 09:53:51 hannken Exp $   */
 
 /*-
  * Copyright (c) 2008 The NetBSD Foundation, Inc.
@@ -58,7 +58,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: vfs_cache.c,v 1.91 2012/11/05 17:27:39 dholland Exp $");
+__KERNEL_RCSID(0, "$NetBSD: vfs_cache.c,v 1.92 2013/10/29 09:53:51 hannken Exp $");
 
 #include "opt_ddb.h"
 #include "opt_revcache.h"
@@ -442,24 +442,19 @@
        }
 
        vp = ncp->nc_vp;
-       if (vtryget(vp)) {
-               mutex_exit(&ncp->nc_lock);
-               mutex_exit(&cpup->cpu_lock);
-       } else {
-               mutex_enter(vp->v_interlock);
-               mutex_exit(&ncp->nc_lock);
-               mutex_exit(&cpup->cpu_lock);
-               error = vget(vp, LK_NOWAIT);
-               if (error) {
-                       KASSERT(error == EBUSY);
-                       /*
-                        * This vnode is being cleaned out.
-                        * XXX badhits?
-                        */
-                       COUNT(cpup->cpu_stats, ncs_falsehits);
-                       /* found nothing */
-                       return 0;
-               }
+       mutex_enter(vp->v_interlock);
+       mutex_exit(&ncp->nc_lock);
+       mutex_exit(&cpup->cpu_lock);
+       error = vget(vp, LK_NOWAIT);
+       if (error) {
+               KASSERT(error == EBUSY);
+               /*
+                * This vnode is being cleaned out.
+                * XXX badhits?
+                */
+               COUNT(cpup->cpu_stats, ncs_falsehits);
+               /* found nothing */
+               return 0;
        }
 
 #ifdef DEBUG
@@ -552,24 +547,19 @@
                /* found negative entry; vn is already null from above */
                return 1;
        }
-       if (vtryget(vp)) {
-               mutex_exit(&ncp->nc_lock);
-               mutex_exit(&cpup->cpu_lock);
-       } else {
-               mutex_enter(vp->v_interlock);
-               mutex_exit(&ncp->nc_lock);
-               mutex_exit(&cpup->cpu_lock);
-               error = vget(vp, LK_NOWAIT);
-               if (error) {
-                       KASSERT(error == EBUSY);
-                       /*
-                        * This vnode is being cleaned out.
-                        * XXX badhits?
-                        */
-                       COUNT(cpup->cpu_stats, ncs_falsehits);
-                       /* found nothing */
-                       return 0;
-               }
+       mutex_enter(vp->v_interlock);
+       mutex_exit(&ncp->nc_lock);
+       mutex_exit(&cpup->cpu_lock);
+       error = vget(vp, LK_NOWAIT);
+       if (error) {
+               KASSERT(error == EBUSY);
+               /*
+                * This vnode is being cleaned out.
+                * XXX badhits?
+                */
+               COUNT(cpup->cpu_stats, ncs_falsehits);
+               /* found nothing */
+               return 0;
        }
 
        /* Unlocked, but only for stats. */
@@ -639,21 +629,16 @@
                                *bpp = bp;
                        }
 
-                       if (vtryget(dvp)) {
-                               mutex_exit(&ncp->nc_lock); 
-                               mutex_exit(namecache_lock);
-                       } else {
-                               mutex_enter(dvp->v_interlock);
-                               mutex_exit(&ncp->nc_lock); 
-                               mutex_exit(namecache_lock);
-                               error = vget(dvp, LK_NOWAIT);
-                               if (error) {
-                                       KASSERT(error == EBUSY);
-                                       if (bufp)
-                                               (*bpp) += nlen;
-                                       *dvpp = NULL;
-                                       return -1;
-                               }
+                       mutex_enter(dvp->v_interlock);
+                       mutex_exit(&ncp->nc_lock); 
+                       mutex_exit(namecache_lock);
+                       error = vget(dvp, LK_NOWAIT);
+                       if (error) {
+                               KASSERT(error == EBUSY);
+                               if (bufp)
+                                       (*bpp) += nlen;
+                               *dvpp = NULL;
+                               return -1;
                        }
                        *dvpp = dvp;
                        return (0);
diff -r 1c3221ad53a9 -r ca113b7becc3 sys/kern/vfs_mount.c
--- a/sys/kern/vfs_mount.c      Tue Oct 29 09:40:43 2013 +0000
+++ b/sys/kern/vfs_mount.c      Tue Oct 29 09:53:51 2013 +0000
@@ -1,4 +1,4 @@
-/*     $NetBSD: vfs_mount.c,v 1.22 2013/10/25 20:37:17 martin Exp $    */
+/*     $NetBSD: vfs_mount.c,v 1.23 2013/10/29 09:53:51 hannken Exp $   */
 
 /*-
  * Copyright (c) 1997-2011 The NetBSD Foundation, Inc.
@@ -67,7 +67,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: vfs_mount.c,v 1.22 2013/10/25 20:37:17 martin Exp $");
+__KERNEL_RCSID(0, "$NetBSD: vfs_mount.c,v 1.23 2013/10/29 09:53:51 hannken Exp $");
 
 #include <sys/param.h>
 #include <sys/kernel.h>
@@ -465,6 +465,13 @@
                 */
                if (vp == skipvp)
                        continue;
+               /*
+                * First try to recycle the vnode.
+                */
+               if (vrecycle(vp, &mntvnode_lock)) {
+                       mutex_enter(&mntvnode_lock);
+                       continue;
+               }
                mutex_enter(vp->v_interlock);
                /*
                 * Ignore clean but still referenced vnodes.
@@ -490,19 +497,6 @@
                        continue;
                }
                /*
-                * With v_usecount == 0, all we need to do is clear
-                * out the vnode data structures and we are done.
-                */
-               if (vp->v_usecount == 0) {
-                       mutex_exit(&mntvnode_lock);
-                       vremfree(vp);
-                       vp->v_usecount = 1;
-                       vclean(vp, DOCLOSE);
-                       vrelel(vp, 0);
-                       mutex_enter(&mntvnode_lock);
-                       continue;
-               }
-               /*
                 * If FORCECLOSE is set, forcibly close the vnode.
                 * For block or character devices, revert to an
                 * anonymous device.  For all other files, just
@@ -510,22 +504,8 @@
                 */
                if (flags & FORCECLOSE) {
                        mutex_exit(&mntvnode_lock);
-                       atomic_inc_uint(&vp->v_usecount);
-                       if (vp->v_type != VBLK && vp->v_type != VCHR) {
-                               vclean(vp, DOCLOSE);
-                               vrelel(vp, 0);
-                       } else {
-                               vclean(vp, 0);
-                               vp->v_op = spec_vnodeop_p; /* XXXSMP */
-                               mutex_exit(vp->v_interlock);
-                               /*
-                                * The vnode isn't clean, but still resides
-                                * on the mount list.  Remove it. XXX This
-                                * is a bit dodgy.
-                                */
-                               vfs_insmntque(vp, NULL);
-                               vrele(vp);
-                       }
+                       if (vget(vp, 0) == 0)
+                               vgone(vp);
                        mutex_enter(&mntvnode_lock);
                        continue;
                }
diff -r 1c3221ad53a9 -r ca113b7becc3 sys/kern/vfs_vnode.c
--- a/sys/kern/vfs_vnode.c      Tue Oct 29 09:40:43 2013 +0000
+++ b/sys/kern/vfs_vnode.c      Tue Oct 29 09:53:51 2013 +0000
@@ -1,4 +1,4 @@
-/*     $NetBSD: vfs_vnode.c,v 1.22 2013/10/25 20:39:40 martin Exp $    */
+/*     $NetBSD: vfs_vnode.c,v 1.23 2013/10/29 09:53:51 hannken Exp $   */
 
 /*-
  * Copyright (c) 1997-2011 The NetBSD Foundation, Inc.
@@ -126,7 +126,9 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: vfs_vnode.c,v 1.22 2013/10/25 20:39:40 martin Exp $");
+__KERNEL_RCSID(0, "$NetBSD: vfs_vnode.c,v 1.23 2013/10/29 09:53:51 hannken Exp $");



Home | Main Index | Thread Index | Old Index