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>