git: b801c79dda53 - main - vm_fault: Stop specifying VM_ALLOC_ZERO

From: Mark Johnston <markj_at_FreeBSD.org>
Date: Wed, 20 Oct 2021 01:23:24 UTC
The branch main has been updated by markj:

URL: https://cgit.FreeBSD.org/src/commit/?id=b801c79dda53294b55fa19b81d43be25e00ec81f

commit b801c79dda53294b55fa19b81d43be25e00ec81f
Author:     Mark Johnston <markj@FreeBSD.org>
AuthorDate: 2021-10-20 00:27:23 +0000
Commit:     Mark Johnston <markj@FreeBSD.org>
CommitDate: 2021-10-20 01:22:56 +0000

    vm_fault: Stop specifying VM_ALLOC_ZERO
    
    Now vm_page_alloc() and friends will unconditionally preserve PG_ZERO,
    so there is no point in setting this flag.
    
    Eliminate a local variable and add a comment explaining why we
    prioritize the allocation when the process is doomed.
    
    No functional change intended.
    
    Reviewed by:    kib, alc
    Sponsored by:   The FreeBSD Foundation
    Differential Revision:  https://reviews.freebsd.org/D32036
---
 sys/vm/vm_fault.c | 20 ++++++++++----------
 1 file changed, 10 insertions(+), 10 deletions(-)

diff --git a/sys/vm/vm_fault.c b/sys/vm/vm_fault.c
index 8a4b5a543dd6..6bc59222b50e 100644
--- a/sys/vm/vm_fault.c
+++ b/sys/vm/vm_fault.c
@@ -1113,7 +1113,6 @@ static int
 vm_fault_allocate(struct faultstate *fs)
 {
 	struct domainset *dset;
-	int alloc_req;
 	int rv;
 
 	if ((fs->object->flags & OBJ_SIZEVNLOCK) != 0) {
@@ -1150,9 +1149,14 @@ vm_fault_allocate(struct faultstate *fs)
 	/*
 	 * Allocate a new page for this object/offset pair.
 	 *
-	 * Unlocked read of the p_flag is harmless. At worst, the P_KILLED
-	 * might be not observed there, and allocation can fail, causing
-	 * restart and new reading of the p_flag.
+	 * If the process has a fatal signal pending, prioritize the allocation
+	 * with the expectation that the process will exit shortly and free some
+	 * pages.  In particular, the signal may have been posted by the page
+	 * daemon in an attempt to resolve an out-of-memory condition.
+	 *
+	 * The unlocked read of the p_flag is harmless.  At worst, the P_KILLED
+	 * might be not observed here, and allocation fails, causing a restart
+	 * and new reading of the p_flag.
 	 */
 	dset = fs->object->domain.dr_policy;
 	if (dset == NULL)
@@ -1161,12 +1165,8 @@ vm_fault_allocate(struct faultstate *fs)
 #if VM_NRESERVLEVEL > 0
 		vm_object_color(fs->object, atop(fs->vaddr) - fs->pindex);
 #endif
-		alloc_req = P_KILLED(curproc) ?
-		    VM_ALLOC_SYSTEM : VM_ALLOC_NORMAL;
-		if (fs->object->type != OBJT_VNODE &&
-		    fs->object->backing_object == NULL)
-			alloc_req |= VM_ALLOC_ZERO;
-		fs->m = vm_page_alloc(fs->object, fs->pindex, alloc_req);
+		fs->m = vm_page_alloc(fs->object, fs->pindex,
+		    P_KILLED(curproc) ? VM_ALLOC_SYSTEM : 0);
 	}
 	if (fs->m == NULL) {
 		if (vm_fault_allocate_oom(fs))