svn commit: r357028 - head/sys/vm
Jeff Roberson
jeff at FreeBSD.org
Thu Jan 23 05:23:37 UTC 2020
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. */
}
/*
More information about the svn-src-head
mailing list