kernel - Add MNTK_NOMSYNC and OBJ_NOMSYNC
authorMatthew Dillon <dillon@apollo.backplane.com>
Sat, 20 Feb 2010 03:05:56 +0000 (19:05 -0800)
committerMatthew Dillon <dillon@apollo.backplane.com>
Sat, 20 Feb 2010 03:05:56 +0000 (19:05 -0800)
* Add MNTK_NOMSYNC and OBJ_NOMSYNC for tmpfs, which is used to
  disable msync operations.

sys/kern/vfs_subr.c
sys/sys/mount.h
sys/vm/vm_map.c
sys/vm/vm_object.h
sys/vm/vnode_pager.c

index b847884..50a8a0d 100644 (file)
@@ -2058,6 +2058,18 @@ vfs_msync(struct mount *mp, int flags)
 {
        int vmsc_flags;
 
+       /*
+        * tmpfs sets this flag to prevent msync(), sync, and the
+        * filesystem periodic syncer from trying to flush VM pages
+        * to swap.  Only pure memory pressure flushes tmpfs VM pages
+        * to swap.
+        */
+       if (mp->mnt_kern_flag & MNTK_NOMSYNC)
+               return;
+
+       /*
+        * Ok, scan the vnodes for work.
+        */
        vmsc_flags = VMSC_GETVP;
        if (flags != MNT_WAIT)
                vmsc_flags |= VMSC_NOWAIT;
index 7d14dbe..1a41e16 100644 (file)
@@ -297,6 +297,7 @@ struct mount {
 #define MNTK_WANTRDWR  0x04000000      /* upgrade to read/write requested */
 #define MNTK_FSMID     0x08000000      /* getattr supports FSMIDs */
 #define MNTK_NOSTKMNT  0x10000000      /* no stacked mount point allowed */
+#define MNTK_NOMSYNC   0x20000000      /* used by tmpfs */
 
 /*
  * mountlist_*() defines
index 0d82a27..c7e13d9 100644 (file)
@@ -2356,11 +2356,13 @@ vm_map_set_wired_quick(vm_map_t map, vm_offset_t addr, vm_size_t size, int *coun
  * If syncio is TRUE, dirty pages are written synchronously.
  * If invalidate is TRUE, any cached pages are freed as well.
  *
+ * This routine is called by sys_msync()
+ *
  * Returns an error if any part of the specified range is not mapped.
  */
 int
-vm_map_clean(vm_map_t map, vm_offset_t start, vm_offset_t end, boolean_t syncio,
-    boolean_t invalidate)
+vm_map_clean(vm_map_t map, vm_offset_t start, vm_offset_t end,
+            boolean_t syncio, boolean_t invalidate)
 {
        vm_map_entry_t current;
        vm_map_entry_t entry;
@@ -2433,7 +2435,8 @@ vm_map_clean(vm_map_t map, vm_offset_t start, vm_offset_t end, boolean_t syncio,
                                size = IDX_TO_OFF(object->size) - offset;
                }
                if (object && (object->type == OBJT_VNODE) && 
-                   (current->protection & VM_PROT_WRITE)) {
+                   (current->protection & VM_PROT_WRITE) &&
+                   (object->flags & OBJ_NOMSYNC) == 0) {
                        /*
                         * Flush pages if writing is allowed, invalidate them
                         * if invalidation requested.  Pages undergoing I/O
index b132792..002035c 100644 (file)
@@ -192,6 +192,7 @@ struct vm_object {
 #define OBJ_CLEANING   0x0200
 #define OBJ_DEADWNT    0x1000          /* waiting because object is dead */
 #define        OBJ_ONEMAPPING  0x2000          /* One USE (a single, non-forked) mapping flag */
+#define OBJ_NOMSYNC    0x4000          /* disable msync() system call */
 
 #define IDX_TO_OFF(idx) (((vm_ooffset_t)(idx)) << PAGE_SHIFT)
 #define OFF_TO_IDX(off) ((vm_pindex_t)(((vm_ooffset_t)(off)) >> PAGE_SHIFT))
index d23c0e8..315d429 100644 (file)
@@ -170,6 +170,8 @@ vnode_pager_alloc(void *handle, off_t length, vm_prot_t prot, off_t offset,
                object->handle = handle;
                vp->v_object = object;
                vp->v_filesize = length;
+               if (vp->v_mount && (vp->v_mount->mnt_kern_flag & MNTK_NOMSYNC))
+                       object->flags |= OBJ_NOMSYNC;
        } else {
                object->ref_count++;
                if (object->size != lsize) {