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.
This commit is contained in:
parent
ad029167bd
commit
e7f7424d79
|
@ -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, vaddr_t hint, vsize_t length,
|
|||
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, vaddr_t hint, vsize_t length,
|
|||
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
|
||||
|
|
Loading…
Reference in New Issue