Module Name:    src
Committed By:   pooka
Date:           Wed Nov  4 19:17:53 UTC 2009

Modified Files:
        src/sys/rump/librump/rumpkern: Makefile.rumpkern emul.c
Added Files:
        src/sys/rump/librump/rumpkern: threads.c

Log Message:
Give the kthread->pthread interface emulation its own module.


To generate a diff of this commit:
cvs rdiff -u -r1.60 -r1.61 src/sys/rump/librump/rumpkern/Makefile.rumpkern
cvs rdiff -u -r1.107 -r1.108 src/sys/rump/librump/rumpkern/emul.c
cvs rdiff -u -r0 -r1.1 src/sys/rump/librump/rumpkern/threads.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.60 src/sys/rump/librump/rumpkern/Makefile.rumpkern:1.61
--- src/sys/rump/librump/rumpkern/Makefile.rumpkern:1.60	Wed Nov  4 18:25:36 2009
+++ src/sys/rump/librump/rumpkern/Makefile.rumpkern	Wed Nov  4 19:17:53 2009
@@ -1,4 +1,4 @@
-#	$NetBSD: Makefile.rumpkern,v 1.60 2009/11/04 18:25:36 pooka Exp $
+#	$NetBSD: Makefile.rumpkern,v 1.61 2009/11/04 19:17:53 pooka Exp $
 #
 
 .include "${RUMPTOP}/Makefile.rump"
@@ -17,7 +17,7 @@
 # 
 SRCS=	rump.c rumpcopy.c emul.c intr.c locks.c ltsleep.c	\
 	memalloc.c percpu.c scheduler.c sleepq.c		\
-	sysproxy_socket.c vm.c
+	sysproxy_socket.c threads.c vm.c
 
 # stubs
 #

Index: src/sys/rump/librump/rumpkern/emul.c
diff -u src/sys/rump/librump/rumpkern/emul.c:1.107 src/sys/rump/librump/rumpkern/emul.c:1.108
--- src/sys/rump/librump/rumpkern/emul.c:1.107	Wed Nov  4 18:25:36 2009
+++ src/sys/rump/librump/rumpkern/emul.c	Wed Nov  4 19:17:53 2009
@@ -1,4 +1,4 @@
-/*	$NetBSD: emul.c,v 1.107 2009/11/04 18:25:36 pooka Exp $	*/
+/*	$NetBSD: emul.c,v 1.108 2009/11/04 19:17: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.107 2009/11/04 18:25:36 pooka Exp $");
+__KERNEL_RCSID(0, "$NetBSD: emul.c,v 1.108 2009/11/04 19:17:53 pooka Exp $");
 
 #include <sys/param.h>
 #include <sys/null.h>
@@ -43,7 +43,6 @@
 #include <sys/queue.h>
 #include <sys/file.h>
 #include <sys/filedesc.h>
-#include <sys/kthread.h>
 #include <sys/cpu.h>
 #include <sys/kmem.h>
 #include <sys/poll.h>
@@ -55,8 +54,6 @@
 
 #include <dev/cons.h>
 
-#include <machine/stdarg.h>
-
 #include <rump/rumpuser.h>
 
 #include <uvm/uvm_map.h>
@@ -193,115 +190,6 @@
 	microtime(tv);
 }
 
-struct kthdesc {
-	void (*f)(void *);
-	void *arg;
-	struct lwp *mylwp;
-};
-
-static void *
-threadbouncer(void *arg)
-{
-	struct kthdesc *k = arg;
-	void (*f)(void *);
-	void *thrarg;
-
-	/* schedule ourselves first */
-	f = k->f;
-	thrarg = k->arg;
-	rumpuser_set_curlwp(k->mylwp);
-	rump_schedule();
-
-	kmem_free(k, sizeof(struct kthdesc));
-	if ((curlwp->l_pflag & LP_MPSAFE) == 0)
-		KERNEL_LOCK(1, NULL);
-
-	f(thrarg);
-
-	panic("unreachable, should kthread_exit()");
-}
-
-int
-kthread_create(pri_t pri, int flags, struct cpu_info *ci,
-	void (*func)(void *), void *arg, lwp_t **newlp, const char *fmt, ...)
-{
-	char thrstore[MAXCOMLEN];
-	const char *thrname = NULL;
-	va_list ap;
-	struct kthdesc *k;
-	struct lwp *l;
-	int rv;
-
-	thrstore[0] = '\0';
-	if (fmt) {
-		va_start(ap, fmt);
-		vsnprintf(thrstore, sizeof(thrstore), fmt, ap);
-		va_end(ap);
-		thrname = thrstore;
-	}
-
-	/*
-	 * We don't want a module unload thread.
-	 * (XXX: yes, this is a kludge too, and the kernel should
-	 * have a more flexible method for configuring which threads
-	 * we want).
-	 */
-	if (strcmp(thrstore, "modunload") == 0) {
-		return 0;
-	}
-
-	if (!rump_threads) {
-		/* fake them */
-		if (strcmp(thrstore, "vrele") == 0) {
-			printf("rump warning: threads not enabled, not starting"
-			   " vrele thread\n");
-			return 0;
-		} else if (strcmp(thrstore, "cachegc") == 0) {
-			printf("rump warning: threads not enabled, not starting"
-			   " namecache g/c thread\n");
-			return 0;
-		} else if (strcmp(thrstore, "nfssilly") == 0) {
-			printf("rump warning: threads not enabled, not enabling"
-			   " nfs silly rename\n");
-			return 0;
-		} else if (strcmp(thrstore, "unpgc") == 0) {
-			printf("rump warning: threads not enabled, not enabling"
-			   " UNP garbage collection\n");
-			return 0;
-		} else
-			panic("threads not available, setenv RUMP_THREADS 1");
-	}
-
-	KASSERT(fmt != NULL);
-	if (ci != NULL)
-		panic("%s: bounded threads not supported", __func__);
-
-	k = kmem_alloc(sizeof(struct kthdesc), KM_SLEEP);
-	k->f = func;
-	k->arg = arg;
-	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);
-	if (rv)
-		return rv;
-
-	if (newlp)
-		*newlp = l;
-	return 0;
-}
-
-void
-kthread_exit(int ecode)
-{
-
-	if ((curlwp->l_pflag & LP_MPSAFE) == 0)
-		KERNEL_UNLOCK_ONE(NULL);
-	rump_lwp_release(curlwp);
-	rump_unschedule();
-	rumpuser_thread_exit();
-}
-
 struct proc *
 p_find(pid_t pid, uint flags)
 {

Added files:

Index: src/sys/rump/librump/rumpkern/threads.c
diff -u /dev/null src/sys/rump/librump/rumpkern/threads.c:1.1
--- /dev/null	Wed Nov  4 19:17:53 2009
+++ src/sys/rump/librump/rumpkern/threads.c	Wed Nov  4 19:17:53 2009
@@ -0,0 +1,152 @@
+/*	$NetBSD: threads.c,v 1.1 2009/11/04 19:17:53 pooka Exp $	*/
+
+/*
+ * Copyright (c) 2007-2009 Antti Kantee.  All Rights Reserved.
+ *
+ * Development of this software was supported by
+ * The Finnish Cultural Foundation.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS
+ * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+ * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+#include <sys/cdefs.h>
+__KERNEL_RCSID(0, "$NetBSD: threads.c,v 1.1 2009/11/04 19:17:53 pooka Exp $");
+
+#include <sys/param.h>
+#include <sys/kmem.h>
+#include <sys/kthread.h>
+#include <sys/systm.h>
+
+#include <machine/stdarg.h>
+
+#include <rump/rumpuser.h>
+
+#include "rump_private.h"
+
+struct kthdesc {
+	void (*f)(void *);
+	void *arg;
+	struct lwp *mylwp;
+};
+
+static void *
+threadbouncer(void *arg)
+{
+	struct kthdesc *k = arg;
+	void (*f)(void *);
+	void *thrarg;
+
+	/* schedule ourselves first */
+	f = k->f;
+	thrarg = k->arg;
+	rumpuser_set_curlwp(k->mylwp);
+	rump_schedule();
+
+	kmem_free(k, sizeof(struct kthdesc));
+	if ((curlwp->l_pflag & LP_MPSAFE) == 0)
+		KERNEL_LOCK(1, NULL);
+
+	f(thrarg);
+
+	panic("unreachable, should kthread_exit()");
+}
+
+int
+kthread_create(pri_t pri, int flags, struct cpu_info *ci,
+	void (*func)(void *), void *arg, lwp_t **newlp, const char *fmt, ...)
+{
+	char thrstore[MAXCOMLEN];
+	const char *thrname = NULL;
+	va_list ap;
+	struct kthdesc *k;
+	struct lwp *l;
+	int rv;
+
+	thrstore[0] = '\0';
+	if (fmt) {
+		va_start(ap, fmt);
+		vsnprintf(thrstore, sizeof(thrstore), fmt, ap);
+		va_end(ap);
+		thrname = thrstore;
+	}
+
+	/*
+	 * We don't want a module unload thread.
+	 * (XXX: yes, this is a kludge too, and the kernel should
+	 * have a more flexible method for configuring which threads
+	 * we want).
+	 */
+	if (strcmp(thrstore, "modunload") == 0) {
+		return 0;
+	}
+
+	if (!rump_threads) {
+		/* fake them */
+		if (strcmp(thrstore, "vrele") == 0) {
+			printf("rump warning: threads not enabled, not starting"
+			   " vrele thread\n");
+			return 0;
+		} else if (strcmp(thrstore, "cachegc") == 0) {
+			printf("rump warning: threads not enabled, not starting"
+			   " namecache g/c thread\n");
+			return 0;
+		} else if (strcmp(thrstore, "nfssilly") == 0) {
+			printf("rump warning: threads not enabled, not enabling"
+			   " nfs silly rename\n");
+			return 0;
+		} else if (strcmp(thrstore, "unpgc") == 0) {
+			printf("rump warning: threads not enabled, not enabling"
+			   " UNP garbage collection\n");
+			return 0;
+		} else
+			panic("threads not available, setenv RUMP_THREADS 1");
+	}
+
+	KASSERT(fmt != NULL);
+	if (ci != NULL)
+		panic("%s: bounded threads not supported", __func__);
+
+	k = kmem_alloc(sizeof(struct kthdesc), KM_SLEEP);
+	k->f = func;
+	k->arg = arg;
+	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);
+	if (rv)
+		return rv;
+
+	if (newlp)
+		*newlp = l;
+	return 0;
+}
+
+void
+kthread_exit(int ecode)
+{
+
+	if ((curlwp->l_pflag & LP_MPSAFE) == 0)
+		KERNEL_UNLOCK_ONE(NULL);
+	rump_lwp_release(curlwp);
+	rump_unschedule();
+	rumpuser_thread_exit();
+}

Reply via email to