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