PERFORCE change 39161 for review
Sam Leffler
sam at FreeBSD.org
Sat Oct 4 11:14:42 PDT 2003
http://perforce.freebsd.org/chv.cgi?CH=39161
Change 39161 by sam at 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) <<<
More information about the p4-projects
mailing list