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

Reply via email to