Module Name: src Committed By: pooka Date: Thu Oct 15 16:39:22 UTC 2009
Modified Files: src/sys/rump/librump/rumpkern: emul.c locks.c rump.c rump_private.h rumpkern.ifspec scheduler.c sysproxy_socket.c src/sys/rump/librump/rumpkern/arch/i386: rumpcpu.c Log Message: Give lwp usage some much-needed love: stop treating lwp0 as the all-sink and make sure each separate thread in rump has its own lwp. Happy-go-lucky callers will get scheduled a temporary lwp on entry, while true lwp connoisseurs may request a stable lwp for their purposes. Some more love may be required later down the road, but for now different threads will stepping on each others toes. To generate a diff of this commit: cvs rdiff -u -r1.101 -r1.102 src/sys/rump/librump/rumpkern/emul.c cvs rdiff -u -r1.29 -r1.30 src/sys/rump/librump/rumpkern/locks.c cvs rdiff -u -r1.124 -r1.125 src/sys/rump/librump/rumpkern/rump.c cvs rdiff -u -r1.31 -r1.32 src/sys/rump/librump/rumpkern/rump_private.h cvs rdiff -u -r1.1 -r1.2 src/sys/rump/librump/rumpkern/rumpkern.ifspec \ src/sys/rump/librump/rumpkern/scheduler.c cvs rdiff -u -r1.4 -r1.5 src/sys/rump/librump/rumpkern/sysproxy_socket.c cvs rdiff -u -r1.6 -r1.7 src/sys/rump/librump/rumpkern/arch/i386/rumpcpu.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/rump/librump/rumpkern/emul.c diff -u src/sys/rump/librump/rumpkern/emul.c:1.101 src/sys/rump/librump/rumpkern/emul.c:1.102 --- src/sys/rump/librump/rumpkern/emul.c:1.101 Thu Oct 15 00:28:46 2009 +++ src/sys/rump/librump/rumpkern/emul.c Thu Oct 15 16:39:22 2009 @@ -1,4 +1,4 @@ -/* $NetBSD: emul.c,v 1.101 2009/10/15 00:28:46 pooka Exp $ */ +/* $NetBSD: emul.c,v 1.102 2009/10/15 16:39:22 pooka Exp $ */ /* * Copyright (c) 2007 Antti Kantee. All Rights Reserved. @@ -28,7 +28,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: emul.c,v 1.101 2009/10/15 00:28:46 pooka Exp $"); +__KERNEL_RCSID(0, "$NetBSD: emul.c,v 1.102 2009/10/15 16:39:22 pooka Exp $"); #include <sys/param.h> #include <sys/malloc.h> @@ -442,7 +442,7 @@ k = kmem_alloc(sizeof(struct kthdesc), KM_SLEEP); k->f = func; k->arg = arg; - k->mylwp = l = rump_setup_curlwp(0, rump_nextlid(), 0); + k->mylwp = l = rump_lwp_alloc(0, rump_nextlid()); if (flags & KTHREAD_MPSAFE) l->l_pflag |= LP_MPSAFE; rv = rumpuser_thread_create(threadbouncer, k, thrname); @@ -460,7 +460,7 @@ if ((curlwp->l_pflag & LP_MPSAFE) == 0) KERNEL_UNLOCK_ONE(NULL); - rump_clear_curlwp(); + rump_lwp_release(curlwp); rump_unschedule(); rumpuser_thread_exit(); } Index: src/sys/rump/librump/rumpkern/locks.c diff -u src/sys/rump/librump/rumpkern/locks.c:1.29 src/sys/rump/librump/rumpkern/locks.c:1.30 --- src/sys/rump/librump/rumpkern/locks.c:1.29 Thu Oct 15 00:28:46 2009 +++ src/sys/rump/librump/rumpkern/locks.c Thu Oct 15 16:39:22 2009 @@ -1,4 +1,4 @@ -/* $NetBSD: locks.c,v 1.29 2009/10/15 00:28:46 pooka Exp $ */ +/* $NetBSD: locks.c,v 1.30 2009/10/15 16:39:22 pooka Exp $ */ /*- * Copyright (c) 2008 The NetBSD Foundation, Inc. @@ -55,7 +55,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: locks.c,v 1.29 2009/10/15 00:28:46 pooka Exp $"); +__KERNEL_RCSID(0, "$NetBSD: locks.c,v 1.30 2009/10/15 16:39:22 pooka Exp $"); #include <sys/param.h> #include <sys/atomic.h> @@ -343,9 +343,11 @@ while (nlocks--) { if (!rumpuser_mutex_tryenter(rump_giantlock)) { - rump_unschedule(); + struct lwp *l = curlwp; + + rump_unschedule_cpu(l); rumpuser_mutex_enter_nowrap(rump_giantlock); - rump_schedule(); + rump_schedule_cpu(l); } lockcnt++; } @@ -382,14 +384,14 @@ { _kernel_unlock(nlocks, countp); - rump_unschedule(); + rump_unschedule_cpu(curlwp); } void rump_user_schedule(int nlocks) { - rump_schedule(); + rump_schedule_cpu(curlwp); if (nlocks) _kernel_lock(nlocks); Index: src/sys/rump/librump/rumpkern/rump.c diff -u src/sys/rump/librump/rumpkern/rump.c:1.124 src/sys/rump/librump/rumpkern/rump.c:1.125 --- src/sys/rump/librump/rumpkern/rump.c:1.124 Thu Oct 15 00:28:46 2009 +++ src/sys/rump/librump/rumpkern/rump.c Thu Oct 15 16:39:22 2009 @@ -1,4 +1,4 @@ -/* $NetBSD: rump.c,v 1.124 2009/10/15 00:28:46 pooka Exp $ */ +/* $NetBSD: rump.c,v 1.125 2009/10/15 16:39:22 pooka Exp $ */ /* * Copyright (c) 2007 Antti Kantee. All Rights Reserved. @@ -28,7 +28,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: rump.c,v 1.124 2009/10/15 00:28:46 pooka Exp $"); +__KERNEL_RCSID(0, "$NetBSD: rump.c,v 1.125 2009/10/15 16:39:22 pooka Exp $"); #include <sys/param.h> #include <sys/atomic.h> @@ -388,34 +388,43 @@ return resid; } -/* public interface */ static pid_t nextpid = 1; struct lwp * rump_newproc_switch() { - struct lwp *oldlwp = curlwp; + struct lwp *l; pid_t mypid; mypid = atomic_inc_uint_nv(&nextpid); if (__predict_false(mypid == 0)) mypid = atomic_inc_uint_nv(&nextpid); - rumpuser_set_curlwp(NULL); - rump_setup_curlwp(mypid, 0, 1); + l = rump_lwp_alloc(mypid, 0); + rump_lwp_switch(l); + + return l; +} + +struct lwp * +rump_lwp_alloc_and_switch(pid_t pid, lwpid_t lid) +{ + struct lwp *l; - return oldlwp; + l = rump_lwp_alloc(pid, lid); + rump_lwp_switch(l); + + return l; } -/* rump private */ struct lwp * -rump_setup_curlwp(pid_t pid, lwpid_t lid, int set) +rump_lwp_alloc(pid_t pid, lwpid_t lid) { struct lwp *l; struct proc *p; - l = kmem_zalloc(sizeof(struct lwp), KM_SLEEP); + l = kmem_zalloc(sizeof(*l), KM_SLEEP); if (pid != 0) { - p = kmem_zalloc(sizeof(struct proc), KM_SLEEP); + p = kmem_zalloc(sizeof(*p), KM_SLEEP); rump_proc_vfs_init(p); p->p_stats = &rump_stats; p->p_limit = &rump_limits; @@ -431,40 +440,30 @@ l->l_proc = p; l->l_lid = lid; l->l_fd = p->p_fd; - l->l_mutex = RUMP_LMUTEX_MAGIC; + l->l_mutex = mutex_obj_alloc(MUTEX_DEFAULT, IPL_NONE); l->l_cpu = NULL; - /* give current cpu to new lwp */ - if (set) { - struct cpu_info *saveci = curlwp->l_cpu; - - curlwp->l_cpu = NULL; - rumpuser_set_curlwp(l); - curlwp->l_cpu = saveci; - } - return l; } -/* rump private. NEEDS WORK! */ void -rump_set_vmspace(struct vmspace *vm) +rump_lwp_switch(struct lwp *newlwp) { - struct proc *p = curproc; + struct lwp *l = curlwp; - p->p_vmspace = vm; + rumpuser_set_curlwp(NULL); + newlwp->l_cpu = l->l_cpu; + rumpuser_set_curlwp(newlwp); + if (l->l_flag & LW_WEXIT) + rump_lwp_free(l); } +/* XXX: this has effect only on non-pid0 lwps */ void -rump_clear_curlwp(void) +rump_lwp_release(struct lwp *l) { - struct cpu_info *ci; - struct lwp *l; struct proc *p; - l = rumpuser_get_curlwp(); - ci = l->l_cpu; - KASSERT(ci); p = l->l_proc; if (p->p_pid != 0) { mutex_obj_free(p->p_lock); @@ -473,33 +472,38 @@ rump_cred_put(l->l_cred); kmem_free(p, sizeof(*p)); } - kmem_free(l, sizeof(*l)); + KASSERT((l->l_flag & LW_WEXIT) == 0); + l->l_flag |= LW_WEXIT; +} - /* lwp0 inherits current cpu. quite XXX */ - rumpuser_set_curlwp(NULL); - lwp0.l_cpu = ci; +void +rump_lwp_free(struct lwp *l) +{ + + KASSERT(l->l_flag & LW_WEXIT); + KASSERT(l != rumpuser_get_curlwp()); + rump_cred_put(l->l_cred); + mutex_obj_free(l->l_mutex); + kmem_free(l, sizeof(*l)); } struct lwp * -rump_get_curlwp(void) +rump_lwp_curlwp(void) { - struct lwp *l; - - l = rumpuser_get_curlwp(); - if (l == NULL) - l = &lwp0; + struct lwp *l = curlwp; + if (l->l_flag & LW_WEXIT) + return NULL; return l; } +/* rump private. NEEDS WORK! */ void -rump_set_curlwp(struct lwp *l) +rump_set_vmspace(struct vmspace *vm) { + struct proc *p = curproc; - /* clear current */ - rumpuser_set_curlwp(NULL); - /* set new */ - rumpuser_set_curlwp(l); + p->p_vmspace = vm; } kauth_cred_t @@ -598,9 +602,9 @@ if (__predict_false(num >= SYS_NSYSENT)) return ENOSYS; - l = curlwp; callp = rump_sysent + num; rump_schedule(); + l = curlwp; rv = callp->sy_call(l, (void *)data, retval); rump_unschedule(); Index: src/sys/rump/librump/rumpkern/rump_private.h diff -u src/sys/rump/librump/rumpkern/rump_private.h:1.31 src/sys/rump/librump/rumpkern/rump_private.h:1.32 --- src/sys/rump/librump/rumpkern/rump_private.h:1.31 Thu Oct 15 00:28:46 2009 +++ src/sys/rump/librump/rumpkern/rump_private.h Thu Oct 15 16:39:22 2009 @@ -1,4 +1,4 @@ -/* $NetBSD: rump_private.h,v 1.31 2009/10/15 00:28:46 pooka Exp $ */ +/* $NetBSD: rump_private.h,v 1.32 2009/10/15 16:39:22 pooka Exp $ */ /* * Copyright (c) 2007 Antti Kantee. All Rights Reserved. @@ -69,6 +69,7 @@ void rump_gettime(struct timespec *); void rump_getuptime(struct timespec *); +void rump_lwp_free(struct lwp *); lwpid_t rump_nextlid(void); void rump_set_vmspace(struct vmspace *); @@ -88,6 +89,9 @@ void rump_scheduler_init(void); void rump_schedule(void); void rump_unschedule(void); +void rump_schedule_cpu(struct lwp *); +void rump_unschedule_cpu(struct lwp *); + void rump_user_schedule(int); void rump_user_unschedule(int, int *); Index: src/sys/rump/librump/rumpkern/rumpkern.ifspec diff -u src/sys/rump/librump/rumpkern/rumpkern.ifspec:1.1 src/sys/rump/librump/rumpkern/rumpkern.ifspec:1.2 --- src/sys/rump/librump/rumpkern/rumpkern.ifspec:1.1 Wed Oct 14 17:17:00 2009 +++ src/sys/rump/librump/rumpkern/rumpkern.ifspec Thu Oct 15 16:39:22 2009 @@ -1,4 +1,4 @@ -; $NetBSD: rumpkern.ifspec,v 1.1 2009/10/14 17:17:00 pooka Exp $ +; $NetBSD: rumpkern.ifspec,v 1.2 2009/10/15 16:39:22 pooka Exp $ NAME|kern PUBHDR|include/rump/rumpkern_if_pub.h @@ -24,11 +24,12 @@ void |cred_put |kauth_cred_t ; lwp interfaces. these need much love -struct lwp * |newproc_switch |void -struct lwp * |setup_curlwp |pid_t, lwpid_t, int -struct lwp * |get_curlwp |void -void |set_curlwp |struct lwp * -void |clear_curlwp |void +struct lwp * |newproc_switch |void +struct lwp * |lwp_alloc |pid_t, lwpid_t +struct lwp * |lwp_alloc_and_switch |pid_t, lwpid_t +struct lwp * |lwp_curlwp |void +void |lwp_switch |struct lwp * +void |lwp_release |struct lwp * int |sysproxy_set |rump_sysproxy_t, void * int |sysproxy_socket_setup_client |int Index: src/sys/rump/librump/rumpkern/scheduler.c diff -u src/sys/rump/librump/rumpkern/scheduler.c:1.1 src/sys/rump/librump/rumpkern/scheduler.c:1.2 --- src/sys/rump/librump/rumpkern/scheduler.c:1.1 Thu Oct 15 00:28:46 2009 +++ src/sys/rump/librump/rumpkern/scheduler.c Thu Oct 15 16:39:22 2009 @@ -1,4 +1,4 @@ -/* $NetBSD: scheduler.c,v 1.1 2009/10/15 00:28:46 pooka Exp $ */ +/* $NetBSD: scheduler.c,v 1.2 2009/10/15 16:39:22 pooka Exp $ */ /* * Copyright (c) 2009 Antti Kantee. All Rights Reserved. @@ -29,10 +29,11 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: scheduler.c,v 1.1 2009/10/15 00:28:46 pooka Exp $"); +__KERNEL_RCSID(0, "$NetBSD: scheduler.c,v 1.2 2009/10/15 16:39:22 pooka Exp $"); #include <sys/param.h> #include <sys/cpu.h> +#include <sys/kmem.h> #include <sys/mutex.h> #include <sys/queue.h> #include <sys/select.h> @@ -82,8 +83,24 @@ void rump_schedule() { + struct lwp *l = rumpuser_get_curlwp(); + + /* + * If there is no dedicated lwp, allocate a temp one and + * set it to be free'd upon unschedule(). + */ + if (l == NULL) { + l = rump_lwp_alloc(0, rump_nextlid()); + rumpuser_set_curlwp(l); + rump_lwp_release(l); + } + rump_schedule_cpu(l); +} + +void +rump_schedule_cpu(struct lwp *l) +{ struct rumpcpu *rcpu; - struct lwp *l = curlwp; KASSERT(l->l_cpu == NULL); rumpuser_mutex_enter_nowrap(schedmtx); @@ -91,21 +108,30 @@ rumpuser_cv_wait_nowrap(schedcv, schedmtx); SLIST_REMOVE_HEAD(&cpu_freelist, rcpu_entries); rumpuser_mutex_exit(schedmtx); - l->l_cpu = rcpu->rcpu_ci; } void rump_unschedule() { + struct lwp *l; + + l = rumpuser_get_curlwp(); + rump_unschedule_cpu(l); + if (l->l_flag & LW_WEXIT) { + kmem_free(l, sizeof(*l)); + rumpuser_set_curlwp(NULL); + } +} + +void +rump_unschedule_cpu(struct lwp *l) +{ struct rumpcpu *rcpu; struct cpu_info *ci; - struct lwp *l; - l = curlwp; ci = l->l_cpu; l->l_cpu = NULL; - rcpu = &rcpu_storage[ci-&rump_cpus[0]]; KASSERT(rcpu->rcpu_ci == ci); Index: src/sys/rump/librump/rumpkern/sysproxy_socket.c diff -u src/sys/rump/librump/rumpkern/sysproxy_socket.c:1.4 src/sys/rump/librump/rumpkern/sysproxy_socket.c:1.5 --- src/sys/rump/librump/rumpkern/sysproxy_socket.c:1.4 Wed Oct 14 18:18:53 2009 +++ src/sys/rump/librump/rumpkern/sysproxy_socket.c Thu Oct 15 16:39:22 2009 @@ -1,4 +1,4 @@ -/* $NetBSD: sysproxy_socket.c,v 1.4 2009/10/14 18:18:53 pooka Exp $ */ +/* $NetBSD: sysproxy_socket.c,v 1.5 2009/10/15 16:39:22 pooka Exp $ */ /* * Copyright (c) 2009 Antti Kantee. All Rights Reserved. @@ -28,7 +28,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: sysproxy_socket.c,v 1.4 2009/10/14 18:18:53 pooka Exp $"); +__KERNEL_RCSID(0, "$NetBSD: sysproxy_socket.c,v 1.5 2009/10/15 16:39:22 pooka Exp $"); #include <sys/param.h> #include <sys/kernel.h> @@ -386,15 +386,15 @@ } callp = rump_sysent + req->rpc_sysnum; - mylwp = rump_newproc_switch(); + mylwp = curlwp; + l = rump_newproc_switch(); rump_set_vmspace(&rump_sysproxy_vmspace); - l = curlwp; resp.rpc_retval = 0; /* default */ resp.rpc_error = callp->sy_call(l, (void *)req->rpc_data, &resp.rpc_retval); - rump_clear_curlwp(); - rumpuser_set_curlwp(mylwp); + rump_lwp_release(l); + rump_lwp_switch(mylwp); kmem_free(req, req->rpc_head.rpch_flen); dosend(sock, qent, (uint8_t *)&resp, sizeof(resp), false); Index: src/sys/rump/librump/rumpkern/arch/i386/rumpcpu.c diff -u src/sys/rump/librump/rumpkern/arch/i386/rumpcpu.c:1.6 src/sys/rump/librump/rumpkern/arch/i386/rumpcpu.c:1.7 --- src/sys/rump/librump/rumpkern/arch/i386/rumpcpu.c:1.6 Thu Oct 15 00:28:47 2009 +++ src/sys/rump/librump/rumpkern/arch/i386/rumpcpu.c Thu Oct 15 16:39:22 2009 @@ -1,4 +1,4 @@ -/* $NetBSD: rumpcpu.c,v 1.6 2009/10/15 00:28:47 pooka Exp $ */ +/* $NetBSD: rumpcpu.c,v 1.7 2009/10/15 16:39:22 pooka Exp $ */ /* * Copyright (c) 2008 Antti Kantee. All Rights Reserved. @@ -29,7 +29,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: rumpcpu.c,v 1.6 2009/10/15 00:28:47 pooka Exp $"); +__KERNEL_RCSID(0, "$NetBSD: rumpcpu.c,v 1.7 2009/10/15 16:39:22 pooka Exp $"); #include <sys/param.h> @@ -57,7 +57,7 @@ x86_curlwp() { - return rump_get_curlwp(); + return rumpuser_get_curlwp(); } void