svn commit: r229696 - stable/8/sys/vm
Konstantin Belousov
kib at FreeBSD.org
Fri Jan 6 11:06:49 UTC 2012
Author: kib
Date: Fri Jan 6 11:06:48 2012
New Revision: 229696
URL: http://svn.freebsd.org/changeset/base/229696
Log:
MFC r228838:
Optimize the common case of msyncing the whole file mapping with
MS_SYNC flag.
Modified:
stable/8/sys/vm/vm_object.c
Directory Properties:
stable/8/sys/ (props changed)
Modified: stable/8/sys/vm/vm_object.c
==============================================================================
--- stable/8/sys/vm/vm_object.c Fri Jan 6 11:06:15 2012 (r229695)
+++ stable/8/sys/vm/vm_object.c Fri Jan 6 11:06:48 2012 (r229696)
@@ -942,7 +942,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;
@@ -975,14 +975,29 @@ 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,
OFF_TO_IDX(offset),
OFF_TO_IDX(offset + size + PAGE_MASK),
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-all
mailing list