> Date: Thu, 19 Oct 2017 14:49:24 +0000
> From: Taylor R Campbell <[email protected]>
> 
> Attached is a patch that attempts to restore the original behaviour of
> carving out enough KVA on boot, by setting the exec_pool low-water
> mark to be the same as the hard limit.

On reflection, this patch has the downside of always reserving 4 MB of
RAM up front, which the original exec_map approach did not.  Attached
is another patch that reintroduces exec_map (but in MI code, not a
copy of it in all MD code) and pool-allocates from that, without a
low-water mark.  Compile-tested only so far.
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);

Reply via email to