summaryrefslogtreecommitdiffstats
path: root/sys/kern
diff options
context:
space:
mode:
authorkib <kib@FreeBSD.org>2014-08-05 05:00:22 +0000
committerkib <kib@FreeBSD.org>2014-08-05 05:00:22 +0000
commitefd262c8d0b1468060062a30fd3dab943d193695 (patch)
tree670cecbcde745117177b19055868a7badd550c9f /sys/kern
parentf50ec1f79f9ae8ff85a176d544e21283367f96f5 (diff)
downloadFreeBSD-src-efd262c8d0b1468060062a30fd3dab943d193695.zip
FreeBSD-src-efd262c8d0b1468060062a30fd3dab943d193695.tar.gz
MFC r269244:
Remove one-time use macros which check for the vnode lifecycle.
Diffstat (limited to 'sys/kern')
-rw-r--r--sys/kern/vfs_subr.c41
1 files changed, 25 insertions, 16 deletions
diff --git a/sys/kern/vfs_subr.c b/sys/kern/vfs_subr.c
index 52b4059..9f34eda 100644
--- a/sys/kern/vfs_subr.c
+++ b/sys/kern/vfs_subr.c
@@ -275,14 +275,6 @@ static int vnlru_nowhere;
SYSCTL_INT(_debug, OID_AUTO, vnlru_nowhere, CTLFLAG_RW,
&vnlru_nowhere, 0, "Number of times the vnlru process ran without success");
-/*
- * Macros to control when a vnode is freed and recycled. All require
- * the vnode interlock.
- */
-#define VCANRECYCLE(vp) (((vp)->v_iflag & VI_FREE) && !(vp)->v_holdcnt)
-#define VSHOULDFREE(vp) (!((vp)->v_iflag & VI_FREE) && !(vp)->v_holdcnt)
-#define VSHOULDBUSY(vp) (((vp)->v_iflag & VI_FREE) && (vp)->v_holdcnt)
-
/* Shift count for (uintptr_t)vp to initialize vp->v_hash. */
static int vnsz2log;
@@ -849,11 +841,21 @@ vnlru_free(int count)
TAILQ_INSERT_TAIL(&vnode_free_list, vp, v_actfreelist);
continue;
}
- VNASSERT(VCANRECYCLE(vp), vp,
- ("vp inconsistent on freelist"));
+ VNASSERT((vp->v_iflag & VI_FREE) != 0 && vp->v_holdcnt == 0,
+ vp, ("vp inconsistent on freelist"));
+
+ /*
+ * The clear of VI_FREE prevents activation of the
+ * vnode. There is no sense in putting the vnode on
+ * the mount point active list, only to remove it
+ * later during recycling. Inline the relevant part
+ * of vholdl(), to avoid triggering assertions or
+ * activating.
+ */
freevnodes--;
vp->v_iflag &= ~VI_FREE;
- vholdl(vp);
+ vp->v_holdcnt++;
+
mtx_unlock(&vnode_free_list_mtx);
VI_UNLOCK(vp);
vtryrecycle(vp);
@@ -2042,13 +2044,13 @@ v_incr_usecount(struct vnode *vp)
{
CTR2(KTR_VFS, "%s: vp %p", __func__, vp);
+ vholdl(vp);
vp->v_usecount++;
if (vp->v_type == VCHR && vp->v_rdev != NULL) {
dev_lock();
vp->v_rdev->si_usecount++;
dev_unlock();
}
- vholdl(vp);
}
/*
@@ -2325,11 +2327,18 @@ vholdl(struct vnode *vp)
struct mount *mp;
CTR2(KTR_VFS, "%s: vp %p", __func__, vp);
+#ifdef INVARIANTS
+ /* getnewvnode() calls v_incr_usecount() without holding interlock. */
+ if (vp->v_type != VNON || vp->v_data != NULL) {
+ ASSERT_VI_LOCKED(vp, "vholdl");
+ VNASSERT(vp->v_holdcnt > 0 || (vp->v_iflag & VI_FREE) != 0,
+ vp, ("vholdl: free vnode is held"));
+ }
+#endif
vp->v_holdcnt++;
- if (!VSHOULDBUSY(vp))
+ if ((vp->v_iflag & VI_FREE) == 0)
return;
- ASSERT_VI_LOCKED(vp, "vholdl");
- VNASSERT((vp->v_iflag & VI_FREE) != 0, vp, ("vnode not free"));
+ VNASSERT(vp->v_holdcnt == 1, vp, ("vholdl: wrong hold count"));
VNASSERT(vp->v_op != NULL, vp, ("vholdl: vnode already reclaimed."));
/*
* Remove a vnode from the free list, mark it as in use,
@@ -2390,7 +2399,7 @@ vdropl(struct vnode *vp)
("vdropl: vnode already reclaimed."));
VNASSERT((vp->v_iflag & VI_FREE) == 0, vp,
("vnode already free"));
- VNASSERT(VSHOULDFREE(vp), vp,
+ VNASSERT(vp->v_holdcnt == 0, vp,
("vdropl: freeing when we shouldn't"));
active = vp->v_iflag & VI_ACTIVE;
vp->v_iflag &= ~VI_ACTIVE;
OpenPOWER on IntegriCloud