Index: sys/kern/kern_exec.c =================================================================== RCS file: /cvsroot/src/sys/kern/kern_exec.c,v retrieving revision 1.446 diff -p -u -r1.446 kern_exec.c --- sys/kern/kern_exec.c 29 Sep 2017 17:47:29 -0000 1.446 +++ sys/kern/kern_exec.c 19 Oct 2017 15:02:24 -0000 @@ -280,11 +280,14 @@ struct spawn_exec_data { volatile uint32_t sed_refcnt; }; +static struct vm_map *exec_map; +static struct pool exec_pool; + static void * exec_pool_alloc(struct pool *pp, int flags) { - return (void *)uvm_km_alloc(kernel_map, NCARGS, 0, + return (void *)uvm_km_alloc(exec_map, NCARGS, 0, UVM_KMF_PAGEABLE | UVM_KMF_WAITVA); } @@ -292,11 +295,9 @@ static void exec_pool_free(struct pool *pp, void *addr) { - uvm_km_free(kernel_map, (vaddr_t)addr, NCARGS, UVM_KMF_PAGEABLE); + uvm_km_free(exec_map, (vaddr_t)addr, NCARGS, UVM_KMF_PAGEABLE); } -static struct pool exec_pool; - static struct pool_allocator exec_palloc = { .pa_alloc = exec_pool_alloc, .pa_free = exec_pool_free, @@ -1820,8 +1821,12 @@ exec_init(int init_boot) if (init_boot) { /* do one-time initializations */ + vaddr_t vmin, vmax; + rw_init(&exec_lock); mutex_init(&sigobject_lock, MUTEX_DEFAULT, IPL_NONE); + exec_map = uvm_km_suballoc(kernel_map, &vmin, &vmax, + maxexec*NCARGS, VM_MAP_PAGEABLE, false, NULL); pool_init(&exec_pool, NCARGS, 0, 0, PR_NOALIGN|PR_NOTOUCH, "execargs", &exec_palloc, IPL_NONE); pool_sethardlimit(&exec_pool, maxexec, "should not happen", 0);