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(); +}