Module Name:    src
Committed By:   pooka
Date:           Fri Oct 16 00:14:53 UTC 2009

Modified Files:
        src/sys/rump/librump/rumpkern: Makefile.rumpkern emul.c locks.c rump.c
            rump_private.h scheduler.c sleepq.c vm.c

Log Message:
Include sys_select.c for proper select()/poll() support.


To generate a diff of this commit:
cvs rdiff -u -r1.52 -r1.53 src/sys/rump/librump/rumpkern/Makefile.rumpkern
cvs rdiff -u -r1.102 -r1.103 src/sys/rump/librump/rumpkern/emul.c
cvs rdiff -u -r1.31 -r1.32 src/sys/rump/librump/rumpkern/locks.c
cvs rdiff -u -r1.125 -r1.126 src/sys/rump/librump/rumpkern/rump.c
cvs rdiff -u -r1.33 -r1.34 src/sys/rump/librump/rumpkern/rump_private.h
cvs rdiff -u -r1.3 -r1.4 src/sys/rump/librump/rumpkern/scheduler.c
cvs rdiff -u -r1.2 -r1.3 src/sys/rump/librump/rumpkern/sleepq.c
cvs rdiff -u -r1.61 -r1.62 src/sys/rump/librump/rumpkern/vm.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/Makefile.rumpkern
diff -u src/sys/rump/librump/rumpkern/Makefile.rumpkern:1.52 src/sys/rump/librump/rumpkern/Makefile.rumpkern:1.53
--- src/sys/rump/librump/rumpkern/Makefile.rumpkern:1.52	Thu Oct 15 00:28:46 2009
+++ src/sys/rump/librump/rumpkern/Makefile.rumpkern	Fri Oct 16 00:14:53 2009
@@ -1,4 +1,4 @@
-#	$NetBSD: Makefile.rumpkern,v 1.52 2009/10/15 00:28:46 pooka Exp $
+#	$NetBSD: Makefile.rumpkern,v 1.53 2009/10/16 00:14:53 pooka Exp $
 #
 
 .include "${RUMPTOP}/Makefile.rump"
@@ -34,7 +34,7 @@
 SRCS+=	init_sysctl_base.c kern_auth.c kern_descrip.c kern_event.c	\
 	kern_ksyms.c kern_malloc_stdtype.c kern_module.c kern_rate.c	\
 	kern_stub.c kern_sysctl.c kern_timeout.c kern_uidinfo.c param.c	\
-	sys_descrip.c sys_generic.c syscalls.c
+	sys_descrip.c sys_generic.c sys_select.c syscalls.c
 
 # sys/kern subr (misc)
 SRCS+=	subr_devsw.c subr_callback.c subr_evcnt.c subr_extent.c		\

Index: src/sys/rump/librump/rumpkern/emul.c
diff -u src/sys/rump/librump/rumpkern/emul.c:1.102 src/sys/rump/librump/rumpkern/emul.c:1.103
--- src/sys/rump/librump/rumpkern/emul.c:1.102	Thu Oct 15 16:39:22 2009
+++ src/sys/rump/librump/rumpkern/emul.c	Fri Oct 16 00:14:53 2009
@@ -1,4 +1,4 @@
-/*	$NetBSD: emul.c,v 1.102 2009/10/15 16:39:22 pooka Exp $	*/
+/*	$NetBSD: emul.c,v 1.103 2009/10/16 00:14:53 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.102 2009/10/15 16:39:22 pooka Exp $");
+__KERNEL_RCSID(0, "$NetBSD: emul.c,v 1.103 2009/10/16 00:14:53 pooka Exp $");
 
 #include <sys/param.h>
 #include <sys/malloc.h>
@@ -93,7 +93,6 @@
 const char *domainname;
 int domainnamelen;
 
-const struct filterops seltrue_filtops;
 const struct filterops sig_filtops;
 
 #define DEVSW_SIZE 255
@@ -487,7 +486,7 @@
 	case SIGSYS:
 		break;
 	default:
-		panic("unhandled signal %d", signo);
+		panic("unhandled signal %d\n", signo);
 	}
 }
 
@@ -577,32 +576,6 @@
 	return t;
 }
 
-int
-seltrue(dev_t dev, int events, struct lwp *l)
-{
-        return (events & (POLLIN | POLLOUT | POLLRDNORM | POLLWRNORM));
-}
-
-void
-selrecord(lwp_t *selector, struct selinfo *sip)
-{
-}
-
-void
-selinit(struct selinfo *sip)
-{
-}
-
-void
-selnotify(struct selinfo *sip, int events, long knhint)
-{
-}
-
-void
-seldestroy(struct selinfo *sip)
-{
-}
-
 const char *
 device_xname(device_t dv)
 {
@@ -741,39 +714,6 @@
 	rumpuser_exit(0);
 }
 
-/*
- * XXX: from sys_select.c, see that file for license.
- * (these will go away really soon in favour of the real sys_select.c)
- * ((really, the select code just needs cleanup))
- * (((seriously)))
- */
-int
-inittimeleft(struct timespec *ts, struct timespec *sleepts)
-{
-	if (itimespecfix(ts))
-		return -1;
-	getnanouptime(sleepts);
-	return 0;
-}
-
-int
-gettimeleft(struct timespec *ts, struct timespec *sleepts)
-{
-	/*
-	 * We have to recalculate the timeout on every retry.
-	 */
-	struct timespec sleptts;
-	/*
-	 * reduce ts by elapsed time
-	 * based on monotonic time scale
-	 */
-	getnanouptime(&sleptts);
-	timespecadd(ts, sleepts, ts);
-	timespecsub(ts, &sleptts, ts);
-	*sleepts = sleptts;
-	return tstohz(ts);
-}
-
 bool
 pmf_device_register1(struct device *dev,
 	bool (*suspend)(device_t PMF_FN_PROTO),

Index: src/sys/rump/librump/rumpkern/locks.c
diff -u src/sys/rump/librump/rumpkern/locks.c:1.31 src/sys/rump/librump/rumpkern/locks.c:1.32
--- src/sys/rump/librump/rumpkern/locks.c:1.31	Thu Oct 15 23:15:55 2009
+++ src/sys/rump/librump/rumpkern/locks.c	Fri Oct 16 00:14:53 2009
@@ -1,4 +1,4 @@
-/*	$NetBSD: locks.c,v 1.31 2009/10/15 23:15:55 pooka Exp $	*/
+/*	$NetBSD: locks.c,v 1.32 2009/10/16 00:14:53 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.31 2009/10/15 23:15:55 pooka Exp $");
+__KERNEL_RCSID(0, "$NetBSD: locks.c,v 1.32 2009/10/16 00:14:53 pooka Exp $");
 
 #include <sys/param.h>
 #include <sys/atomic.h>
@@ -347,7 +347,7 @@
 
 			rump_unschedule_cpu(l);
 			rumpuser_mutex_enter_nowrap(rump_giantlock);
-			l->l_cpu = rump_schedule_cpu();
+			rump_schedule_cpu(l);
 		}
 		lockcnt++;
 	}
@@ -391,7 +391,7 @@
 rump_user_schedule(int nlocks)
 {
 
-	curlwp->l_cpu = rump_schedule_cpu();
+	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.125 src/sys/rump/librump/rumpkern/rump.c:1.126
--- src/sys/rump/librump/rumpkern/rump.c:1.125	Thu Oct 15 16:39:22 2009
+++ src/sys/rump/librump/rumpkern/rump.c	Fri Oct 16 00:14:53 2009
@@ -1,4 +1,4 @@
-/*	$NetBSD: rump.c,v 1.125 2009/10/15 16:39:22 pooka Exp $	*/
+/*	$NetBSD: rump.c,v 1.126 2009/10/16 00:14:53 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.125 2009/10/15 16:39:22 pooka Exp $");
+__KERNEL_RCSID(0, "$NetBSD: rump.c,v 1.126 2009/10/16 00:14:53 pooka Exp $");
 
 #include <sys/param.h>
 #include <sys/atomic.h>
@@ -115,8 +115,8 @@
 static int rump_inited;
 static struct emul emul_rump;
 
-void rump__unavailable(void);
-void rump__unavailable() {}
+int rump__unavailable(void);
+int rump__unavailable() {return EOPNOTSUPP;}
 __weak_alias(rump_net_init,rump__unavailable);
 __weak_alias(rump_vfs_init,rump__unavailable);
 __weak_alias(rump_dev_init,rump__unavailable);
@@ -124,6 +124,7 @@
 __weak_alias(rump_vfs_fini,rump__unavailable);
 
 __weak_alias(biodone,rump__unavailable);
+__weak_alias(sopoll,rump__unavailable);
 
 void rump__unavailable_vfs_panic(void);
 void rump__unavailable_vfs_panic() {panic("vfs component not available");}
@@ -254,6 +255,7 @@
 
 	callout_startup();
 	callout_init_cpu(rump_cpu);
+	selsysinit(rump_cpu);
 
 	sysctl_init();
 	kqueue_init();
@@ -440,7 +442,6 @@
 	l->l_proc = p;
 	l->l_lid = lid;
 	l->l_fd = p->p_fd;
-	l->l_mutex = mutex_obj_alloc(MUTEX_DEFAULT, IPL_NONE);
 	l->l_cpu = NULL;
 
 	return l;
@@ -453,6 +454,9 @@
 
 	rumpuser_set_curlwp(NULL);
 	newlwp->l_cpu = l->l_cpu;
+	newlwp->l_mutex = l->l_mutex;
+	l->l_mutex = NULL;
+	l->l_cpu = NULL;
 	rumpuser_set_curlwp(newlwp);
 	if (l->l_flag & LW_WEXIT)
 		rump_lwp_free(l);
@@ -481,9 +485,8 @@
 {
 
 	KASSERT(l->l_flag & LW_WEXIT);
-	KASSERT(l != rumpuser_get_curlwp());
+	KASSERT(l->l_mutex == NULL);
 	rump_cred_put(l->l_cred);
-	mutex_obj_free(l->l_mutex);
 	kmem_free(l, sizeof(*l));
 }
 

Index: src/sys/rump/librump/rumpkern/rump_private.h
diff -u src/sys/rump/librump/rumpkern/rump_private.h:1.33 src/sys/rump/librump/rumpkern/rump_private.h:1.34
--- src/sys/rump/librump/rumpkern/rump_private.h:1.33	Thu Oct 15 23:15:55 2009
+++ src/sys/rump/librump/rumpkern/rump_private.h	Fri Oct 16 00:14:53 2009
@@ -1,4 +1,4 @@
-/*	$NetBSD: rump_private.h,v 1.33 2009/10/15 23:15:55 pooka Exp $	*/
+/*	$NetBSD: rump_private.h,v 1.34 2009/10/16 00:14:53 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);
-struct cpu_info *rump_schedule_cpu(void);
-void		rump_unschedule_cpu(struct lwp *);
+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/scheduler.c
diff -u src/sys/rump/librump/rumpkern/scheduler.c:1.3 src/sys/rump/librump/rumpkern/scheduler.c:1.4
--- src/sys/rump/librump/rumpkern/scheduler.c:1.3	Thu Oct 15 23:15:55 2009
+++ src/sys/rump/librump/rumpkern/scheduler.c	Fri Oct 16 00:14:53 2009
@@ -1,4 +1,4 @@
-/*      $NetBSD: scheduler.c,v 1.3 2009/10/15 23:15:55 pooka Exp $	*/
+/*      $NetBSD: scheduler.c,v 1.4 2009/10/16 00:14:53 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.3 2009/10/15 23:15:55 pooka Exp $");
+__KERNEL_RCSID(0, "$NetBSD: scheduler.c,v 1.4 2009/10/16 00:14:53 pooka Exp $");
 
 #include <sys/param.h>
 #include <sys/cpu.h>
@@ -78,6 +78,8 @@
 		rcpu = &rcpu_storage[i];
 		ci = &rump_cpus[i];
 		rump_cpu_bootstrap(ci);
+		ci->ci_schedstate.spc_mutex =
+		    mutex_obj_alloc(MUTEX_DEFAULT, IPL_NONE);
 		rcpu->rcpu_ci = ci;
 		SLIST_INSERT_HEAD(&cpu_freelist, rcpu, rcpu_entries);
 	}
@@ -86,7 +88,6 @@
 void
 rump_schedule()
 {
-	struct cpu_info *ci;
 	struct lwp *l;
 
 	/*
@@ -104,8 +105,7 @@
 		rumpuser_mutex_exit(schedmtx);
 
 		/* schedule cpu and use lwp0 */
-		ci = rump_schedule_cpu();
-		lwp0.l_cpu = ci;
+		rump_schedule_cpu(&lwp0);
 		rumpuser_set_curlwp(&lwp0);
 		l = rump_lwp_alloc(0, rump_nextlid());
 
@@ -119,14 +119,12 @@
 		/* 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);
 	}
 }
 
-struct cpu_info *
-rump_schedule_cpu()
+void
+rump_schedule_cpu(struct lwp *l)
 {
 	struct rumpcpu *rcpu;
 
@@ -135,8 +133,9 @@
 		rumpuser_cv_wait_nowrap(schedcv, schedmtx);
 	SLIST_REMOVE_HEAD(&cpu_freelist, rcpu_entries);
 	rumpuser_mutex_exit(schedmtx);
-
-	return rcpu->rcpu_ci;
+	KASSERT(l->l_cpu == NULL);
+	l->l_cpu = rcpu->rcpu_ci;
+	l->l_mutex = rcpu->rcpu_ci->ci_schedstate.spc_mutex;
 }
 
 void
@@ -145,7 +144,9 @@
 	struct lwp *l;
 
 	l = rumpuser_get_curlwp();
+	KASSERT(l->l_mutex == l->l_cpu->ci_schedstate.spc_mutex);
 	rump_unschedule_cpu(l);
+	l->l_mutex = NULL;
 	if (l->l_flag & LW_WEXIT) {
 		kmem_free(l, sizeof(*l));
 		rumpuser_set_curlwp(NULL);

Index: src/sys/rump/librump/rumpkern/sleepq.c
diff -u src/sys/rump/librump/rumpkern/sleepq.c:1.2 src/sys/rump/librump/rumpkern/sleepq.c:1.3
--- src/sys/rump/librump/rumpkern/sleepq.c:1.2	Thu Dec 18 00:24:12 2008
+++ src/sys/rump/librump/rumpkern/sleepq.c	Fri Oct 16 00:14:53 2009
@@ -1,4 +1,4 @@
-/*	$NetBSD: sleepq.c,v 1.2 2008/12/18 00:24:12 pooka Exp $	*/
+/*	$NetBSD: sleepq.c,v 1.3 2009/10/16 00:14:53 pooka Exp $	*/
 
 /*
  * Copyright (c) 2008 Antti Kantee.  All Rights Reserved.
@@ -26,7 +26,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: sleepq.c,v 1.2 2008/12/18 00:24:12 pooka Exp $");
+__KERNEL_RCSID(0, "$NetBSD: sleepq.c,v 1.3 2009/10/16 00:14:53 pooka Exp $");
 
 #include <sys/param.h>
 #include <sys/condvar.h>
@@ -35,6 +35,8 @@
 #include <sys/sleepq.h>
 #include <sys/syncobj.h>
 
+#include "rump_private.h"
+
 /*
  * Flimsy and minimalistic sleepq implementation.  This is implemented
  * only for the use of callouts in kern_timeout.c.  locking etc is
@@ -43,7 +45,6 @@
 
 syncobj_t sleep_syncobj;
 static kcondvar_t sq_cv;
-static kmutex_t sq_mtx;
 
 void
 sleepq_init(sleepq_t *sq)
@@ -52,7 +53,6 @@
 	TAILQ_INIT(sq);
 
 	cv_init(&sq_cv, "sleepq"); /* XXX */
-	mutex_init(&sq_mtx, MUTEX_DEFAULT, IPL_NONE); /* multi-XXX */
 }
 
 void
@@ -60,39 +60,46 @@
 {
 	struct lwp *l = curlwp;
 
-	if (__predict_false(sob != &sleep_syncobj || strcmp(wmsg, "callout"))) {
-		panic("sleepq: unsupported enqueue");
-	}
-
 	l->l_wchan = wc;
+	l->l_sleepq = sq;
 	TAILQ_INSERT_TAIL(sq, l, l_sleepchain);
 }
 
 int
-sleepq_block(int timo, bool hatch)
+sleepq_block(int timo, bool catch)
 {
 	struct lwp *l = curlwp;
+	int error = 0;
+	kmutex_t *mp = l->l_mutex;
+	int biglocks = l->l_biglocks;
 
-	KASSERT(timo == 0 && !hatch);
+	while (l->l_wchan) {
+		if ((error=cv_timedwait(&sq_cv, mp, timo)) == EWOULDBLOCK)
+			l->l_wchan = NULL;
+	}
+	mutex_spin_exit(mp);
 
-	mutex_enter(&sq_mtx);
-	while (l->l_wchan)
-		cv_wait(&sq_cv, &sq_mtx);
-	mutex_exit(&sq_mtx);
+	if (biglocks)
+		KERNEL_LOCK(biglocks, curlwp);
 
-	return 0;
+	return error;
 }
 
 lwp_t *
 sleepq_wake(sleepq_t *sq, wchan_t wchan, u_int expected, kmutex_t *mp)
 {
-	struct lwp *l;
+	struct lwp *l, *l_next;
 	bool found = false;
 
-	TAILQ_FOREACH(l, sq, l_sleepchain) {
+	if (__predict_false(expected != -1))
+		panic("sleepq_wake: \"expected\" not supported");
+
+	for (l = TAILQ_FIRST(sq); l; l = l_next) {
+		l_next = TAILQ_NEXT(l, l_sleepchain);
 		if (l->l_wchan == wchan) {
 			found = true;
 			l->l_wchan = NULL;
+			TAILQ_REMOVE(sq, l, l_sleepchain);
 		}
 	}
 	if (found)
@@ -102,15 +109,56 @@
 	return NULL;
 }
 
+u_int
+sleepq_unsleep(struct lwp *l, bool cleanup)
+{
+
+	l->l_wchan = NULL;
+	TAILQ_REMOVE(l->l_sleepq, l, l_sleepchain);
+	cv_broadcast(&sq_cv);
+
+	if (cleanup) {
+		mutex_spin_exit(l->l_mutex);
+	}
+
+	return 0;
+}
+
 /*
- * XXX: used only by callout, therefore here
- *
- * We don't fudge around with the lwp mutex at all, therefore
- * this is enough.
+ * Thread scheduler handles priorities.  Therefore no action here.
+ * (maybe do something if we're deperate?)
+ */
+void
+sleepq_changepri(struct lwp *l, pri_t pri)
+{
+
+}
+
+void
+sleepq_lendpri(struct lwp *l, pri_t pri)
+{
+
+}
+
+struct lwp *
+syncobj_noowner(wchan_t wc)
+{
+
+	return NULL;
+}
+
+/*
+ * XXX: used only by callout, therefore here.  should try to use
+ * one in kern_lwp directly.
  */
 kmutex_t *
 lwp_lock_retry(struct lwp *l, kmutex_t *old)
 {
 
+	while (l->l_mutex != old) {
+		mutex_spin_exit(old);
+		old = l->l_mutex;
+		mutex_spin_enter(old);
+	}
 	return old;
 }

Index: src/sys/rump/librump/rumpkern/vm.c
diff -u src/sys/rump/librump/rumpkern/vm.c:1.61 src/sys/rump/librump/rumpkern/vm.c:1.62
--- src/sys/rump/librump/rumpkern/vm.c:1.61	Tue Aug  4 23:58:29 2009
+++ src/sys/rump/librump/rumpkern/vm.c	Fri Oct 16 00:14:53 2009
@@ -1,4 +1,4 @@
-/*	$NetBSD: vm.c,v 1.61 2009/08/04 23:58:29 pooka Exp $	*/
+/*	$NetBSD: vm.c,v 1.62 2009/10/16 00:14:53 pooka Exp $	*/
 
 /*
  * Copyright (c) 2007 Antti Kantee.  All Rights Reserved.
@@ -42,7 +42,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: vm.c,v 1.61 2009/08/04 23:58:29 pooka Exp $");
+__KERNEL_RCSID(0, "$NetBSD: vm.c,v 1.62 2009/10/16 00:14:53 pooka Exp $");
 
 #include <sys/param.h>
 #include <sys/atomic.h>
@@ -715,3 +715,10 @@
 
 	/* nada */
 }
+
+void
+uvm_kick_scheduler(void)
+{
+
+	/* ouch */
+}

Reply via email to