Skip site navigation (1)Skip section navigation (2)
Date:      Sat, 4 Oct 2003 11:14:39 -0700 (PDT)
From:      Sam Leffler <sam@FreeBSD.org>
To:        Perforce Change Reviews <perforce@freebsd.org>
Subject:   PERFORCE change 39161 for review
Message-ID:  <200310041814.h94IEdwC019191@repoman.freebsd.org>

next in thread | raw e-mail | index | archive | help
http://perforce.freebsd.org/chv.cgi?CH=39161

Change 39161 by sam@sam_ebb on 2003/10/04 11:14:29

	IFC @ 39160

Affected files ...

.. //depot/projects/netperf/sys/coda/coda_subr.c#3 integrate
.. //depot/projects/netperf/sys/fs/msdosfs/msdosfs_vfsops.c#5 integrate
.. //depot/projects/netperf/sys/fs/nwfs/nwfs_io.c#4 integrate
.. //depot/projects/netperf/sys/fs/smbfs/smbfs_io.c#4 integrate
.. //depot/projects/netperf/sys/fs/specfs/spec_vnops.c#5 integrate
.. //depot/projects/netperf/sys/gnu/ext2fs/ext2_vfsops.c#4 integrate
.. //depot/projects/netperf/sys/i386/i386/locore.s#4 integrate
.. //depot/projects/netperf/sys/i386/i386/pmap.c#14 integrate
.. //depot/projects/netperf/sys/kern/sched_ule.c#6 integrate
.. //depot/projects/netperf/sys/kern/vfs_subr.c#4 integrate
.. //depot/projects/netperf/sys/kern/vfs_vnops.c#4 integrate
.. //depot/projects/netperf/sys/nfsclient/bootp_subr.c#5 integrate
.. //depot/projects/netperf/sys/nfsclient/krpc_subr.c#2 integrate
.. //depot/projects/netperf/sys/nfsclient/nfs_bio.c#3 integrate
.. //depot/projects/netperf/sys/nfsclient/nfs_socket.c#2 integrate
.. //depot/projects/netperf/sys/nfsclient/nfs_vfsops.c#3 integrate
.. //depot/projects/netperf/sys/nfsserver/nfs_syscalls.c#2 integrate
.. //depot/projects/netperf/sys/sys/vnode.h#3 integrate
.. //depot/projects/netperf/sys/ufs/ffs/ffs_snapshot.c#2 integrate
.. //depot/projects/netperf/sys/ufs/ffs/ffs_softdep.c#4 integrate
.. //depot/projects/netperf/sys/ufs/ffs/ffs_vfsops.c#4 integrate
.. //depot/projects/netperf/sys/ufs/ufs/ufs_ihash.c#2 integrate
.. //depot/projects/netperf/sys/ufs/ufs/ufs_quota.c#3 integrate
.. //depot/projects/netperf/sys/vm/device_pager.c#3 integrate
.. //depot/projects/netperf/sys/vm/vm_object.c#6 integrate

Differences ...

==== //depot/projects/netperf/sys/coda/coda_subr.c#3 (text+ko) ====

@@ -52,7 +52,7 @@
  */
 
 #include <sys/cdefs.h>
-__FBSDID("$FreeBSD: src/sys/coda/coda_subr.c,v 1.24 2003/09/07 07:43:09 tjr Exp $");
+__FBSDID("$FreeBSD: src/sys/coda/coda_subr.c,v 1.25 2003/10/04 13:16:54 jeff Exp $");
 
 #include <vcoda.h>
 
@@ -312,11 +312,12 @@
 	register struct vnode *vp, *nvp;
 	struct cnode *cp;
 	int count = 0, bad = 0;
-loop:
+
+	mtx_lock(&mntvnode_mtx);
 	for (vp = TAILQ_FIRST(&mp->mnt_nvnodelist); vp; vp = nvp) {
+		nvp = TAILQ_NEXT(vp, v_nmntvnodes);
 		if (vp->v_mount != mp)
-			goto loop;
-		nvp = TAILQ_NEXT(vp, v_nmntvnodes);
+			continue;
 		cp = VTOC(vp);
 		count++;
 		if (!(cp->c_flags & C_UNMOUNTING)) {
@@ -325,6 +326,7 @@
 			cp->c_flags |= C_UNMOUNTING;
 		}
 	}
+	mtx_unlock(&mntvnode_mtx);
 }
 
 void

==== //depot/projects/netperf/sys/fs/msdosfs/msdosfs_vfsops.c#5 (text+ko) ====

@@ -1,4 +1,4 @@
-/* $FreeBSD: src/sys/fs/msdosfs/msdosfs_vfsops.c,v 1.106 2003/09/26 20:26:23 fjoe Exp $ */
+/* $FreeBSD: src/sys/fs/msdosfs/msdosfs_vfsops.c,v 1.107 2003/10/04 12:52:37 jeff Exp $ */
 /*	$NetBSD: msdosfs_vfsops.c,v 1.51 1997/11/17 15:36:58 ws Exp $	*/
 
 /*-
@@ -789,8 +789,8 @@
 			goto loop;
 		nvp = TAILQ_NEXT(vp, v_nmntvnodes);
 
+		VI_LOCK(vp);
 		mtx_unlock(&mntvnode_mtx);
-		VI_LOCK(vp);
 		dep = VTODE(vp);
 		if (vp->v_type == VNON ||
 		    ((dep->de_flag &

==== //depot/projects/netperf/sys/fs/nwfs/nwfs_io.c#4 (text+ko) ====

@@ -29,7 +29,7 @@
  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
  * SUCH DAMAGE.
  *
- * $FreeBSD: src/sys/fs/nwfs/nwfs_io.c,v 1.30 2003/09/19 23:37:49 jeff Exp $
+ * $FreeBSD: src/sys/fs/nwfs/nwfs_io.c,v 1.31 2003/10/04 08:51:50 jeff Exp $
  *
  */
 #include <sys/param.h>
@@ -607,12 +607,8 @@
 /*	struct nwmount *nmp = VTONWFS(vp);*/
 	int error = 0, slpflag, slptimeo;
 
-	if (vp->v_iflag & VI_XLOCK) {
-#ifdef INVARIANTS
-		backtrace();
-#endif
+	if (vp->v_iflag & VI_XLOCK)
 		return (0);
-	}
 
 	if (intrflg) {
 		slpflag = PCATCH;

==== //depot/projects/netperf/sys/fs/smbfs/smbfs_io.c#4 (text+ko) ====

@@ -29,7 +29,7 @@
  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
  * SUCH DAMAGE.
  *
- * $FreeBSD: src/sys/fs/smbfs/smbfs_io.c,v 1.23 2003/09/19 23:37:49 jeff Exp $
+ * $FreeBSD: src/sys/fs/smbfs/smbfs_io.c,v 1.24 2003/10/04 08:51:50 jeff Exp $
  *
  */
 #include <sys/param.h>
@@ -679,12 +679,8 @@
 	struct smbnode *np = VTOSMB(vp);
 	int error = 0, slpflag, slptimeo;
 
-	if (vp->v_iflag & VI_XLOCK) {
-#ifdef INVARIANTS
-		backtrace();
-#endif
+	if (vp->v_iflag & VI_XLOCK)
 		return 0;
-	}
 
 	if (intrflg) {
 		slpflag = PCATCH;

==== //depot/projects/netperf/sys/fs/specfs/spec_vnops.c#5 (text+ko) ====

@@ -31,7 +31,7 @@
  * SUCH DAMAGE.
  *
  *	@(#)spec_vnops.c	8.14 (Berkeley) 5/21/95
- * $FreeBSD: src/sys/fs/specfs/spec_vnops.c,v 1.209 2003/08/28 01:52:14 marcel Exp $
+ * $FreeBSD: src/sys/fs/specfs/spec_vnops.c,v 1.210 2003/10/04 09:20:00 alc Exp $
  */
 
 #include <sys/param.h>
@@ -821,7 +821,6 @@
 		}
 	}
 	vm_page_unlock_queues();
-	VM_OBJECT_UNLOCK(ap->a_m[ap->a_reqpage]->object);
 	if (!gotreqpage) {
 		m = ap->a_m[ap->a_reqpage];
 		printf(
@@ -833,12 +832,14 @@
 		printf(
 	    "               nread: %d, reqpage: %d, pindex: %lu, pcount: %d\n",
 		    nread, ap->a_reqpage, (u_long)m->pindex, pcount);
+		VM_OBJECT_UNLOCK(m->object);
 		/*
 		 * Free the buffer header back to the swap buffer pool.
 		 */
 		relpbuf(bp, NULL);
 		return VM_PAGER_ERROR;
 	}
+	VM_OBJECT_UNLOCK(ap->a_m[ap->a_reqpage]->object);
 	/*
 	 * Free the buffer header back to the swap buffer pool.
 	 */

==== //depot/projects/netperf/sys/gnu/ext2fs/ext2_vfsops.c#4 (text+ko) ====

@@ -37,7 +37,7 @@
  * SUCH DAMAGE.
  *
  *	@(#)ffs_vfsops.c	8.8 (Berkeley) 4/18/94
- * $FreeBSD: src/sys/gnu/ext2fs/ext2_vfsops.c,v 1.107 2003/08/28 00:56:39 jeff Exp $
+ * $FreeBSD: src/sys/gnu/ext2fs/ext2_vfsops.c,v 1.108 2003/10/04 16:09:40 jeff Exp $
  */
 
 #include <sys/param.h>
@@ -576,16 +576,18 @@
 			goto loop;
 		}
 		nvp = TAILQ_NEXT(vp, v_nmntvnodes);
+		VI_LOCK(vp);
 		mtx_unlock(&mntvnode_mtx);
 		/*
 		 * Step 4: invalidate all inactive vnodes.
 		 */
-  		if (vrecycle(vp, NULL, td))
-  			goto loop;
+		if (vp->v_usecount == 0) {
+			vgonel(vp, td);
+			goto loop;
+		}
 		/*
 		 * Step 5: invalidate all cached file data.
 		 */
-		mtx_lock(&vp->v_interlock);
 		if (vget(vp, LK_EXCLUSIVE | LK_INTERLOCK, td)) {
 			goto loop;
 		}
@@ -903,8 +905,8 @@
 		if (vp->v_mount != mp)
 			goto loop;
 		nvp = TAILQ_NEXT(vp, v_nmntvnodes);
+		VI_LOCK(vp);
 		mtx_unlock(&mntvnode_mtx);
-		VI_LOCK(vp);
 		ip = VTOI(vp);
 		if (vp->v_type == VNON ||
 		    ((ip->i_flag &

==== //depot/projects/netperf/sys/i386/i386/locore.s#4 (text+ko) ====

@@ -34,7 +34,7 @@
  * SUCH DAMAGE.
  *
  *	from: @(#)locore.s	7.3 (Berkeley) 5/13/91
- * $FreeBSD: src/sys/i386/i386/locore.s,v 1.176 2003/10/03 14:33:00 peter Exp $
+ * $FreeBSD: src/sys/i386/i386/locore.s,v 1.177 2003/10/04 06:30:56 peter Exp $
  *
  *		originally from: locore.s, by William F. Jolitz
  *
@@ -788,7 +788,12 @@
 
 /* Map read-only from zero to the beginning of the kernel text section */
 	xorl	%eax, %eax
+#ifdef BURN_BRIDGES
 	xorl	%edx,%edx
+#else
+/* XXX emulate bugs in the old PSE code so that apm works */
+	movl	$PG_RW,%edx
+#endif
 	movl	$R(btext),%ecx
 	addl	$PAGE_MASK,%ecx
 	shrl	$PAGE_SHIFT,%ecx

==== //depot/projects/netperf/sys/i386/i386/pmap.c#14 (text+ko) ====

@@ -73,7 +73,7 @@
  */
 
 #include <sys/cdefs.h>
-__FBSDID("$FreeBSD: src/sys/i386/i386/pmap.c,v 1.443 2003/10/03 22:46:52 alc Exp $");
+__FBSDID("$FreeBSD: src/sys/i386/i386/pmap.c,v 1.444 2003/10/04 13:07:53 jeff Exp $");
 
 /*
  *	Manages physical address maps.
@@ -2366,7 +2366,7 @@
 {
 #if defined(I686_CPU)
 	if (cpu_class == CPUCLASS_686) {
-#if defined(CPU_ENABLED_SSE)
+#if defined(CPU_ENABLE_SSE)
 		if (cpu_feature & CPUID_SSE2)
 			sse2_pagezero(page);
 		else

==== //depot/projects/netperf/sys/kern/sched_ule.c#6 (text+ko) ====

@@ -25,7 +25,7 @@
  */
 
 #include <sys/cdefs.h>
-__FBSDID("$FreeBSD: src/sys/kern/sched_ule.c,v 1.56 2003/09/20 02:05:58 jeff Exp $");
+__FBSDID("$FreeBSD: src/sys/kern/sched_ule.c,v 1.57 2003/10/04 17:41:13 jeff Exp $");
 
 #include <sys/param.h>
 #include <sys/systm.h>
@@ -673,10 +673,12 @@
 static void
 sched_interact_update(struct ksegrp *kg)
 {
-	/* XXX Fixme, use a linear algorithm and not a while loop. */
-	while ((kg->kg_runtime + kg->kg_slptime) >  SCHED_SLP_RUN_MAX) {
-		kg->kg_runtime = (kg->kg_runtime / 5) * 4;
-		kg->kg_slptime = (kg->kg_slptime / 5) * 4;
+	int ratio;
+	if ((kg->kg_runtime + kg->kg_slptime) >  SCHED_SLP_RUN_MAX) {
+		ratio = (SCHED_SLP_RUN_MAX /
+		    (kg->kg_runtime + kg->kg_slptime)) * 4;
+		kg->kg_runtime = (kg->kg_runtime * ratio) / 5;
+		kg->kg_slptime = (kg->kg_slptime * ratio) / 5;
 	}
 }
 

==== //depot/projects/netperf/sys/kern/vfs_subr.c#4 (text+ko) ====

@@ -43,7 +43,7 @@
  */
 
 #include <sys/cdefs.h>
-__FBSDID("$FreeBSD: src/sys/kern/vfs_subr.c,v 1.458 2003/09/20 00:21:48 jeff Exp $");
+__FBSDID("$FreeBSD: src/sys/kern/vfs_subr.c,v 1.460 2003/10/04 18:03:53 jeff Exp $");
 
 #include "opt_ddb.h"
 #include "opt_mac.h"
@@ -818,15 +818,12 @@
 	/* Don't recycle if we can't get the interlock */
 	if (!VI_TRYLOCK(vp))
 		return (EWOULDBLOCK);
-
-	/* We should be able to immediately acquire this */
-	/* XXX This looks like it should panic if it fails */
-	if (vn_lock(vp, LK_INTERLOCK | LK_EXCLUSIVE, td) != 0) {
-		if (VOP_ISLOCKED(vp, td))
-			panic("vcanrecycle: locked vnode");
+	/*
+	 * This vnode may found and locked via some other list, if so we
+	 * can't recycle it yet.
+	 */
+	if (vn_lock(vp, LK_INTERLOCK | LK_EXCLUSIVE | LK_NOWAIT, td) != 0)
 		return (EWOULDBLOCK);
-	}
-
 	/*
 	 * Don't recycle if its filesystem is being suspended.
 	 */
@@ -1008,7 +1005,7 @@
 		vp->v_dd = vp;
 		vp->v_vnlock = &vp->v_lock;
 		lockinit(vp->v_vnlock, PVFS, tag, VLKTIMEOUT, LK_NOPAUSE);
-		cache_purge(vp);
+		cache_purge(vp);		/* Sets up v_id. */
 		LIST_INIT(&vp->v_cache_src);
 		TAILQ_INIT(&vp->v_cache_dst);
 	}
@@ -1059,12 +1056,10 @@
 	/*
 	 * Insert into list of vnodes for the new mount point, if available.
 	 */
-	if ((vp->v_mount = mp) == NULL) {
-		mtx_unlock(&mntvnode_mtx);
-		return;
+	if ((vp->v_mount = mp) != NULL) {
+		TAILQ_INSERT_TAIL(&mp->mnt_nvnodelist, vp, v_nmntvnodes);
+		mp->mnt_nvnodelistsize++;
 	}
-	TAILQ_INSERT_TAIL(&mp->mnt_nvnodelist, vp, v_nmntvnodes);
-	mp->mnt_nvnodelistsize++;
 	mtx_unlock(&mntvnode_mtx);
 }
 
@@ -1686,6 +1681,7 @@
 static void
 sched_sync(void)
 {
+	struct synclist *next;
 	struct synclist *slp;
 	struct vnode *vp;
 	struct mount *mp;
@@ -1711,32 +1707,31 @@
 		syncer_delayno += 1;
 		if (syncer_delayno == syncer_maxdelay)
 			syncer_delayno = 0;
+		next = &syncer_workitem_pending[syncer_delayno];
 
 		while ((vp = LIST_FIRST(slp)) != NULL) {
-			mtx_unlock(&sync_mtx);
-			if (VOP_ISLOCKED(vp, NULL) == 0 &&
-			    vn_start_write(vp, &mp, V_NOWAIT) == 0) {
-				vn_lock(vp, LK_EXCLUSIVE | LK_RETRY, td);
-				(void) VOP_FSYNC(vp, td->td_ucred, MNT_LAZY, td);
-				VOP_UNLOCK(vp, 0, td);
+			if (VOP_ISLOCKED(vp, NULL) != 0 || 
+			    vn_start_write(vp, &mp, V_NOWAIT) != 0) {
+				LIST_REMOVE(vp, v_synclist);
+				LIST_INSERT_HEAD(next, vp, v_synclist);
+				continue;
+			}
+			if (VI_TRYLOCK(vp) == 0) {
+				LIST_REMOVE(vp, v_synclist);
+				LIST_INSERT_HEAD(next, vp, v_synclist);
 				vn_finished_write(mp);
+				continue;
 			}
+			mtx_unlock(&sync_mtx);
+			vn_lock(vp, LK_EXCLUSIVE | LK_RETRY | LK_INTERLOCK, td);
+			(void) VOP_FSYNC(vp, td->td_ucred, MNT_LAZY, td);
+			VOP_UNLOCK(vp, 0, td);
+			vn_finished_write(mp);
 			mtx_lock(&sync_mtx);
 			if (LIST_FIRST(slp) == vp) {
+				VI_LOCK(vp);
 				mtx_unlock(&sync_mtx);
 				/*
-				 * Note: VFS vnodes can remain on the
-				 * worklist too with no dirty blocks, but
-				 * since sync_fsync() moves it to a different
-				 * slot we are safe.
-				 */
-				VI_LOCK(vp);
-				if (TAILQ_EMPTY(&vp->v_dirtyblkhd) &&
-				    !vn_isdisk(vp, NULL)) {
-					panic("sched_sync: fsync failed "
-					      "vp %p tag %s", vp, vp->v_tag);
-				}
-				/*
 				 * Put us back on the worklist.  The worklist
 				 * routine will remove us from our current
 				 * position and then add us back in at a later
@@ -2084,8 +2079,10 @@
 	if ((flags & LK_INTERLOCK) == 0)
 		VI_LOCK(vp);
 	if (vp->v_iflag & VI_XLOCK && vp->v_vxproc != curthread) {
-		vp->v_iflag |= VI_XWANT;
-		msleep(vp, VI_MTX(vp), PINOD | PDROP, "vget", 0);
+		if ((flags & LK_NOWAIT) == 0) {
+			vp->v_iflag |= VI_XWANT;
+			msleep(vp, VI_MTX(vp), PINOD | PDROP, "vget", 0);
+		}
 		return (ENOENT);
 	}
 
@@ -2368,6 +2365,10 @@
 
 		VI_LOCK(vp);
 		mtx_unlock(&mntvnode_mtx);
+		/*
+		 * XXX Does not check vn_lock error.  Should restart loop if
+		 * error == ENOENT.
+		 */
 		vn_lock(vp, LK_INTERLOCK | LK_EXCLUSIVE | LK_RETRY, td);
 		/*
 		 * This vnode could have been reclaimed while we were
@@ -2530,9 +2531,7 @@
 	 */
 	if (flags & DOCLOSE) {
 		struct buf *bp;
-		VI_LOCK(vp);
 		bp = TAILQ_FIRST(&vp->v_dirtyblkhd);
-		VI_UNLOCK(vp);
 		if (bp != NULL)
 			(void) vn_write_suspend_wait(vp, NULL, V_WAIT);
 		if (vinvalbuf(vp, V_SAVE, NOCRED, td, 0, 0) != 0)
@@ -2731,13 +2730,12 @@
 	 * If special device, remove it from special device alias list
 	 * if it is on one.
 	 */
+	VI_LOCK(vp);
 	if (vp->v_type == VCHR && vp->v_rdev != NULL && vp->v_rdev != NODEV) {
-		VI_LOCK(vp);
 		mtx_lock(&spechash_mtx);
 		SLIST_REMOVE(&vp->v_rdev->si_hlist, vp, vnode, v_specnext);
 		vp->v_rdev->si_usecount -= vp->v_usecount;
 		mtx_unlock(&spechash_mtx);
-		VI_UNLOCK(vp);
 		vp->v_rdev = NULL;
 	}
 
@@ -2751,7 +2749,6 @@
 	 * incremented first, vgone would (incorrectly) try to
 	 * close the previous instance of the underlying object.
 	 */
-	VI_LOCK(vp);
 	if (vp->v_usecount == 0 && !(vp->v_iflag & VI_DOOMED)) {
 		mtx_lock(&vnode_free_list_mtx);
 		if (vp->v_iflag & VI_FREE) {

==== //depot/projects/netperf/sys/kern/vfs_vnops.c#4 (text+ko) ====

@@ -39,7 +39,7 @@
  */
 
 #include <sys/cdefs.h>
-__FBSDID("$FreeBSD: src/sys/kern/vfs_vnops.c,v 1.194 2003/07/28 18:53:28 rwatson Exp $");
+__FBSDID("$FreeBSD: src/sys/kern/vfs_vnops.c,v 1.195 2003/10/04 14:35:22 jeff Exp $");
 
 #include "opt_mac.h"
 
@@ -870,12 +870,15 @@
 		if ((flags & LK_INTERLOCK) == 0)
 			VI_LOCK(vp);
 		if ((vp->v_iflag & VI_XLOCK) && vp->v_vxproc != curthread) {
+			if ((flags & LK_NOWAIT) != 0) {
+				VI_UNLOCK(vp);
+				return (ENOENT);
+			}
 			vp->v_iflag |= VI_XWANT;
 			msleep(vp, VI_MTX(vp), PINOD, "vn_lock", 0);
-			error = ENOENT;
 			if ((flags & LK_RETRY) == 0) {
 				VI_UNLOCK(vp);
-				return (error);
+				return (ENOENT);
 			}
 		} 
 #ifdef	DEBUG_LOCKS

==== //depot/projects/netperf/sys/nfsclient/bootp_subr.c#5 (text+ko) ====

@@ -41,7 +41,7 @@
  */
 
 #include <sys/cdefs.h>
-__FBSDID("$FreeBSD: src/sys/nfsclient/bootp_subr.c,v 1.52 2003/09/05 11:12:55 phk Exp $");
+__FBSDID("$FreeBSD: src/sys/nfsclient/bootp_subr.c,v 1.53 2003/10/04 17:41:59 jeff Exp $");
 
 #include "opt_bootp.h"
 
@@ -599,6 +599,7 @@
 	tv.tv_sec = 1;
 	tv.tv_usec = 0;
 	bzero(&sopt, sizeof(sopt));
+	sopt.sopt_dir = SOPT_SET;
 	sopt.sopt_level = SOL_SOCKET;
 	sopt.sopt_name = SO_RCVTIMEO;
 	sopt.sopt_val = &tv;

==== //depot/projects/netperf/sys/nfsclient/krpc_subr.c#2 (text+ko) ====

@@ -43,7 +43,7 @@
  */
 
 #include <sys/cdefs.h>
-__FBSDID("$FreeBSD: src/sys/nfsclient/krpc_subr.c,v 1.22 2003/02/19 05:47:38 imp Exp $");
+__FBSDID("$FreeBSD: src/sys/nfsclient/krpc_subr.c,v 1.23 2003/10/04 17:41:59 jeff Exp $");
 
 #include <sys/param.h>
 #include <sys/systm.h>
@@ -222,6 +222,7 @@
 	tv.tv_sec = 1;
 	tv.tv_usec = 0;
 	bzero(&sopt, sizeof sopt);
+	sopt.sopt_dir = SOPT_SET;
 	sopt.sopt_level = SOL_SOCKET;
 	sopt.sopt_name = SO_RCVTIMEO;
 	sopt.sopt_val = &tv;

==== //depot/projects/netperf/sys/nfsclient/nfs_bio.c#3 (text+ko) ====

@@ -37,7 +37,7 @@
  */
 
 #include <sys/cdefs.h>
-__FBSDID("$FreeBSD: src/sys/nfsclient/nfs_bio.c,v 1.121 2003/09/19 23:37:49 jeff Exp $");
+__FBSDID("$FreeBSD: src/sys/nfsclient/nfs_bio.c,v 1.122 2003/10/04 08:51:50 jeff Exp $");
 
 #include <sys/param.h>
 #include <sys/systm.h>
@@ -1067,12 +1067,13 @@
 
 	ASSERT_VOP_LOCKED(vp, "nfs_vinvalbuf");
 
-	if (vp->v_iflag & VI_XLOCK) {
-#ifdef INVARIANTS
-		backtrace();
-#endif
+	/*
+	 * XXX This check stops us from needlessly doing a vinvalbuf when
+	 * being called through vclean().  It is not clear that this is
+	 * unsafe.
+	 */
+	if (vp->v_iflag & VI_XLOCK)
 		return (0);
-	}
 
 	if ((nmp->nm_flag & NFSMNT_INT) == 0)
 		intrflg = 0;

==== //depot/projects/netperf/sys/nfsclient/nfs_socket.c#2 (text+ko) ====

@@ -37,7 +37,7 @@
  */
 
 #include <sys/cdefs.h>
-__FBSDID("$FreeBSD: src/sys/nfsclient/nfs_socket.c,v 1.98 2003/05/13 20:36:01 jhb Exp $");
+__FBSDID("$FreeBSD: src/sys/nfsclient/nfs_socket.c,v 1.99 2003/10/04 17:41:59 jeff Exp $");
 
 /*
  * Socket operations for use by nfs
@@ -288,6 +288,7 @@
 			int val;
 
 			bzero(&sopt, sizeof sopt);
+			sopt.sopt_dir = SOPT_SET;
 			sopt.sopt_level = SOL_SOCKET;
 			sopt.sopt_name = SO_KEEPALIVE;
 			sopt.sopt_val = &val;
@@ -300,6 +301,7 @@
 			int val;
 
 			bzero(&sopt, sizeof sopt);
+			sopt.sopt_dir = SOPT_SET;
 			sopt.sopt_level = IPPROTO_TCP;
 			sopt.sopt_name = TCP_NODELAY;
 			sopt.sopt_val = &val;

==== //depot/projects/netperf/sys/nfsclient/nfs_vfsops.c#3 (text+ko) ====

@@ -37,7 +37,7 @@
  */
 
 #include <sys/cdefs.h>
-__FBSDID("$FreeBSD: src/sys/nfsclient/nfs_vfsops.c,v 1.137 2003/08/15 12:04:02 phk Exp $");
+__FBSDID("$FreeBSD: src/sys/nfsclient/nfs_vfsops.c,v 1.138 2003/10/04 13:44:51 jeff Exp $");
 
 #include "opt_bootp.h"
 #include "opt_nfsroot.h"
@@ -943,8 +943,9 @@
 		if (vp->v_mount != mp)
 			goto loop;
 		vnp = TAILQ_NEXT(vp, v_nmntvnodes);
+		/* XXX Not obeying XLOCK.  */
+		VI_LOCK(vp);
 		mtx_unlock(&mntvnode_mtx);
-		VI_LOCK(vp);
 		if (VOP_ISLOCKED(vp, NULL) || TAILQ_EMPTY(&vp->v_dirtyblkhd) ||
 		    waitfor == MNT_LAZY) {
 			VI_UNLOCK(vp);

==== //depot/projects/netperf/sys/nfsserver/nfs_syscalls.c#2 (text+ko) ====

@@ -37,7 +37,7 @@
  */
 
 #include <sys/cdefs.h>
-__FBSDID("$FreeBSD: src/sys/nfsserver/nfs_syscalls.c,v 1.91 2003/07/02 08:08:32 phk Exp $");
+__FBSDID("$FreeBSD: src/sys/nfsserver/nfs_syscalls.c,v 1.92 2003/10/04 17:37:51 jeff Exp $");
 
 #include "opt_inet6.h"
 #include "opt_mac.h"
@@ -235,6 +235,7 @@
 		int val;
 
 		bzero(&sopt, sizeof sopt);
+		sopt.sopt_dir = SOPT_SET;
 		sopt.sopt_level = SOL_SOCKET;
 		sopt.sopt_name = SO_KEEPALIVE;
 		sopt.sopt_val = &val;
@@ -247,6 +248,7 @@
 		int val;
 
 		bzero(&sopt, sizeof sopt);
+		sopt.sopt_dir = SOPT_SET;
 		sopt.sopt_level = IPPROTO_TCP;
 		sopt.sopt_name = TCP_NODELAY;
 		sopt.sopt_val = &val;

==== //depot/projects/netperf/sys/sys/vnode.h#3 (text+ko) ====

@@ -31,7 +31,7 @@
  * SUCH DAMAGE.
  *
  *	@(#)vnode.h	8.7 (Berkeley) 2/4/94
- * $FreeBSD: src/sys/sys/vnode.h,v 1.226 2003/07/27 17:04:56 phk Exp $
+ * $FreeBSD: src/sys/sys/vnode.h,v 1.227 2003/10/04 14:32:55 jeff Exp $
  */
 
 #ifndef _SYS_VNODE_H_
@@ -95,8 +95,17 @@
  *	u - Only a reference to the vnode is needed to read.
  *	v - vnode lock
  *
+ * Vnodes may be found on many lists.  The general way to deal with operating
+ * on a vnode that is on a list is:
+ *	1) Lock the list and find the vnode.
+ *	2) Lock interlock so that the vnode does not go away.
+ *	3) Unlock the list to avoid lock order reversals.
+ *	4) vget with LK_INTERLOCK and check for ENOENT, or
+ *	5) Check for XLOCK if the vnode lock is not required.
+ *	6) Perform your operation, then vput().
+ *
  * XXX Not all fields are locked yet and some fields that are marked are not
- * locked consistently.  This is a work in progress.
+ * locked consistently.  This is a work in progress.  Requires Giant!
  */
 
 struct vnode {

==== //depot/projects/netperf/sys/ufs/ffs/ffs_snapshot.c#2 (text+ko) ====

@@ -34,7 +34,7 @@
  */
 
 #include <sys/cdefs.h>
-__FBSDID("$FreeBSD: src/sys/ufs/ffs/ffs_snapshot.c,v 1.70 2003/06/11 06:31:28 obrien Exp $");
+__FBSDID("$FreeBSD: src/sys/ufs/ffs/ffs_snapshot.c,v 1.71 2003/10/04 14:25:45 jeff Exp $");
 
 #include <sys/param.h>
 #include <sys/kernel.h>
@@ -415,22 +415,30 @@
 		if (xvp->v_mount != mp)
 			goto loop;
 		nvp = TAILQ_NEXT(xvp, v_nmntvnodes);
+		VI_LOCK(xvp);
 		mtx_unlock(&mntvnode_mtx);
-		mp_fixme("Unlocked GETATTR.");
-		if (vrefcnt(xvp) == 0 || xvp->v_type == VNON ||
-		    (VTOI(xvp)->i_flags & SF_SNAPSHOT) ||
-		    (VOP_GETATTR(xvp, &vat, td->td_ucred, td) == 0 &&
-		    vat.va_nlink > 0)) {
+		if (xvp->v_usecount == 0 || xvp->v_type == VNON ||
+		    (VTOI(xvp)->i_flags & SF_SNAPSHOT)) {
+			VI_UNLOCK(xvp);
 			mtx_lock(&mntvnode_mtx);
 			continue;
 		}
 		if (snapdebug)
 			vprint("ffs_snapshot: busy vnode", xvp);
-		if (vn_lock(xvp, LK_EXCLUSIVE, td) != 0)
+		if (vn_lock(xvp, LK_EXCLUSIVE | LK_INTERLOCK, td) != 0) {
+			mtx_lock(&mntvnode_mtx);
 			goto loop;
+		}
+		if (VOP_GETATTR(xvp, &vat, td->td_ucred, td) == 0 &&
+		    vat.va_nlink > 0) {
+			VOP_UNLOCK(xvp, 0, td);
+			mtx_lock(&mntvnode_mtx);
+			continue;
+		}
 		xp = VTOI(xvp);
 		if (ffs_checkfreefile(copy_fs, vp, xp->i_number)) {
 			VOP_UNLOCK(xvp, 0, td);
+			mtx_lock(&mntvnode_mtx);
 			continue;
 		}
 		/*

==== //depot/projects/netperf/sys/ufs/ffs/ffs_softdep.c#4 (text+ko) ====

@@ -39,7 +39,7 @@
  */
 
 #include <sys/cdefs.h>
-__FBSDID("$FreeBSD: src/sys/ufs/ffs/ffs_softdep.c,v 1.144 2003/09/03 04:08:15 jeff Exp $");
+__FBSDID("$FreeBSD: src/sys/ufs/ffs/ffs_softdep.c,v 1.146 2003/10/04 15:57:05 jeff Exp $");
 
 /*
  * For now we want the safety net that the DIAGNOSTIC and DEBUG flags provide.
@@ -4811,13 +4811,8 @@
 		 * not now, but then the user was not asking to have it
 		 * written, so we are not breaking any promises.
 		 */
-		mp_fixme("This operation is not atomic wrt the rest of the code");
-		VI_LOCK(vp);
-		if (vp->v_iflag & VI_XLOCK) {
-			VI_UNLOCK(vp);
+		if (vp->v_iflag & VI_XLOCK)
 			break;
-		} else
-			VI_UNLOCK(vp);
 		/*
 		 * We prevent deadlock by always fetching inodes from the
 		 * root, moving down the directory tree. Thus, when fetching
@@ -5844,7 +5839,10 @@
 			 * The mtx argument must be bp->b_vp's mutex in
 			 * this case.
 			 */
-			ASSERT_VI_LOCKED(bp->b_vp, "getdirtybuf");
+#ifdef	DEBUG_VFS_LOCKS
+			if (bp->b_vp->v_type != VCHR)
+				ASSERT_VI_LOCKED(bp->b_vp, "getdirtybuf");
+#endif
 			bp->b_vflags |= BV_BKGRDWAIT;
 			interlocked_sleep(&lk, SLEEP, &bp->b_xflags, mtx,
 			    PRIBIO, "getbuf", 0);

==== //depot/projects/netperf/sys/ufs/ffs/ffs_vfsops.c#4 (text+ko) ====

@@ -34,7 +34,7 @@
  */
 
 #include <sys/cdefs.h>
-__FBSDID("$FreeBSD: src/sys/ufs/ffs/ffs_vfsops.c,v 1.216 2003/08/15 20:03:19 phk Exp $");
+__FBSDID("$FreeBSD: src/sys/ufs/ffs/ffs_vfsops.c,v 1.217 2003/10/04 14:27:49 jeff Exp $");
 
 #include "opt_mac.h"
 #include "opt_quota.h"
@@ -428,9 +428,7 @@
 	if (vn_isdisk(devvp, NULL)) {
 		vn_lock(devvp, LK_EXCLUSIVE | LK_RETRY, td);
 		vfs_object_create(devvp, td, td->td_ucred);
-		/* XXX Why lock only to release immediately?? */
-		mtx_lock(&devvp->v_interlock);
-		VOP_UNLOCK(devvp, LK_INTERLOCK, td);
+		VOP_UNLOCK(devvp, 0, td);
 	}
 
 	/*
@@ -504,17 +502,18 @@
 			goto loop;
 		}
 		nvp = TAILQ_NEXT(vp, v_nmntvnodes);
+		VI_LOCK(vp);
 		mtx_unlock(&mntvnode_mtx);
 		/*
 		 * Step 4: invalidate all inactive vnodes.
 		 */
-		if (vrecycle(vp, NULL, td))
+		if (vp->v_usecount == 0) {
+			vgonel(vp, td);
 			goto loop;
+		}
 		/*
 		 * Step 5: invalidate all cached file data.
 		 */
-		/* XXX Why lock only to release immediately? */
-		mtx_lock(&vp->v_interlock);
 		if (vget(vp, LK_EXCLUSIVE | LK_INTERLOCK, td)) {
 			goto loop;
 		}
@@ -597,9 +596,7 @@
 	if (vn_isdisk(devvp, NULL)) {
 		vn_lock(devvp, LK_EXCLUSIVE | LK_RETRY, td);
 		vfs_object_create(devvp, td, cred);
-		/* XXX Why lock only to release immediately?? */
-		mtx_lock(&devvp->v_interlock);
-		VOP_UNLOCK(devvp, LK_INTERLOCK, td);
+		VOP_UNLOCK(devvp, 0, td);
 	}
 
 	ronly = (mp->mnt_flag & MNT_RDONLY) != 0;

==== //depot/projects/netperf/sys/ufs/ufs/ufs_ihash.c#2 (text+ko) ====

@@ -34,7 +34,7 @@
  */
 
 #include <sys/cdefs.h>
-__FBSDID("$FreeBSD: src/sys/ufs/ufs/ufs_ihash.c,v 1.36 2003/06/11 06:34:30 obrien Exp $");
+__FBSDID("$FreeBSD: src/sys/ufs/ufs/ufs_ihash.c,v 1.37 2003/10/04 14:03:28 jeff Exp $");
 
 #include <sys/param.h>
 #include <sys/systm.h>
@@ -125,7 +125,7 @@
 	LIST_FOREACH(ip, INOHASH(dev, inum), i_hash) {
 		if (inum == ip->i_number && dev == ip->i_dev) {
 			vp = ITOV(ip);
-			mtx_lock(&vp->v_interlock);
+			VI_LOCK(vp);
 			mtx_unlock(&ufs_ihash_mtx);
 			error = vget(vp, flags | LK_INTERLOCK, td);
 			if (error == ENOENT)
@@ -162,7 +162,7 @@
 	LIST_FOREACH(oip, ipp, i_hash) {
 		if (ip->i_number == oip->i_number && ip->i_dev == oip->i_dev) {
 			ovp = ITOV(oip);
-			mtx_lock(&ovp->v_interlock);
+			VI_LOCK(ovp);
 			mtx_unlock(&ufs_ihash_mtx);
 			error = vget(ovp, flags | LK_INTERLOCK, td);
 			if (error == ENOENT)

==== //depot/projects/netperf/sys/ufs/ufs/ufs_quota.c#3 (text+ko) ====

@@ -37,7 +37,7 @@
  */
 
 #include <sys/cdefs.h>
-__FBSDID("$FreeBSD: src/sys/ufs/ufs/ufs_quota.c,v 1.66 2003/07/27 17:04:56 phk Exp $");
+__FBSDID("$FreeBSD: src/sys/ufs/ufs/ufs_quota.c,v 1.67 2003/10/04 14:02:32 jeff Exp $");
 
 #include <sys/param.h>
 #include <sys/systm.h>
@@ -411,6 +411,7 @@
 	struct dquot *dq;
 	int error, flags;
 	struct nameidata nd;
+	int restart;
 
 	error = suser_cred(td->td_ucred, PRISON_ROOT);
 	if (error)
@@ -457,13 +458,14 @@
 	 */
 	mtx_lock(&mntvnode_mtx);
 again:
+	restart = 0;
 	for (vp = TAILQ_FIRST(&mp->mnt_nvnodelist); vp != NULL; vp = nextvp) {
 		if (vp->v_mount != mp)
 			goto again;
 		nextvp = TAILQ_NEXT(vp, v_nmntvnodes);
-		
+		VI_LOCK(vp);
 		mtx_unlock(&mntvnode_mtx);
-		if (vget(vp, LK_EXCLUSIVE, td)) {
+		if (vget(vp, LK_EXCLUSIVE | LK_INTERLOCK, td)) {
 			mtx_lock(&mntvnode_mtx);
 			goto again;
 		}
@@ -473,11 +475,13 @@
 			continue;
 		}
 		error = getinoquota(VTOI(vp));
+		mtx_lock(&mntvnode_mtx);
+		if (TAILQ_NEXT(vp, v_nmntvnodes) != nextvp)
+			restart = 1;
 		vput(vp);
-		mtx_lock(&mntvnode_mtx);
 		if (error)
 			break;
-		if (TAILQ_NEXT(vp, v_nmntvnodes) != nextvp)
+		if (restart)
 			goto again;
 	}
 	mtx_unlock(&mntvnode_mtx);
@@ -501,6 +505,7 @@
 	struct ufsmount *ump = VFSTOUFS(mp);
 	struct dquot *dq;
 	struct inode *ip;
+	int restart;
 	int error;
 
 	error = suser_cred(td->td_ucred, PRISON_ROOT);
@@ -516,15 +521,16 @@
 	 */
 	mtx_lock(&mntvnode_mtx);
 again:
+	restart = 0;
 	for (vp = TAILQ_FIRST(&mp->mnt_nvnodelist); vp != NULL; vp = nextvp) {
 		if (vp->v_mount != mp)
 			goto again;
 		nextvp = TAILQ_NEXT(vp, v_nmntvnodes);
 
+		VI_LOCK(vp);
 		mtx_unlock(&mntvnode_mtx);
-		mtx_lock(&vp->v_interlock);
 		if (vp->v_type == VNON) {
-			mtx_unlock(&vp->v_interlock);
+			VI_UNLOCK(vp);
 			mtx_lock(&mntvnode_mtx);
 			continue;
 		}
@@ -536,9 +542,11 @@
 		dq = ip->i_dquot[type];
 		ip->i_dquot[type] = NODQUOT;
 		dqrele(vp, dq);
-		vput(vp);
 		mtx_lock(&mntvnode_mtx);
 		if (TAILQ_NEXT(vp, v_nmntvnodes) != nextvp)
+			restart = 1;
+		vput(vp);
+		if (restart)
 			goto again;
 	}
 	mtx_unlock(&mntvnode_mtx);
@@ -731,6 +739,7 @@
 	struct thread *td = curthread;		/* XXX */
 	struct vnode *vp, *nextvp;
 	struct dquot *dq;
+	int restart;
 	int i, error;
 
 	/*
@@ -748,14 +757,15 @@
 	 */
 	mtx_lock(&mntvnode_mtx);
 again:
+	restart = 0;
 	for (vp = TAILQ_FIRST(&mp->mnt_nvnodelist); vp != NULL; vp = nextvp) {
 		if (vp->v_mount != mp)
 			goto again;
 		nextvp = TAILQ_NEXT(vp, v_nmntvnodes);
+		VI_LOCK(vp);
 		mtx_unlock(&mntvnode_mtx);
-		mtx_lock(&vp->v_interlock);
 		if (vp->v_type == VNON) {
-			mtx_unlock(&vp->v_interlock);
+			VI_UNLOCK(vp);
 			mtx_lock(&mntvnode_mtx);
 			continue;
 		}
@@ -771,9 +781,11 @@
 			if (dq != NODQUOT && (dq->dq_flags & DQ_MOD))
 				dqsync(vp, dq);
 		}
+		if (TAILQ_NEXT(vp, v_nmntvnodes) != nextvp)
+			restart = 1;
+		mtx_lock(&mntvnode_mtx);
 		vput(vp);
-		mtx_lock(&mntvnode_mtx);
-		if (TAILQ_NEXT(vp, v_nmntvnodes) != nextvp)
+		if (restart)
 			goto again;
 	}
 	mtx_unlock(&mntvnode_mtx);

==== //depot/projects/netperf/sys/vm/device_pager.c#3 (text+ko) ====

@@ -39,7 +39,7 @@
  */
 
 #include <sys/cdefs.h>
-__FBSDID("$FreeBSD: src/sys/vm/device_pager.c,v 1.67 2003/08/05 06:51:26 phk Exp $");
+__FBSDID("$FreeBSD: src/sys/vm/device_pager.c,v 1.68 2003/10/04 14:21:53 jeff Exp $");
 
 #include <sys/param.h>
 #include <sys/systm.h>
@@ -95,7 +95,8 @@
 	sx_init(&dev_pager_sx, "dev_pager create");
 	mtx_init(&dev_pager_mtx, "dev_pager list", NULL, MTX_DEF);

>>> TRUNCATED FOR MAIL (1000 lines) <<<



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?200310041814.h94IEdwC019191>