Author: jeff
Date: Thu Jan 23 05:23:37 2020
New Revision: 357028
URL: https://svnweb.freebsd.org/changeset/base/357028

Log:
  (fault 9/9) Move zero fill into a dedicated function to make the object lock
  state more clear.
  
  Reviewed by:  kib
  Differential Revision:        https://reviews.freebsd.org/D23326

Modified:
  head/sys/vm/vm_fault.c

Modified: head/sys/vm/vm_fault.c
==============================================================================
--- head/sys/vm/vm_fault.c      Thu Jan 23 05:22:02 2020        (r357027)
+++ head/sys/vm/vm_fault.c      Thu Jan 23 05:23:37 2020        (r357028)
@@ -960,35 +960,8 @@ vm_fault_next(struct faultstate *fs)
         */
        VM_OBJECT_ASSERT_WLOCKED(fs->object);
        next_object = fs->object->backing_object;
-       if (next_object == NULL) {
-               /*
-                * If there's no object left, fill the page in the top
-                * object with zeros.
-                */
-               VM_OBJECT_WUNLOCK(fs->object);
-               if (fs->object != fs->first_object) {
-                       vm_object_pip_wakeup(fs->object);
-                       fs->object = fs->first_object;
-                       fs->pindex = fs->first_pindex;
-               }
-               MPASS(fs->first_m != NULL);
-               MPASS(fs->m == NULL);
-               fs->m = fs->first_m;
-               fs->first_m = NULL;
-
-               /*
-                * Zero the page if necessary and mark it valid.
-                */
-               if ((fs->m->flags & PG_ZERO) == 0) {
-                       pmap_zero_page(fs->m);
-               } else {
-                       VM_CNT_INC(v_ozfod);
-               }
-               VM_CNT_INC(v_zfod);
-               vm_page_valid(fs->m);
-
+       if (next_object == NULL)
                return (false);
-       }
        MPASS(fs->first_m != NULL);
        KASSERT(fs->object != next_object, ("object loop %p", next_object));
        VM_OBJECT_WLOCK(next_object);
@@ -1002,6 +975,36 @@ vm_fault_next(struct faultstate *fs)
        return (true);
 }
 
+static void
+vm_fault_zerofill(struct faultstate *fs)
+{
+
+       /*
+        * If there's no object left, fill the page in the top
+        * object with zeros.
+        */
+       if (fs->object != fs->first_object) {
+               vm_object_pip_wakeup(fs->object);
+               fs->object = fs->first_object;
+               fs->pindex = fs->first_pindex;
+       }
+       MPASS(fs->first_m != NULL);
+       MPASS(fs->m == NULL);
+       fs->m = fs->first_m;
+       fs->first_m = NULL;
+
+       /*
+        * Zero the page if necessary and mark it valid.
+        */
+       if ((fs->m->flags & PG_ZERO) == 0) {
+               pmap_zero_page(fs->m);
+       } else {
+               VM_CNT_INC(v_ozfod);
+       }
+       VM_CNT_INC(v_zfod);
+       vm_page_valid(fs->m);
+}
+
 /*
  * Allocate a page directly or via the object populate method.
  */
@@ -1407,11 +1410,13 @@ RetryFault:
                 * traverse into a backing object or zero fill if none is
                 * found.
                 */
-               if (!vm_fault_next(&fs)) {
-                       /* Don't try to prefault neighboring pages. */
-                       faultcount = 1;
-                       break;  /* break to PAGE HAS BEEN FOUND. */
-               }
+               if (vm_fault_next(&fs))
+                       continue;
+               VM_OBJECT_WUNLOCK(fs.object);
+               vm_fault_zerofill(&fs);
+               /* Don't try to prefault neighboring pages. */
+               faultcount = 1;
+               break;  /* break to PAGE HAS BEEN FOUND. */
        }
 
        /*
_______________________________________________
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