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;
}