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