Module Name: src Committed By: pooka Date: Wed May 15 14:07:26 UTC 2013
Modified Files: src/lib/librumpuser: rumpuser.3 rumpuser_pth.c src/sys/rump/include/rump: rumpuser.h src/sys/rump/librump/rumpkern: lwproc.c rump.c scheduler.c Log Message: Add RUMPUSER_LWP_CLEAR instead of overloading RUMPUSER_LWP_SET. This simplifies some alternative hypervisor implementations. To generate a diff of this commit: cvs rdiff -u -r1.9 -r1.10 src/lib/librumpuser/rumpuser.3 cvs rdiff -u -r1.28 -r1.29 src/lib/librumpuser/rumpuser_pth.c cvs rdiff -u -r1.103 -r1.104 src/sys/rump/include/rump/rumpuser.h cvs rdiff -u -r1.22 -r1.23 src/sys/rump/librump/rumpkern/lwproc.c cvs rdiff -u -r1.268 -r1.269 src/sys/rump/librump/rumpkern/rump.c cvs rdiff -u -r1.33 -r1.34 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/lib/librumpuser/rumpuser.3 diff -u src/lib/librumpuser/rumpuser.3:1.9 src/lib/librumpuser/rumpuser.3:1.10 --- src/lib/librumpuser/rumpuser.3:1.9 Fri May 3 20:27:16 2013 +++ src/lib/librumpuser/rumpuser.3 Wed May 15 14:07:26 2013 @@ -1,4 +1,4 @@ -.\" $NetBSD: rumpuser.3,v 1.9 2013/05/03 20:27:16 wiz Exp $ +.\" $NetBSD: rumpuser.3,v 1.10 2013/05/15 14:07:26 pooka Exp $ .\" .\" Copyright (c) 2013 Antti Kantee. All rights reserved. .\" @@ -23,7 +23,7 @@ .\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF .\" SUCH DAMAGE. .\" -.Dd May 2, 2013 +.Dd May 15, 2013 .Dt RUMPUSER 3 .Os .Sh NAME @@ -475,10 +475,14 @@ from the hypervisor. Set .Fa l as the current host thread's rump kernel context. -The value -.Dv NULL -means that an existing rump kernel context (which must exist) -must be cleared. +A previous context must not exist. +.It Dv RUMPUSER_LWP_CLEAR +Clear the context previous set by +.Dv RUMPUSER_LWP_SET . +The value passed in +.Fa l +is the current thread and is never +.Dv NULL. .El .Pp .Ft struct lwp * @@ -641,7 +645,8 @@ Routines which do not return an integer .%A Antti Kantee .%D 2012 .%J Aalto University Doctoral Dissertations -.%T Flexible Operating System Internals: The Design and Implementation of the Anykernel and Rump Kernerls +.%T Flexible Operating System Internals: The Design and Implementation of the Anykernel and Rump Kernels +.%O Section 2.3.2: The Hypercall Interface .Re .Sh HISTORY The rump kernel hypercall API was first introduced in Index: src/lib/librumpuser/rumpuser_pth.c diff -u src/lib/librumpuser/rumpuser_pth.c:1.28 src/lib/librumpuser/rumpuser_pth.c:1.29 --- src/lib/librumpuser/rumpuser_pth.c:1.28 Sun May 5 12:27:38 2013 +++ src/lib/librumpuser/rumpuser_pth.c Wed May 15 14:07:26 2013 @@ -1,4 +1,4 @@ -/* $NetBSD: rumpuser_pth.c,v 1.28 2013/05/05 12:27:38 pooka Exp $ */ +/* $NetBSD: rumpuser_pth.c,v 1.29 2013/05/15 14:07:26 pooka Exp $ */ /* * Copyright (c) 2007-2010 Antti Kantee. All Rights Reserved. @@ -28,7 +28,7 @@ #include "rumpuser_port.h" #if !defined(lint) -__RCSID("$NetBSD: rumpuser_pth.c,v 1.28 2013/05/05 12:27:38 pooka Exp $"); +__RCSID("$NetBSD: rumpuser_pth.c,v 1.29 2013/05/15 14:07:26 pooka Exp $"); #endif /* !lint */ #include <sys/queue.h> @@ -627,26 +627,27 @@ rumpuser_curlwpop(enum rumplwpop op, str free(rl); break; case RUMPUSER_LWP_SET: - assert(pthread_getspecific(curlwpkey) == NULL || l == NULL); + assert(pthread_getspecific(curlwpkey) == NULL && l != NULL); - if (l) { - pthread_mutex_lock(&lwplock); - LIST_FOREACH(rl, &lwps, l_entries) { - if (rl->l == l) - break; - } - if (!rl) { - fprintf(stderr, - "LWP_SET: %p does not exist\n", l); - abort(); - } - pthread_mutex_unlock(&lwplock); - } else { - rl = NULL; + pthread_mutex_lock(&lwplock); + LIST_FOREACH(rl, &lwps, l_entries) { + if (rl->l == l) + break; } + if (!rl) { + fprintf(stderr, + "LWP_SET: %p does not exist\n", l); + abort(); + } + pthread_mutex_unlock(&lwplock); pthread_setspecific(curlwpkey, rl); break; + case RUMPUSER_LWP_CLEAR: + assert(((struct rumpuser_lwp *) + pthread_getspecific(curlwpkey))->l == l); + pthread_setspecific(curlwpkey, NULL); + break; } } @@ -671,9 +672,13 @@ rumpuser_curlwpop(enum rumplwpop op, str case RUMPUSER_LWP_DESTROY: break; case RUMPUSER_LWP_SET: - assert(pthread_getspecific(curlwpkey) == NULL || l == NULL); + assert(pthread_getspecific(curlwpkey) == NULL); pthread_setspecific(curlwpkey, l); break; + case RUMPUSER_LWP_CLEAR: + assert(pthread_getspecific(curlwpkey) == l); + pthread_setspecific(curlwpkey, NULL); + break; } } Index: src/sys/rump/include/rump/rumpuser.h diff -u src/sys/rump/include/rump/rumpuser.h:1.103 src/sys/rump/include/rump/rumpuser.h:1.104 --- src/sys/rump/include/rump/rumpuser.h:1.103 Thu May 2 21:45:28 2013 +++ src/sys/rump/include/rump/rumpuser.h Wed May 15 14:07:26 2013 @@ -1,4 +1,4 @@ -/* $NetBSD: rumpuser.h,v 1.103 2013/05/02 21:45:28 pooka Exp $ */ +/* $NetBSD: rumpuser.h,v 1.104 2013/05/15 14:07:26 pooka Exp $ */ /* * Copyright (c) 2007-2013 Antti Kantee. All Rights Reserved. @@ -164,7 +164,10 @@ int rumpuser_thread_create(void *(*f)(v void rumpuser_thread_exit(void) __dead; int rumpuser_thread_join(void *); -enum rumplwpop { RUMPUSER_LWP_CREATE, RUMPUSER_LWP_DESTROY, RUMPUSER_LWP_SET }; +enum rumplwpop { + RUMPUSER_LWP_CREATE, RUMPUSER_LWP_DESTROY, + RUMPUSER_LWP_SET, RUMPUSER_LWP_CLEAR +}; void rumpuser_curlwpop(enum rumplwpop, struct lwp *); struct lwp *rumpuser_curlwp(void); Index: src/sys/rump/librump/rumpkern/lwproc.c diff -u src/sys/rump/librump/rumpkern/lwproc.c:1.22 src/sys/rump/librump/rumpkern/lwproc.c:1.23 --- src/sys/rump/librump/rumpkern/lwproc.c:1.22 Thu May 2 19:15:01 2013 +++ src/sys/rump/librump/rumpkern/lwproc.c Wed May 15 14:07:26 2013 @@ -1,4 +1,4 @@ -/* $NetBSD: lwproc.c,v 1.22 2013/05/02 19:15:01 pooka Exp $ */ +/* $NetBSD: lwproc.c,v 1.23 2013/05/15 14:07:26 pooka Exp $ */ /* * Copyright (c) 2010, 2011 Antti Kantee. All Rights Reserved. @@ -26,7 +26,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: lwproc.c,v 1.22 2013/05/02 19:15:01 pooka Exp $"); +__KERNEL_RCSID(0, "$NetBSD: lwproc.c,v 1.23 2013/05/15 14:07:26 pooka Exp $"); #include <sys/param.h> #include <sys/atomic.h> @@ -352,7 +352,7 @@ rump_lwproc_switch(struct lwp *newlwp) fd_free(); } - rumpuser_curlwpop(RUMPUSER_LWP_SET, NULL); + rumpuser_curlwpop(RUMPUSER_LWP_CLEAR, l); newlwp->l_cpu = newlwp->l_target_cpu = l->l_cpu; newlwp->l_mutex = l->l_mutex; Index: src/sys/rump/librump/rumpkern/rump.c diff -u src/sys/rump/librump/rumpkern/rump.c:1.268 src/sys/rump/librump/rumpkern/rump.c:1.269 --- src/sys/rump/librump/rumpkern/rump.c:1.268 Thu May 2 21:45:28 2013 +++ src/sys/rump/librump/rumpkern/rump.c Wed May 15 14:07:26 2013 @@ -1,4 +1,4 @@ -/* $NetBSD: rump.c,v 1.268 2013/05/02 21:45:28 pooka Exp $ */ +/* $NetBSD: rump.c,v 1.269 2013/05/15 14:07:26 pooka Exp $ */ /* * Copyright (c) 2007-2011 Antti Kantee. All Rights Reserved. @@ -26,7 +26,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: rump.c,v 1.268 2013/05/02 21:45:28 pooka Exp $"); +__KERNEL_RCSID(0, "$NetBSD: rump.c,v 1.269 2013/05/15 14:07:26 pooka Exp $"); #include <sys/systm.h> #define ELFSIZE ARCH_ELFSIZE @@ -346,7 +346,7 @@ rump_init(void) rump_scheduler_init(numcpu); /* revert temporary context and schedule a semireal context */ - rumpuser_curlwpop(RUMPUSER_LWP_SET, NULL); + rumpuser_curlwpop(RUMPUSER_LWP_CLEAR, l); initproc = &proc0; /* borrow proc0 before we get initproc started */ rump_schedule(); bootlwp = curlwp; Index: src/sys/rump/librump/rumpkern/scheduler.c diff -u src/sys/rump/librump/rumpkern/scheduler.c:1.33 src/sys/rump/librump/rumpkern/scheduler.c:1.34 --- src/sys/rump/librump/rumpkern/scheduler.c:1.33 Thu May 2 19:15:01 2013 +++ src/sys/rump/librump/rumpkern/scheduler.c Wed May 15 14:07:26 2013 @@ -1,4 +1,4 @@ -/* $NetBSD: scheduler.c,v 1.33 2013/05/02 19:15:01 pooka Exp $ */ +/* $NetBSD: scheduler.c,v 1.34 2013/05/15 14:07:26 pooka Exp $ */ /* * Copyright (c) 2010, 2011 Antti Kantee. All Rights Reserved. @@ -26,7 +26,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: scheduler.c,v 1.33 2013/05/02 19:15:01 pooka Exp $"); +__KERNEL_RCSID(0, "$NetBSD: scheduler.c,v 1.34 2013/05/15 14:07:26 pooka Exp $"); #include <sys/param.h> #include <sys/atomic.h> @@ -399,10 +399,10 @@ rump_unschedule() lwp0.l_mutex = &unruntime_lock; lwp0.l_pflag &= ~LP_RUNNING; lwp0rele(); - rumpuser_curlwpop(RUMPUSER_LWP_SET, NULL); + rumpuser_curlwpop(RUMPUSER_LWP_CLEAR, &lwp0); } else if (__predict_false(l->l_flag & LW_RUMP_CLEAR)) { - rumpuser_curlwpop(RUMPUSER_LWP_SET, NULL); + rumpuser_curlwpop(RUMPUSER_LWP_CLEAR, l); l->l_flag &= ~LW_RUMP_CLEAR; } }