Module Name: src
Committed By: maxv
Date: Wed Jul 27 16:45:00 UTC 2016
Modified Files:
src/sys/uvm: uvm_km.c
Log Message:
Use UVM_PROT_ALL only if UVM_KMF_EXEC is given as argument. Otherwise, if
UVM_KMF_PAGEABLE is also given as argument, only the VA is allocated and
UVM waits for the page to fault before kentering it. When kentering it, it
will use the UVM_PROT_ flag that was passed to uvm_map; which means that it
will kenter it as RWX.
With this change, the number of RWX pages in the amd64 kernel reaches
strictly zero.
To generate a diff of this commit:
cvs rdiff -u -r1.140 -r1.141 src/sys/uvm/uvm_km.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_km.c
diff -u src/sys/uvm/uvm_km.c:1.140 src/sys/uvm/uvm_km.c:1.141
--- src/sys/uvm/uvm_km.c:1.140 Wed Jul 20 12:38:43 2016
+++ src/sys/uvm/uvm_km.c Wed Jul 27 16:45:00 2016
@@ -1,4 +1,4 @@
-/* $NetBSD: uvm_km.c,v 1.140 2016/07/20 12:38:43 maxv Exp $ */
+/* $NetBSD: uvm_km.c,v 1.141 2016/07/27 16:45:00 maxv Exp $ */
/*
* Copyright (c) 1997 Charles D. Cranor and Washington University.
@@ -152,7 +152,7 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: uvm_km.c,v 1.140 2016/07/20 12:38:43 maxv Exp $");
+__KERNEL_RCSID(0, "$NetBSD: uvm_km.c,v 1.141 2016/07/27 16:45:00 maxv Exp $");
#include "opt_uvmhist.h"
@@ -593,7 +593,7 @@ uvm_km_alloc(struct vm_map *map, vsize_t
struct vm_page *pg;
struct uvm_object *obj;
int pgaflags;
- vm_prot_t prot;
+ vm_prot_t prot, vaprot;
UVMHIST_FUNC(__func__); UVMHIST_CALLED(maphist);
KASSERT(vm_map_pmap(map) == pmap_kernel());
@@ -617,8 +617,9 @@ uvm_km_alloc(struct vm_map *map, vsize_t
* allocate some virtual space
*/
+ vaprot = (flags & UVM_KMF_EXEC) ? UVM_PROT_ALL : UVM_PROT_RW;
if (__predict_false(uvm_map(map, &kva, size, obj, UVM_UNKNOWN_OFFSET,
- align, UVM_MAPFLAG(UVM_PROT_ALL, UVM_PROT_ALL, UVM_INH_NONE,
+ align, UVM_MAPFLAG(vaprot, UVM_PROT_ALL, UVM_INH_NONE,
UVM_ADV_RANDOM,
(flags & (UVM_KMF_TRYLOCK | UVM_KMF_NOWAIT | UVM_KMF_WAITVA
| UVM_KMF_COLORMATCH)))) != 0)) {