Author: kib
Date: Mon Feb 12 10:34:15 2018
New Revision: 329156
URL: https://svnweb.freebsd.org/changeset/base/329156

Log:
  MFC r328880:
  On munlock(), unwire correct page.

Modified:
  stable/11/sys/vm/vm_object.c
Directory Properties:
  stable/11/   (props changed)

Modified: stable/11/sys/vm/vm_object.c
==============================================================================
--- stable/11/sys/vm/vm_object.c        Mon Feb 12 06:52:49 2018        
(r329155)
+++ stable/11/sys/vm/vm_object.c        Mon Feb 12 10:34:15 2018        
(r329156)
@@ -2268,7 +2268,7 @@ void
 vm_object_unwire(vm_object_t object, vm_ooffset_t offset, vm_size_t length,
     uint8_t queue)
 {
-       vm_object_t tobject;
+       vm_object_t tobject, t1object;
        vm_page_t m, tm;
        vm_pindex_t end_pindex, pindex, tpindex;
        int depth, locked_depth;
@@ -2282,6 +2282,7 @@ vm_object_unwire(vm_object_t object, vm_ooffset_t offs
                return;
        pindex = OFF_TO_IDX(offset);
        end_pindex = pindex + atop(length);
+again:
        locked_depth = 1;
        VM_OBJECT_RLOCK(object);
        m = vm_page_find_least(object, pindex);
@@ -2315,16 +2316,26 @@ vm_object_unwire(vm_object_t object, vm_ooffset_t offs
                        m = TAILQ_NEXT(m, listq);
                }
                vm_page_lock(tm);
+               if (vm_page_xbusied(tm)) {
+                       for (tobject = object; locked_depth >= 1;
+                           locked_depth--) {
+                               t1object = tobject->backing_object;
+                               VM_OBJECT_RUNLOCK(tobject);
+                               tobject = t1object;
+                       }
+                       vm_page_busy_sleep(tm, "unwbo", true);
+                       goto again;
+               }
                vm_page_unwire(tm, queue);
                vm_page_unlock(tm);
 next_page:
                pindex++;
        }
        /* Release the accumulated object locks. */
-       for (depth = 0; depth < locked_depth; depth++) {
-               tobject = object->backing_object;
-               VM_OBJECT_RUNLOCK(object);
-               object = tobject;
+       for (tobject = object; locked_depth >= 1; locked_depth--) {
+               t1object = tobject->backing_object;
+               VM_OBJECT_RUNLOCK(tobject);
+               tobject = t1object;
        }
 }
 
_______________________________________________
svn-src-all@freebsd.org mailing list
https://lists.freebsd.org/mailman/listinfo/svn-src-all
To unsubscribe, send any mail to "svn-src-all-unsubscr...@freebsd.org"

Reply via email to