Skip site navigation (1)Skip section navigation (2)
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>