Module Name: src Committed By: chs Date: Sat May 20 07:27:15 UTC 2017
Modified Files: src/share/man/man9: uvm_map.9 src/sys/uvm: uvm_extern.h uvm_map.c uvm_mmap.c Log Message: MAP_FIXED means something different for mremap() than it does for mmap(), so we cannot use UVM_FLAG_FIXED to specify both behaviors. keep UVM_FLAG_FIXED with its earlier meaning (prior to my previous change) of whether to use uvm_map_findspace() to locate space for the new mapping or to use the hint address that the caller passed in, and add a new flag UVM_FLAG_UNMAP to indicate that any existing entries in the range should be unmapped as part of creating the new mapping. the new UVM_FLAG_UNMAP flag may only be used if UVM_FLAG_FIXED is also specified. To generate a diff of this commit: cvs rdiff -u -r1.8 -r1.9 src/share/man/man9/uvm_map.9 cvs rdiff -u -r1.205 -r1.206 src/sys/uvm/uvm_extern.h cvs rdiff -u -r1.348 -r1.349 src/sys/uvm/uvm_map.c cvs rdiff -u -r1.165 -r1.166 src/sys/uvm/uvm_mmap.c Please note that diffs are not public domain; they are subject to the copyright notices on the relevant files.
Modified files: Index: src/share/man/man9/uvm_map.9 diff -u src/share/man/man9/uvm_map.9:1.8 src/share/man/man9/uvm_map.9:1.9 --- src/share/man/man9/uvm_map.9:1.8 Sun May 14 12:31:13 2017 +++ src/share/man/man9/uvm_map.9 Sat May 20 07:27:15 2017 @@ -1,4 +1,4 @@ -.\" $NetBSD: uvm_map.9,v 1.8 2017/05/14 12:31:13 wiz Exp $ +.\" $NetBSD: uvm_map.9,v 1.9 2017/05/20 07:27:15 chs Exp $ .\" .\" Copyright (c) 1998 Matthew R. Green .\" All rights reserved. @@ -239,6 +239,12 @@ Sleep until VA space is available, if it Unmap only VA space. Used by .Fn uvm_unmap . +.It UVM_FLAG_UNMAP +Any existing entires in the range for this mapping should be +unmapped as part of creating the new mapping. Use of this flag +without also specifying +.Dv UVM_FLAG_FIXED +is a bug. .El .Pp The Index: src/sys/uvm/uvm_extern.h diff -u src/sys/uvm/uvm_extern.h:1.205 src/sys/uvm/uvm_extern.h:1.206 --- src/sys/uvm/uvm_extern.h:1.205 Wed May 17 22:43:12 2017 +++ src/sys/uvm/uvm_extern.h Sat May 20 07:27:15 2017 @@ -1,4 +1,4 @@ -/* $NetBSD: uvm_extern.h,v 1.205 2017/05/17 22:43:12 christos Exp $ */ +/* $NetBSD: uvm_extern.h,v 1.206 2017/05/20 07:27:15 chs Exp $ */ /* * Copyright (c) 1997 Charles D. Cranor and Washington University. @@ -121,16 +121,17 @@ #define UVM_ADV_MASK 0x7 /* mask */ /* bits 0xffff0000: mapping flags */ -#define UVM_FLAG_FIXED 0x010000 /* find space */ -#define UVM_FLAG_OVERLAY 0x020000 /* establish overlay */ -#define UVM_FLAG_NOMERGE 0x040000 /* don't merge map entries */ -#define UVM_FLAG_COPYONW 0x080000 /* set copy_on_write flag */ -#define UVM_FLAG_AMAPPAD 0x100000 /* for bss: pad amap to reduce allocations */ -#define UVM_FLAG_TRYLOCK 0x200000 /* fail if we can not lock map */ -#define UVM_FLAG_NOWAIT 0x400000 /* not allowed to sleep */ -#define UVM_FLAG_WAITVA 0x800000 /* wait for va */ -#define UVM_FLAG_VAONLY 0x2000000 /* unmap: no pages are mapped */ -#define UVM_FLAG_COLORMATCH 0x4000000 /* match color given in off */ +#define UVM_FLAG_FIXED 0x00010000 /* find space */ +#define UVM_FLAG_OVERLAY 0x00020000 /* establish overlay */ +#define UVM_FLAG_NOMERGE 0x00040000 /* don't merge map entries */ +#define UVM_FLAG_COPYONW 0x00080000 /* set copy_on_write flag */ +#define UVM_FLAG_AMAPPAD 0x00100000 /* for bss: pad amap */ +#define UVM_FLAG_TRYLOCK 0x00200000 /* fail if we can not lock map */ +#define UVM_FLAG_NOWAIT 0x00400000 /* not allowed to sleep */ +#define UVM_FLAG_WAITVA 0x00800000 /* wait for va */ +#define UVM_FLAG_VAONLY 0x02000000 /* unmap: no pages are mapped */ +#define UVM_FLAG_COLORMATCH 0x04000000 /* match color given in off */ +#define UVM_FLAG_UNMAP 0x08000000 /* unmap existing entries */ #define UVM_FLAG_BITS "\177\020\ F\0\3\ @@ -172,7 +173,9 @@ b\25TRYLOCK\0\ b\26NOWAIT\0\ b\27WAITVA\0\ b\30VAONLY\0\ -b\31COLORMATCH\0" +b\31COLORMATCH\0\ +b\32UNMAP\0\ +" /* macros to extract info */ #define UVM_PROTECTION(X) ((X) & UVM_PROT_MASK) Index: src/sys/uvm/uvm_map.c diff -u src/sys/uvm/uvm_map.c:1.348 src/sys/uvm/uvm_map.c:1.349 --- src/sys/uvm/uvm_map.c:1.348 Fri May 19 16:56:35 2017 +++ src/sys/uvm/uvm_map.c Sat May 20 07:27:15 2017 @@ -1,4 +1,4 @@ -/* $NetBSD: uvm_map.c,v 1.348 2017/05/19 16:56:35 kamil Exp $ */ +/* $NetBSD: uvm_map.c,v 1.349 2017/05/20 07:27:15 chs 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.348 2017/05/19 16:56:35 kamil Exp $"); +__KERNEL_RCSID(0, "$NetBSD: uvm_map.c,v 1.349 2017/05/20 07:27:15 chs Exp $"); #include "opt_ddb.h" #include "opt_pax.h" @@ -1163,7 +1163,8 @@ retry: } vm_map_lock(map); /* could sleep here */ } - if (flags & UVM_FLAG_FIXED) { + if (flags & UVM_FLAG_UNMAP) { + KASSERT(flags & UVM_FLAG_FIXED); KASSERT((flags & UVM_FLAG_NOWAIT) == 0); /* @@ -1301,8 +1302,8 @@ uvm_map_enter(struct vm_map *map, const KASSERT(map->hint == prev_entry); /* bimerge case assumes this */ KASSERT(vm_map_locked_p(map)); - KASSERT((flags & (UVM_FLAG_NOWAIT | UVM_FLAG_FIXED)) != - (UVM_FLAG_NOWAIT | UVM_FLAG_FIXED)); + KASSERT((flags & (UVM_FLAG_NOWAIT | UVM_FLAG_UNMAP)) != + (UVM_FLAG_NOWAIT | UVM_FLAG_UNMAP)); if (uobj) newetype = UVM_ET_OBJ; @@ -1316,12 +1317,13 @@ uvm_map_enter(struct vm_map *map, const } /* - * For fixed mappings, remove any old entries now. Adding the new + * For mappings with unmap, remove any old entries now. Adding the new * entry cannot fail because that can only happen if UVM_FLAG_NOWAIT - * is set, and we do not support nowait and fixed together. + * is set, and we do not support nowait and unmap together. */ - if (flags & UVM_FLAG_FIXED) { + if (flags & UVM_FLAG_UNMAP) { + KASSERT(flags & UVM_FLAG_FIXED); uvm_unmap_remove(map, start, start + size, &dead_entries, 0); #ifdef DEBUG struct vm_map_entry *tmp_entry; Index: src/sys/uvm/uvm_mmap.c diff -u src/sys/uvm/uvm_mmap.c:1.165 src/sys/uvm/uvm_mmap.c:1.166 --- src/sys/uvm/uvm_mmap.c:1.165 Fri May 19 15:30:19 2017 +++ src/sys/uvm/uvm_mmap.c Sat May 20 07:27:15 2017 @@ -1,4 +1,4 @@ -/* $NetBSD: uvm_mmap.c,v 1.165 2017/05/19 15:30:19 chs Exp $ */ +/* $NetBSD: uvm_mmap.c,v 1.166 2017/05/20 07:27:15 chs Exp $ */ /* * Copyright (c) 1997 Charles D. Cranor and Washington University. @@ -46,7 +46,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: uvm_mmap.c,v 1.165 2017/05/19 15:30:19 chs Exp $"); +__KERNEL_RCSID(0, "$NetBSD: uvm_mmap.c,v 1.166 2017/05/20 07:27:15 chs Exp $"); #include "opt_compat_netbsd.h" #include "opt_pax.h" @@ -932,7 +932,7 @@ uvm_mmap(struct vm_map *map, vaddr_t *ad } else { if (*addr & PAGE_MASK) return EINVAL; - uvmflag |= UVM_FLAG_FIXED; + uvmflag |= UVM_FLAG_FIXED | UVM_FLAG_UNMAP; } /*