A few more conversions to km_alloc: exec arguments, kernel stacks and
pipe buffers.

Tested on amd64, i386 and sparc. Please give it a spin on other architectures,
I would be especially interested in mips64 since it's the only one that needs
kernel stack alignment.

//art

Index: kern/kern_exec.c
===================================================================
RCS file: /cvs/src/sys/kern/kern_exec.c,v
retrieving revision 1.117
diff -u -r1.117 kern_exec.c
--- kern/kern_exec.c    4 Apr 2011 13:00:13 -0000       1.117
+++ kern/kern_exec.c    5 Apr 2011 20:45:08 -0000
@@ -227,6 +227,11 @@
        return (error);
 }
 
+struct kmem_va_mode kv_exec = {
+       .kv_map = &exec_map,
+       .kv_wait = 1
+};
+
 /*
  * exec system call
  */
@@ -312,7 +317,7 @@
        /* XXX -- THE FOLLOWING SECTION NEEDS MAJOR CLEANUP */
 
        /* allocate an argument buffer */
-       argp = (char *) uvm_km_valloc_wait(exec_map, NCARGS);
+       argp = km_alloc(NCARGS, &kv_exec, &kp_pageable, &kd_waitok);
 #ifdef DIAGNOSTIC
        if (argp == NULL)
                panic("execve: argp == NULL");
@@ -592,7 +597,7 @@
                splx(s);
        }
 
-       uvm_km_free_wakeup(exec_map, (vaddr_t) argp, NCARGS);
+       km_free(argp, NCARGS, &kv_exec, &kp_pageable);
 
        pool_put(&namei_pool, nid.ni_cnd.cn_pnbuf);
        vn_close(pack.ep_vp, FREAD, cred, p);
@@ -689,7 +694,7 @@
        /* close and put the exec'd file */
        vn_close(pack.ep_vp, FREAD, cred, p);
        pool_put(&namei_pool, nid.ni_cnd.cn_pnbuf);
-       uvm_km_free_wakeup(exec_map, (vaddr_t) argp, NCARGS);
+       km_free(argp, NCARGS, &kv_exec, &kp_pageable);
 
  freehdr:
        free(pack.ep_hdr, M_EXEC);
@@ -717,7 +722,7 @@
                free(pack.ep_emul_arg, M_TEMP);
        pool_put(&namei_pool, nid.ni_cnd.cn_pnbuf);
        vn_close(pack.ep_vp, FREAD, cred, p);
-       uvm_km_free_wakeup(exec_map, (vaddr_t) argp, NCARGS);
+       km_free(argp, NCARGS, &kv_exec, &kp_pageable);
 
 free_pack_abort:
        free(pack.ep_hdr, M_EXEC);
Index: kern/kern_fork.c
===================================================================
RCS file: /cvs/src/sys/kern/kern_fork.c,v
retrieving revision 1.125
diff -u -r1.125 kern_fork.c
--- kern/kern_fork.c    3 Apr 2011 14:56:28 -0000       1.125
+++ kern/kern_fork.c    5 Apr 2011 20:45:08 -0000
@@ -195,6 +195,11 @@
 /* print the 'table full' message once per 10 seconds */
 struct timeval fork_tfmrate = { 10, 0 };
 
+struct kmem_va_mode kv_fork = {
+       .kv_map = &kernel_map,
+       .kv_align = USPACE_ALIGN
+};
+
 int
 fork1(struct proc *p1, int exitsig, int flags, void *stack, size_t stacksize,
     void (*func)(void *), void *arg, register_t *retval,
@@ -204,7 +209,7 @@
        uid_t uid;
        struct vmspace *vm;
        int count;
-       vaddr_t uaddr;
+       struct user *uaddr;
        int s;
        extern void endtsleep(void *);
        extern void realitexpire(void *);
@@ -251,10 +256,7 @@
                return (EAGAIN);
        }
 
-       uaddr = uvm_km_kmemalloc_pla(kernel_map, uvm.kernel_object, USPACE,
-           USPACE_ALIGN, UVM_KMF_ZERO,
-           dma_constraint.ucr_low, dma_constraint.ucr_high,
-           0, 0, USPACE/PAGE_SIZE);
+       uaddr = km_alloc(USPACE, &kv_fork, &kp_dma_zero, &kd_waitok);
        if (uaddr == 0) {
                chgproccnt(uid, -1);
                nprocs--;
Index: kern/sys_pipe.c
===================================================================
RCS file: /cvs/src/sys/kern/sys_pipe.c,v
retrieving revision 1.58
diff -u -r1.58 sys_pipe.c
--- kern/sys_pipe.c     14 Jan 2010 23:12:11 -0000      1.58
+++ kern/sys_pipe.c     5 Apr 2011 20:45:08 -0000
@@ -168,9 +168,9 @@
 int
 pipespace(struct pipe *cpipe, u_int size)
 {
-       caddr_t buffer;
+       void *buffer;
 
-       buffer = (caddr_t)uvm_km_valloc(kernel_map, size);
+       buffer = km_alloc(size, &kv_any, &kp_pageable, &kd_waitok);
        if (buffer == NULL) {
                return (ENOMEM);
        }
@@ -714,8 +714,8 @@
                if (cpipe->pipe_buffer.size > PIPE_SIZE)
                        --nbigpipe;
                amountpipekva -= cpipe->pipe_buffer.size;
-               uvm_km_free(kernel_map, (vaddr_t)cpipe->pipe_buffer.buffer,
-                   cpipe->pipe_buffer.size);
+               km_free(cpipe->pipe_buffer.buffer, cpipe->pipe_buffer.size,
+                   &kv_any, &kp_pageable);
                cpipe->pipe_buffer.buffer = NULL;
        }
 }
Index: uvm/uvm_glue.c
===================================================================
RCS file: /cvs/src/sys/uvm/uvm_glue.c,v
retrieving revision 1.56
diff -u -r1.56 uvm_glue.c
--- uvm/uvm_glue.c      1 Apr 2011 15:43:13 -0000       1.56
+++ uvm/uvm_glue.c      5 Apr 2011 20:45:08 -0000
@@ -361,9 +361,11 @@
 void
 uvm_exit(struct proc *p)
 {
+       extern struct kmem_va_mode kv_fork;
+
        uvmspace_free(p->p_vmspace);
        p->p_vmspace = NULL;
-       uvm_km_free(kernel_map, (vaddr_t)p->p_addr, USPACE);
+       km_free(p->p_addr, USPACE, &kv_fork, &kp_dma);
        p->p_addr = NULL;
 }

Reply via email to