Date: Thu, 4 Jun 2009 19:30:56 +0300 From: Kostik Belousov <kostikbel@gmail.com> To: Paul Saab <ps@freebsd.org> Cc: svn-src-head@freebsd.org, svn-src-all@freebsd.org, src-committers@freebsd.org Subject: Re: svn commit: r193440 - in head/sys: cddl/contrib/opensolaris/uts/common/fs/zfs kern sys Message-ID: <20090604163056.GW1927@deviant.kiev.zoral.com.ua> In-Reply-To: <200906041618.n54GI851097005@svn.freebsd.org> References: <200906041618.n54GI851097005@svn.freebsd.org>
next in thread | previous in thread | raw e-mail | index | archive | help
--qEtvru/posgxJ0S3 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline Content-Transfer-Encoding: quoted-printable 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 >=20 > 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. > =20 > Reviewed by: jhb, kmacy, jeffr >=20 > Modified: > head/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/zfs_vfsops.c > head/sys/kern/vfs_vnops.c > head/sys/sys/mount.h >=20 > Modified: head/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/zfs_vfsops.c > =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D > --- 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 |=3D MNT_LOCAL; > vfsp->mnt_kern_flag |=3D MNTK_MPSAFE; > vfsp->mnt_kern_flag |=3D MNTK_LOOKUP_SHARED; > + vfsp->mnt_kern_flag |=3D MNTK_SHARED_WRITES; > =20 > if (error =3D dsl_prop_get_integer(osname, "readonly", &readonly, NULL)) > goto out; >=20 > Modified: head/sys/kern/vfs_vnops.c > =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D > --- 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; > =20 > VFS_ASSERT_GIANT(vp->v_mount); > =20 > @@ -378,7 +378,13 @@ vn_rdwr(rw, vp, base, len, offset, segfl > (error =3D vn_start_write(vp, &mp, V_WAIT | PCATCH)) > !=3D 0) > return (error); > - vn_lock(vp, LK_EXCLUSIVE | LK_RETRY); > + if (mp !=3D NULL && > + (mp->mnt_kern_flag & MNTK_SHARED_WRITES)) { > + lock_flags =3D LK_SHARED; > + } else { > + lock_flags =3D LK_EXCLUSIVE; > + } > + vn_lock(vp, lock_flags | LK_RETRY); > } else > vn_lock(vp, LK_SHARED | LK_RETRY); > =20 > @@ -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; > =20 > KASSERT(uio->uio_td =3D=3D td, ("uio_td %p is not td %p", > @@ -587,7 +593,16 @@ vn_write(fp, uio, active_cred, flags, td > if (vp->v_type !=3D VCHR && > (error =3D vn_start_write(vp, &mp, V_WAIT | PCATCH)) !=3D 0) > goto unlock; > - vn_lock(vp, LK_EXCLUSIVE | LK_RETRY); > +=20 > + if (vp->v_mount !=3D NULL && > + (vp->v_mount->mnt_kern_flag & MNTK_SHARED_WRITES) && > + (flags & FOF_OFFSET) !=3D 0) { > + lock_flags =3D LK_SHARED; > + } else { > + lock_flags =3D LK_EXCLUSIVE; > + } > + > + vn_lock(vp, lock_flags | LK_RETRY); > if ((flags & FOF_OFFSET) =3D=3D 0) > uio->uio_offset =3D fp->f_offset; > ioflag |=3D 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 ? --qEtvru/posgxJ0S3 Content-Type: application/pgp-signature Content-Disposition: inline -----BEGIN PGP SIGNATURE----- Version: GnuPG v1.4.9 (FreeBSD) iEYEARECAAYFAkon9r8ACgkQC3+MBN1Mb4gPQgCg8DPGr3LwncSOOjHAWuCSjjLM y84Anjy/sfJxO6pgpt+TAdjgJag5qLYo =Bf4f -----END PGP SIGNATURE----- --qEtvru/posgxJ0S3--
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?20090604163056.GW1927>