On Thu, Jun 04, 2009 at 04:18:08PM +0000, Paul Saab wrote: > Author: ps > Date: Thu Jun 4 16:18:07 2009 > New Revision: 193440 > URL: http://svn.freebsd.org/changeset/base/193440 > > Log: > Support shared vnode locks for write operations when the offset is > provided on filesystems that support it. This really improves mysql > + innodb performance on ZFS. > > Reviewed by: jhb, kmacy, jeffr > > Modified: > head/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/zfs_vfsops.c > head/sys/kern/vfs_vnops.c > head/sys/sys/mount.h > > Modified: head/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/zfs_vfsops.c > ============================================================================== > --- head/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/zfs_vfsops.c Thu Jun > 4 15:57:38 2009 (r193439) > +++ head/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/zfs_vfsops.c Thu Jun > 4 16:18:07 2009 (r193440) > @@ -573,6 +573,7 @@ zfs_domount(vfs_t *vfsp, char *osname) > vfsp->mnt_flag |= MNT_LOCAL; > vfsp->mnt_kern_flag |= MNTK_MPSAFE; > vfsp->mnt_kern_flag |= MNTK_LOOKUP_SHARED; > + vfsp->mnt_kern_flag |= MNTK_SHARED_WRITES; > > if (error = dsl_prop_get_integer(osname, "readonly", &readonly, NULL)) > goto out; > > Modified: head/sys/kern/vfs_vnops.c > ============================================================================== > --- head/sys/kern/vfs_vnops.c Thu Jun 4 15:57:38 2009 (r193439) > +++ head/sys/kern/vfs_vnops.c Thu Jun 4 16:18:07 2009 (r193440) > @@ -367,7 +367,7 @@ vn_rdwr(rw, vp, base, len, offset, segfl > struct iovec aiov; > struct mount *mp; > struct ucred *cred; > - int error; > + int error, lock_flags; > > VFS_ASSERT_GIANT(vp->v_mount); > > @@ -378,7 +378,13 @@ vn_rdwr(rw, vp, base, len, offset, segfl > (error = vn_start_write(vp, &mp, V_WAIT | PCATCH)) > != 0) > return (error); > - vn_lock(vp, LK_EXCLUSIVE | LK_RETRY); > + if (mp != NULL && > + (mp->mnt_kern_flag & MNTK_SHARED_WRITES)) { > + lock_flags = LK_SHARED; > + } else { > + lock_flags = LK_EXCLUSIVE; > + } > + vn_lock(vp, lock_flags | LK_RETRY); > } else > vn_lock(vp, LK_SHARED | LK_RETRY); > > @@ -564,7 +570,7 @@ vn_write(fp, uio, active_cred, flags, td > { > struct vnode *vp; > struct mount *mp; > - int error, ioflag; > + int error, ioflag, lock_flags; > int vfslocked; > > KASSERT(uio->uio_td == td, ("uio_td %p is not td %p", > @@ -587,7 +593,16 @@ vn_write(fp, uio, active_cred, flags, td > if (vp->v_type != VCHR && > (error = vn_start_write(vp, &mp, V_WAIT | PCATCH)) != 0) > goto unlock; > - vn_lock(vp, LK_EXCLUSIVE | LK_RETRY); > + > + if (vp->v_mount != NULL && > + (vp->v_mount->mnt_kern_flag & MNTK_SHARED_WRITES) && > + (flags & FOF_OFFSET) != 0) { > + lock_flags = LK_SHARED; > + } else { > + lock_flags = LK_EXCLUSIVE; > + } > + > + vn_lock(vp, lock_flags | LK_RETRY); > if ((flags & FOF_OFFSET) == 0) > uio->uio_offset = fp->f_offset; > ioflag |= sequential_heuristic(uio, fp);
Why do you check for vnode v_mount flags in vn_write, while performing the check on the vop_getwritemount(vp) result for vn_rdwr ?
pgp0EK3H6EYrO.pgp
Description: PGP signature