Module Name:    src
Committed By:   pooka
Date:           Thu Oct 15 23:15:56 UTC 2009

Modified Files:
        src/sys/rump/librump/rumpkern: locks.c rump_private.h scheduler.c

Log Message:
When allocating the temporary lwp we must have an lwp context.  So
take turns using lwp0 for this purpose, nothing else uses it.


To generate a diff of this commit:
cvs rdiff -u -r1.30 -r1.31 src/sys/rump/librump/rumpkern/locks.c
cvs rdiff -u -r1.32 -r1.33 src/sys/rump/librump/rumpkern/rump_private.h
cvs rdiff -u -r1.2 -r1.3 src/sys/rump/librump/rumpkern/scheduler.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/locks.c
diff -u src/sys/rump/librump/rumpkern/locks.c:1.30 src/sys/rump/librump/rumpkern/locks.c:1.31
--- src/sys/rump/librump/rumpkern/locks.c:1.30	Thu Oct 15 16:39:22 2009
+++ src/sys/rump/librump/rumpkern/locks.c	Thu Oct 15 23:15:55 2009
@@ -1,4 +1,4 @@
-/*	$NetBSD: locks.c,v 1.30 2009/10/15 16:39:22 pooka Exp $	*/
+/*	$NetBSD: locks.c,v 1.31 2009/10/15 23:15:55 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.30 2009/10/15 16:39:22 pooka Exp $");
+__KERNEL_RCSID(0, "$NetBSD: locks.c,v 1.31 2009/10/15 23:15:55 pooka Exp $");
 
 #include <sys/param.h>
 #include <sys/atomic.h>
@@ -347,7 +347,7 @@
 
 			rump_unschedule_cpu(l);
 			rumpuser_mutex_enter_nowrap(rump_giantlock);
-			rump_schedule_cpu(l);
+			l->l_cpu = rump_schedule_cpu();
 		}
 		lockcnt++;
 	}
@@ -391,7 +391,7 @@
 rump_user_schedule(int nlocks)
 {
 
-	rump_schedule_cpu(curlwp);
+	curlwp->l_cpu = rump_schedule_cpu();
 
 	if (nlocks)
 		_kernel_lock(nlocks);

Index: src/sys/rump/librump/rumpkern/rump_private.h
diff -u src/sys/rump/librump/rumpkern/rump_private.h:1.32 src/sys/rump/librump/rumpkern/rump_private.h:1.33
--- src/sys/rump/librump/rumpkern/rump_private.h:1.32	Thu Oct 15 16:39:22 2009
+++ src/sys/rump/librump/rumpkern/rump_private.h	Thu Oct 15 23:15:55 2009
@@ -1,4 +1,4 @@
-/*	$NetBSD: rump_private.h,v 1.32 2009/10/15 16:39:22 pooka Exp $	*/
+/*	$NetBSD: rump_private.h,v 1.33 2009/10/15 23:15:55 pooka Exp $	*/
 
 /*
  * Copyright (c) 2007 Antti Kantee.  All Rights Reserved.
@@ -86,11 +86,11 @@
 int		rump_sysproxy_copyout(const void *, void *, size_t);
 int		rump_sysproxy_copyin(const void *, void *, size_t);
 
-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_scheduler_init(void);
+void		rump_schedule(void);
+void		rump_unschedule(void);
+struct cpu_info *rump_schedule_cpu(void);
+void		rump_unschedule_cpu(struct lwp *);
 
 void	rump_user_schedule(int);
 void	rump_user_unschedule(int, int *);

Index: src/sys/rump/librump/rumpkern/scheduler.c
diff -u src/sys/rump/librump/rumpkern/scheduler.c:1.2 src/sys/rump/librump/rumpkern/scheduler.c:1.3
--- src/sys/rump/librump/rumpkern/scheduler.c:1.2	Thu Oct 15 16:39:22 2009
+++ src/sys/rump/librump/rumpkern/scheduler.c	Thu Oct 15 23:15:55 2009
@@ -1,4 +1,4 @@
-/*      $NetBSD: scheduler.c,v 1.2 2009/10/15 16:39:22 pooka Exp $	*/
+/*      $NetBSD: scheduler.c,v 1.3 2009/10/15 23:15:55 pooka Exp $	*/
 
 /*
  * Copyright (c) 2009 Antti Kantee.  All Rights Reserved.
@@ -29,7 +29,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: scheduler.c,v 1.2 2009/10/15 16:39:22 pooka Exp $");
+__KERNEL_RCSID(0, "$NetBSD: scheduler.c,v 1.3 2009/10/15 23:15:55 pooka Exp $");
 
 #include <sys/param.h>
 #include <sys/cpu.h>
@@ -53,7 +53,9 @@
 
 static SLIST_HEAD(,rumpcpu) cpu_freelist = SLIST_HEAD_INITIALIZER(cpu_freelist);
 static struct rumpuser_mtx *schedmtx;
-static struct rumpuser_cv *schedcv;
+static struct rumpuser_cv *schedcv, *lwp0cv;
+
+static bool lwp0busy = false;
 
 struct cpu_info *
 cpu_lookup(u_int index)
@@ -71,6 +73,7 @@
 
 	rumpuser_mutex_init(&schedmtx);
 	rumpuser_cv_init(&schedcv);
+	rumpuser_cv_init(&lwp0cv);
 	for (i = 0; i < ncpu; i++) {
 		rcpu = &rcpu_storage[i];
 		ci = &rump_cpus[i];
@@ -83,32 +86,57 @@
 void
 rump_schedule()
 {
-	struct lwp *l = rumpuser_get_curlwp();
+	struct cpu_info *ci;
+	struct lwp *l;
 
 	/*
 	 * If there is no dedicated lwp, allocate a temp one and
-	 * set it to be free'd upon unschedule().
+	 * set it to be free'd upon unschedule().  Use lwp0 context
+	 * for reserving the necessary resources.
 	 */
+	l = rumpuser_get_curlwp();
 	if (l == NULL) {
+		/* busy lwp0 */
+		rumpuser_mutex_enter_nowrap(schedmtx);
+		while (lwp0busy)
+			rumpuser_cv_wait_nowrap(lwp0cv, schedmtx);
+		lwp0busy = true;
+		rumpuser_mutex_exit(schedmtx);
+
+		/* schedule cpu and use lwp0 */
+		ci = rump_schedule_cpu();
+		lwp0.l_cpu = ci;
+		rumpuser_set_curlwp(&lwp0);
 		l = rump_lwp_alloc(0, rump_nextlid());
-		rumpuser_set_curlwp(l);
+
+		/* release lwp0 */
+		rump_lwp_switch(l);
+		rumpuser_mutex_enter_nowrap(schedmtx);
+		lwp0busy = false;
+		rumpuser_cv_signal(lwp0cv);
+		rumpuser_mutex_exit(schedmtx);
+
+		/* mark new lwp as dead-on-exit */
 		rump_lwp_release(l);
+	} else {
+		KASSERT(l->l_cpu == NULL);
+		ci = rump_schedule_cpu();
+		l->l_cpu = ci;
 	}
-	rump_schedule_cpu(l);
 }
 
-void
-rump_schedule_cpu(struct lwp *l)
+struct cpu_info *
+rump_schedule_cpu()
 {
 	struct rumpcpu *rcpu;
 
-	KASSERT(l->l_cpu == NULL);
 	rumpuser_mutex_enter_nowrap(schedmtx);
 	while ((rcpu = SLIST_FIRST(&cpu_freelist)) == NULL)
 		rumpuser_cv_wait_nowrap(schedcv, schedmtx);
 	SLIST_REMOVE_HEAD(&cpu_freelist, rcpu_entries);
 	rumpuser_mutex_exit(schedmtx);
-	l->l_cpu = rcpu->rcpu_ci;
+
+	return rcpu->rcpu_ci;
 }
 
 void

Reply via email to