svn commit: r202810 - in stable/7/sys: kern sys
John Baldwin
jhb at FreeBSD.org
Fri Jan 22 14:44:16 UTC 2010
Author: jhb
Date: Fri Jan 22 14:44:15 2010
New Revision: 202810
URL: http://svn.freebsd.org/changeset/base/202810
Log:
MFC 193440,193442,193762,194019:
- 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.
- When checking for shared writes, use the struct mount returned from
vn_start_write.
- Simply shared vnode locking and extend it to also include fsync.
Also, in vop_write, no longer assert for exclusive locks on the
vnode.
- Stop asserting on exclusive locks in fsync since it can now support
shared vnode locking on ZFS.
Modified:
stable/7/sys/kern/vfs_syscalls.c
stable/7/sys/kern/vfs_vnops.c
stable/7/sys/kern/vnode_if.src
stable/7/sys/sys/mount.h
Directory Properties:
stable/7/sys/ (props changed)
stable/7/sys/cddl/contrib/opensolaris/ (props changed)
stable/7/sys/contrib/dev/acpica/ (props changed)
stable/7/sys/contrib/pf/ (props changed)
Modified: stable/7/sys/kern/vfs_syscalls.c
==============================================================================
--- stable/7/sys/kern/vfs_syscalls.c Fri Jan 22 14:25:17 2010 (r202809)
+++ stable/7/sys/kern/vfs_syscalls.c Fri Jan 22 14:44:15 2010 (r202810)
@@ -3267,7 +3267,7 @@ fsync(td, uap)
struct mount *mp;
struct file *fp;
int vfslocked;
- int error;
+ int error, lock_flags;
AUDIT_ARG(fd, uap->fd);
if ((error = getvnode(td->td_proc->p_fd, uap->fd, &fp)) != 0)
@@ -3276,7 +3276,13 @@ fsync(td, uap)
vfslocked = VFS_LOCK_GIANT(vp->v_mount);
if ((error = vn_start_write(vp, &mp, V_WAIT | PCATCH)) != 0)
goto drop;
- vn_lock(vp, LK_EXCLUSIVE | LK_RETRY, td);
+ if (MNT_SHARED_WRITES(mp) ||
+ ((mp == NULL) && MNT_SHARED_WRITES(vp->v_mount))) {
+ lock_flags = LK_SHARED;
+ } else {
+ lock_flags = LK_EXCLUSIVE;
+ }
+ vn_lock(vp, lock_flags | LK_RETRY, td);
AUDIT_ARG(vnode, vp, ARG_VNODE1);
if (vp->v_object != NULL) {
VM_OBJECT_LOCK(vp->v_object);
Modified: stable/7/sys/kern/vfs_vnops.c
==============================================================================
--- stable/7/sys/kern/vfs_vnops.c Fri Jan 22 14:25:17 2010 (r202809)
+++ stable/7/sys/kern/vfs_vnops.c Fri Jan 22 14:44:15 2010 (r202810)
@@ -370,13 +370,9 @@ vn_rdwr(rw, vp, base, len, offset, segfl
(error = vn_start_write(vp, &mp, V_WAIT | PCATCH))
!= 0)
return (error);
- if (mp != NULL &&
- (mp->mnt_kern_flag & MNTK_SHARED_WRITES)) {
- /*
- * XXX See the next comment what should
- * be done here too.
- */
- lock_flags = LK_EXCLUSIVE;
+ if (MNT_SHARED_WRITES(mp) ||
+ ((mp == NULL) && MNT_SHARED_WRITES(vp->v_mount))) {
+ lock_flags = LK_SHARED;
} else {
lock_flags = LK_EXCLUSIVE;
}
@@ -594,15 +590,10 @@ vn_write(fp, uio, active_cred, flags, td
(error = vn_start_write(vp, &mp, V_WAIT | PCATCH)) != 0)
goto unlock;
- if (vp->v_mount != NULL &&
- (vp->v_mount->mnt_kern_flag & MNTK_SHARED_WRITES) &&
+ if ((MNT_SHARED_WRITES(mp) ||
+ ((mp == NULL) && MNT_SHARED_WRITES(vp->v_mount))) &&
(flags & FOF_OFFSET) != 0) {
- /*
- * XXX This should be LK_SHARED but the VFS in releng7
- * needs some patches before this can be done.
- * See the similar comment above.
- */
- lock_flags = LK_EXCLUSIVE;
+ lock_flags = LK_SHARED;
} else {
lock_flags = LK_EXCLUSIVE;
}
Modified: stable/7/sys/kern/vnode_if.src
==============================================================================
--- stable/7/sys/kern/vnode_if.src Fri Jan 22 14:25:17 2010 (r202809)
+++ stable/7/sys/kern/vnode_if.src Fri Jan 22 14:44:15 2010 (r202810)
@@ -185,7 +185,7 @@ vop_read {
};
-%% write vp E E E
+%% write vp L L L
%! write pre VOP_WRITE_PRE
%! write post VOP_WRITE_POST
@@ -245,7 +245,7 @@ vop_revoke {
};
-%% fsync vp E E E
+%% fsync vp L L L
vop_fsync {
IN struct vnode *vp;
Modified: stable/7/sys/sys/mount.h
==============================================================================
--- stable/7/sys/sys/mount.h Fri Jan 22 14:25:17 2010 (r202809)
+++ stable/7/sys/sys/mount.h Fri Jan 22 14:44:15 2010 (r202810)
@@ -339,6 +339,9 @@ void __mnt_vnode_markerfree(str
#define MNTK_LOOKUP_SHARED 0x40000000 /* FS supports shared lock lookups */
#define MNTK_NOKNOTE 0x80000000 /* Don't send KNOTEs from VOP hooks */
+#define MNT_SHARED_WRITES(mp) (((mp) != NULL) && \
+ ((mp)->mnt_kern_flag & MNTK_SHARED_WRITES))
+
/*
* Sysctl CTL_VFS definitions.
*
More information about the svn-src-all
mailing list