Author: kib
Date: Wed Apr  5 16:57:53 2017
New Revision: 316528
URL: https://svnweb.freebsd.org/changeset/base/316528

Log:
  Add V_VMIO flag for vinvalbuf(9) to indicate that the flush request
  was issued during VM-initiated i/o (pageout), so that the function
  does not try to flush or remove pages or wait for the vm object
  paging-in-progress counter.
  
  Reviewed by:  markj
  Tested by:    pho
  Sponsored by: The FreeBSD Foundation
  MFC after:    1 week
  X-Differential revision:      https://reviews.freebsd.org/D10241

Modified:
  head/sys/kern/vfs_subr.c
  head/sys/sys/vnode.h

Modified: head/sys/kern/vfs_subr.c
==============================================================================
--- head/sys/kern/vfs_subr.c    Wed Apr  5 16:57:13 2017        (r316527)
+++ head/sys/kern/vfs_subr.c    Wed Apr  5 16:57:53 2017        (r316528)
@@ -1673,13 +1673,15 @@ bufobj_invalbuf(struct bufobj *bo, int f
         */
        do {
                bufobj_wwait(bo, 0, 0);
-               BO_UNLOCK(bo);
-               if (bo->bo_object != NULL) {
-                       VM_OBJECT_WLOCK(bo->bo_object);
-                       vm_object_pip_wait(bo->bo_object, "bovlbx");
-                       VM_OBJECT_WUNLOCK(bo->bo_object);
+               if ((flags & V_VMIO) == 0) {
+                       BO_UNLOCK(bo);
+                       if (bo->bo_object != NULL) {
+                               VM_OBJECT_WLOCK(bo->bo_object);
+                               vm_object_pip_wait(bo->bo_object, "bovlbx");
+                               VM_OBJECT_WUNLOCK(bo->bo_object);
+                       }
+                       BO_LOCK(bo);
                }
-               BO_LOCK(bo);
        } while (bo->bo_numoutput > 0);
        BO_UNLOCK(bo);
 
@@ -1687,7 +1689,7 @@ bufobj_invalbuf(struct bufobj *bo, int f
         * Destroy the copy in the VM cache, too.
         */
        if (bo->bo_object != NULL &&
-           (flags & (V_ALT | V_NORMAL | V_CLEANONLY)) == 0) {
+           (flags & (V_ALT | V_NORMAL | V_CLEANONLY | V_VMIO)) == 0) {
                VM_OBJECT_WLOCK(bo->bo_object);
                vm_object_page_remove(bo->bo_object, 0, 0, (flags & V_SAVE) ?
                    OBJPR_CLEANONLY : 0);
@@ -1696,7 +1698,7 @@ bufobj_invalbuf(struct bufobj *bo, int f
 
 #ifdef INVARIANTS
        BO_LOCK(bo);
-       if ((flags & (V_ALT | V_NORMAL | V_CLEANONLY)) == 0 &&
+       if ((flags & (V_ALT | V_NORMAL | V_CLEANONLY | V_VMIO)) == 0 &&
            (bo->bo_dirty.bv_cnt > 0 || bo->bo_clean.bv_cnt > 0))
                panic("vinvalbuf: flush failed");
        BO_UNLOCK(bo);

Modified: head/sys/sys/vnode.h
==============================================================================
--- head/sys/sys/vnode.h        Wed Apr  5 16:57:13 2017        (r316527)
+++ head/sys/sys/vnode.h        Wed Apr  5 16:57:53 2017        (r316528)
@@ -402,6 +402,7 @@ extern int          vttoif_tab[];
 #define        V_ALT           0x0002  /* vinvalbuf: invalidate only alternate 
bufs */
 #define        V_NORMAL        0x0004  /* vinvalbuf: invalidate only regular 
bufs */
 #define        V_CLEANONLY     0x0008  /* vinvalbuf: invalidate only clean 
bufs */
+#define        V_VMIO          0x0010  /* vinvalbuf: called during pageout */
 #define        REVOKEALL       0x0001  /* vop_revoke: revoke all aliases */
 #define        V_WAIT          0x0001  /* vn_start_write: sleep for suspend */
 #define        V_NOWAIT        0x0002  /* vn_start_write: don't sleep for 
suspend */
_______________________________________________
svn-src-head@freebsd.org mailing list
https://lists.freebsd.org/mailman/listinfo/svn-src-head
To unsubscribe, send any mail to "svn-src-head-unsubscr...@freebsd.org"

Reply via email to