svn commit: r229695 - stable/9/sys/vm
Konstantin Belousov
kib at FreeBSD.org
Fri Jan 6 11:06:16 UTC 2012
Author: kib
Date: Fri Jan 6 11:06:15 2012
New Revision: 229695
URL: http://svn.freebsd.org/changeset/base/229695
Log:
MFC r228838:
Optimize the common case of msyncing the whole file mapping with
MS_SYNC flag.
Modified:
stable/9/sys/vm/vm_object.c
Directory Properties:
stable/9/sys/ (props changed)
Modified: stable/9/sys/vm/vm_object.c
==============================================================================
--- stable/9/sys/vm/vm_object.c Fri Jan 6 10:12:59 2012 (r229694)
+++ stable/9/sys/vm/vm_object.c Fri Jan 6 11:06:15 2012 (r229695)
@@ -937,7 +937,7 @@ vm_object_sync(vm_object_t object, vm_oo
vm_object_t backing_object;
struct vnode *vp;
struct mount *mp;
- int flags;
+ int flags, fsync_after;
if (object == NULL)
return;
@@ -970,11 +970,26 @@ vm_object_sync(vm_object_t object, vm_oo
(void) vn_start_write(vp, &mp, V_WAIT);
vfslocked = VFS_LOCK_GIANT(vp->v_mount);
vn_lock(vp, LK_EXCLUSIVE | LK_RETRY);
- flags = (syncio || invalidate) ? OBJPC_SYNC : 0;
- flags |= invalidate ? OBJPC_INVAL : 0;
+ if (syncio && !invalidate && offset == 0 &&
+ OFF_TO_IDX(size) == object->size) {
+ /*
+ * If syncing the whole mapping of the file,
+ * it is faster to schedule all the writes in
+ * async mode, also allowing the clustering,
+ * and then wait for i/o to complete.
+ */
+ flags = 0;
+ fsync_after = TRUE;
+ } else {
+ flags = (syncio || invalidate) ? OBJPC_SYNC : 0;
+ flags |= invalidate ? (OBJPC_SYNC | OBJPC_INVAL) : 0;
+ fsync_after = FALSE;
+ }
VM_OBJECT_LOCK(object);
vm_object_page_clean(object, offset, offset + size, flags);
VM_OBJECT_UNLOCK(object);
+ if (fsync_after)
+ (void) VOP_FSYNC(vp, MNT_WAIT, curthread);
VOP_UNLOCK(vp, 0);
VFS_UNLOCK_GIANT(vfslocked);
vn_finished_write(mp);
More information about the svn-src-stable-9
mailing list