Module Name:    src
Committed By:   martin
Date:           Sat Apr  1 16:00:29 UTC 2023

Modified Files:
        src/sys/uvm [netbsd-9]: uvm_map.c

Log Message:
Pull up following revision(s) (requested by riastradh in ticket #1622):

        sys/uvm/uvm_map.c: revision 1.395

uvm(9): Fix 19-year-old bug in assertion about mmap hint.

Previously this would _first_ remember the original hint, and _then_
clamp the hint to the VM map's range:

        orig_hint = hint;
        if (hint < vm_map_min(map)) {   /* check ranges ... */
                if (flags & UVM_FLAG_FIXED) {
                        UVMHIST_LOG(maphist,"<- VA below map range",0,0,0,0);
                        return (NULL);
                }
                hint = vm_map_min(map);
        ...
        KASSERTMSG(!topdown || hint <= orig_hint, "hint: %#jx, orig_hint: %#jx",
            (uintmax_t)hint, (uintmax_t)orig_hint);

Even if nothing else happens in the ellipsis, taking the branch
guarantees the assertion will fail in the topdown case.


To generate a diff of this commit:
cvs rdiff -u -r1.362.2.2 -r1.362.2.3 src/sys/uvm/uvm_map.c

Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.

Modified files:

Index: src/sys/uvm/uvm_map.c
diff -u src/sys/uvm/uvm_map.c:1.362.2.2 src/sys/uvm/uvm_map.c:1.362.2.3
--- src/sys/uvm/uvm_map.c:1.362.2.2	Fri Nov  1 18:24:31 2019
+++ src/sys/uvm/uvm_map.c	Sat Apr  1 16:00:28 2023
@@ -1,4 +1,4 @@
-/*	$NetBSD: uvm_map.c,v 1.362.2.2 2019/11/01 18:24:31 martin Exp $	*/
+/*	$NetBSD: uvm_map.c,v 1.362.2.3 2023/04/01 16:00:28 martin Exp $	*/
 
 /*
  * Copyright (c) 1997 Charles D. Cranor and Washington University.
@@ -66,7 +66,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: uvm_map.c,v 1.362.2.2 2019/11/01 18:24:31 martin Exp $");
+__KERNEL_RCSID(0, "$NetBSD: uvm_map.c,v 1.362.2.3 2023/04/01 16:00:28 martin Exp $");
 
 #include "opt_ddb.h"
 #include "opt_pax.h"
@@ -1882,12 +1882,17 @@ uvm_map_findspace(struct vm_map *map, va
 	uvm_map_check(map, "map_findspace entry");
 
 	/*
-	 * remember the original hint.  if we are aligning, then we
-	 * may have to try again with no alignment constraint if
-	 * we fail the first time.
+	 * Clamp the hint to the VM map's min/max address, and remmeber
+	 * the clamped original hint.  Remember the original hint,
+	 * clamped to the min/max address.  If we are aligning, then we
+	 * may have to try again with no alignment constraint if we
+	 * fail the first time.
+	 *
+	 * We use the original hint to verify later that the search has
+	 * been monotonic -- that is, nonincreasing or nondecreasing,
+	 * according to topdown or !topdown respectively.  But the
+	 * clamping is not monotonic.
 	 */
-
-	orig_hint = hint;
 	if (hint < vm_map_min(map)) {	/* check ranges ... */
 		if (flags & UVM_FLAG_FIXED) {
 			UVMHIST_LOG(maphist,"<- VA below map range",0,0,0,0);
@@ -1900,6 +1905,7 @@ uvm_map_findspace(struct vm_map *map, va
 		    hint, vm_map_min(map), vm_map_max(map), 0);
 		return (NULL);
 	}
+	orig_hint = hint;
 
 	/*
 	 * hint may not be aligned properly; we need round up or down it

Reply via email to