Author: jeff
Date: Tue Oct 29 20:46:25 2019
New Revision: 354156
URL: https://svnweb.freebsd.org/changeset/base/354156

Log:
  Drop the object lock earlier in fault and don't relock it after pmap_enter().
  
  Recent changes in object and page locking have enabled more lock pushdown.
  
  Reviewed by:  kib
  Tested by:    pho
  Differential Revision:        https://reviews.freebsd.org/D22036

Modified:
  head/sys/vm/vm_fault.c

Modified: head/sys/vm/vm_fault.c
==============================================================================
--- head/sys/vm/vm_fault.c      Tue Oct 29 20:37:59 2019        (r354155)
+++ head/sys/vm/vm_fault.c      Tue Oct 29 20:46:25 2019        (r354156)
@@ -184,11 +184,10 @@ unlock_vp(struct faultstate *fs)
 }
 
 static void
-unlock_and_deallocate(struct faultstate *fs)
+fault_deallocate(struct faultstate *fs)
 {
 
        vm_object_pip_wakeup(fs->object);
-       VM_OBJECT_WUNLOCK(fs->object);
        if (fs->object != fs->first_object) {
                VM_OBJECT_WLOCK(fs->first_object);
                vm_page_free(fs->first_m);
@@ -202,6 +201,14 @@ unlock_and_deallocate(struct faultstate *fs)
 }
 
 static void
+unlock_and_deallocate(struct faultstate *fs)
+{
+
+       VM_OBJECT_WUNLOCK(fs->object);
+       fault_deallocate(fs);
+}
+
+static void
 vm_fault_dirty(vm_map_entry_t entry, vm_page_t m, vm_prot_t prot,
     vm_prot_t fault_type, int fault_flags, bool set_wd)
 {
@@ -1261,10 +1268,12 @@ readrest:
                                    fs.object, OFF_TO_IDX(
                                    fs.first_object->backing_object_offset));
 #endif
+                               VM_OBJECT_WUNLOCK(fs.object);
                                fs.first_m = fs.m;
                                fs.m = NULL;
                                VM_CNT_INC(v_cow_optim);
                        } else {
+                               VM_OBJECT_WUNLOCK(fs.object);
                                /*
                                 * Oh, well, lets copy it.
                                 */
@@ -1285,7 +1294,6 @@ readrest:
                         * conditional
                         */
                        vm_object_pip_wakeup(fs.object);
-                       VM_OBJECT_WUNLOCK(fs.object);
 
                        /*
                         * We only try to prefault read-only mappings to the
@@ -1405,7 +1413,6 @@ readrest:
                vm_fault_prefault(&fs, vaddr,
                    faultcount > 0 ? behind : PFBAK,
                    faultcount > 0 ? ahead : PFFOR, false);
-       VM_OBJECT_WLOCK(fs.object);
 
        /*
         * If the page is not wired down, then put it where the pageout daemon
@@ -1427,7 +1434,7 @@ readrest:
        /*
         * Unlock everything, and return
         */
-       unlock_and_deallocate(&fs);
+       fault_deallocate(&fs);
        if (hardfault) {
                VM_CNT_INC(v_io_faults);
                curthread->td_ru.ru_majflt++;
_______________________________________________
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