Module Name: src
Committed By: pooka
Date: Sat Mar 15 15:15:27 UTC 2014
Modified Files:
src/sys/rump: Makefile.rump
src/sys/rump/include/machine: cpu.h
src/sys/rump/include/rump: rumpuser.h
src/sys/rump/librump/rumpkern: lwproc.c rump.c rump_private.h
scheduler.c threads.c
src/sys/rump/librump/rumpkern/arch/x86: rump_x86_cpu.c
Added Files:
src/sys/rump/librump/rumpkern: rump_curlwp.h rump_curlwp___thread.h
rump_curlwp_hypercall.h
Log Message:
Allow compile-time optimizations to curlwp. This can have a pretty
staggering impact on performance. When running sendto() in a loop,
the improvement is 200k more calls per second with an inlined __thread
curlwp as opposed to the default. In other words, it shaves off hundreds
of CPU cycles per call (~20%). Even just eliminating the x86_curlwp()
call in favor of an inline gives an improvement of 60k calls per second.
To generate a diff of this commit:
cvs rdiff -u -r1.91 -r1.92 src/sys/rump/Makefile.rump
cvs rdiff -u -r1.19 -r1.20 src/sys/rump/include/machine/cpu.h
cvs rdiff -u -r1.108 -r1.109 src/sys/rump/include/rump/rumpuser.h
cvs rdiff -u -r1.26 -r1.27 src/sys/rump/librump/rumpkern/lwproc.c
cvs rdiff -u -r1.289 -r1.290 src/sys/rump/librump/rumpkern/rump.c
cvs rdiff -u -r0 -r1.1 src/sys/rump/librump/rumpkern/rump_curlwp.h \
src/sys/rump/librump/rumpkern/rump_curlwp___thread.h \
src/sys/rump/librump/rumpkern/rump_curlwp_hypercall.h
cvs rdiff -u -r1.79 -r1.80 src/sys/rump/librump/rumpkern/rump_private.h
cvs rdiff -u -r1.35 -r1.36 src/sys/rump/librump/rumpkern/scheduler.c
cvs rdiff -u -r1.21 -r1.22 src/sys/rump/librump/rumpkern/threads.c
cvs rdiff -u -r1.1 -r1.2 \
src/sys/rump/librump/rumpkern/arch/x86/rump_x86_cpu.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/Makefile.rump
diff -u src/sys/rump/Makefile.rump:1.91 src/sys/rump/Makefile.rump:1.92
--- src/sys/rump/Makefile.rump:1.91 Thu Mar 13 01:34:06 2014
+++ src/sys/rump/Makefile.rump Sat Mar 15 15:15:26 2014
@@ -1,4 +1,4 @@
-# $NetBSD: Makefile.rump,v 1.91 2014/03/13 01:34:06 pooka Exp $
+# $NetBSD: Makefile.rump,v 1.92 2014/03/15 15:15:26 pooka Exp $
#
WARNS?= 3 # XXX: src/sys won't compile with -Wsign-compare yet
@@ -8,14 +8,13 @@ NOLINT= # kernel code
# Use NetBSD kernel ABI by default on x86 archs. Performance-related
# compile-time options may override this at a later date.
-.if ${MACHINE_ARCH} == "i386" || \
- ${MACHINE_ARCH} == "x86_64"
+.if (${MACHINE_ARCH} == "i386" || ${MACHINE_ARCH} == "x86_64")
_RUMP_NATIVEABI= yes
CPPFLAGS+= -D_RUMP_NATIVE_ABI
.else
_RUMP_NATIVEABI= no
CPPFLAGS:= -I${RUMPTOP}/include ${CPPFLAGS}
-CPPFLAGS+= -D_RUMPKERNEL
+CPPFLAGS+= -D_RUMPKERNEL -I${RUMPTOP}/librump/rumpkern
.endif
CPPFLAGS+= -DMAXUSERS=32
Index: src/sys/rump/include/machine/cpu.h
diff -u src/sys/rump/include/machine/cpu.h:1.19 src/sys/rump/include/machine/cpu.h:1.20
--- src/sys/rump/include/machine/cpu.h:1.19 Mon Mar 10 23:02:07 2014
+++ src/sys/rump/include/machine/cpu.h Sat Mar 15 15:15:26 2014
@@ -1,4 +1,4 @@
-/* $NetBSD: cpu.h,v 1.19 2014/03/10 23:02:07 pooka Exp $ */
+/* $NetBSD: cpu.h,v 1.20 2014/03/15 15:15:26 pooka Exp $ */
/*
* Copyright (c) 2008-2011 Antti Kantee. All Rights Reserved.
@@ -38,6 +38,8 @@
#include <sys/cpu_data.h>
#include <machine/pcb.h>
+#include "rump_curlwp.h"
+
struct cpu_info {
struct cpu_data ci_data;
cpuid_t ci_cpuid;
@@ -73,8 +75,7 @@ static __inline void cpu_handle_ipi(void
void __syncicache(void *, size_t);
#endif /* __powerpc__ */
-struct lwp *rumpuser_curlwp(void);
-#define curlwp rumpuser_curlwp()
+#define curlwp rump_curlwp_fast()
#define curcpu() (curlwp->l_cpu)
#define cpu_number() (cpu_index(curcpu))
Index: src/sys/rump/include/rump/rumpuser.h
diff -u src/sys/rump/include/rump/rumpuser.h:1.108 src/sys/rump/include/rump/rumpuser.h:1.109
--- src/sys/rump/include/rump/rumpuser.h:1.108 Wed May 15 16:00:04 2013
+++ src/sys/rump/include/rump/rumpuser.h Sat Mar 15 15:15:26 2014
@@ -1,4 +1,4 @@
-/* $NetBSD: rumpuser.h,v 1.108 2013/05/15 16:00:04 pooka Exp $ */
+/* $NetBSD: rumpuser.h,v 1.109 2014/03/15 15:15:26 pooka Exp $ */
/*
* Copyright (c) 2007-2013 Antti Kantee. All Rights Reserved.
@@ -175,12 +175,14 @@ int rumpuser_thread_create(void *(*f)(v
void rumpuser_thread_exit(void) __dead;
int rumpuser_thread_join(void *);
+#if defined(LIBRUMPUSER) || defined(RUMP_CURLWP_PRIVATE)
enum rumplwpop {
RUMPUSER_LWP_CREATE, RUMPUSER_LWP_DESTROY,
RUMPUSER_LWP_SET, RUMPUSER_LWP_CLEAR
};
void rumpuser_curlwpop(int, struct lwp *);
struct lwp *rumpuser_curlwp(void);
+#endif /* LIBRUMPUSER || RUMP_CURLWP_PRIVATE */
struct rumpuser_mtx;
#define RUMPUSER_MTX_SPIN 0x01
Index: src/sys/rump/librump/rumpkern/lwproc.c
diff -u src/sys/rump/librump/rumpkern/lwproc.c:1.26 src/sys/rump/librump/rumpkern/lwproc.c:1.27
--- src/sys/rump/librump/rumpkern/lwproc.c:1.26 Mon Dec 16 15:36:29 2013
+++ src/sys/rump/librump/rumpkern/lwproc.c Sat Mar 15 15:15:27 2014
@@ -1,4 +1,4 @@
-/* $NetBSD: lwproc.c,v 1.26 2013/12/16 15:36:29 pooka Exp $ */
+/* $NetBSD: lwproc.c,v 1.27 2014/03/15 15:15:27 pooka Exp $ */
/*
* Copyright (c) 2010, 2011 Antti Kantee. All Rights Reserved.
@@ -25,8 +25,10 @@
* SUCH DAMAGE.
*/
+#define RUMP_CURLWP_PRIVATE
+
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: lwproc.c,v 1.26 2013/12/16 15:36:29 pooka Exp $");
+__KERNEL_RCSID(0, "$NetBSD: lwproc.c,v 1.27 2014/03/15 15:15:27 pooka Exp $");
#include <sys/param.h>
#include <sys/atomic.h>
@@ -42,11 +44,41 @@ __KERNEL_RCSID(0, "$NetBSD: lwproc.c,v 1
#include <sys/uidinfo.h>
#include <rump/rumpuser.h>
-
#include "rump_private.h"
+#include "rump_curlwp.h"
struct emul *emul_default = &emul_netbsd;
+void
+rump_lwproc_init(void)
+{
+
+ lwproc_curlwpop(RUMPUSER_LWP_CREATE, &lwp0);
+}
+
+struct lwp *
+rump_lwproc_curlwp_hypercall(void)
+{
+
+ return rumpuser_curlwp();
+}
+
+void
+rump_lwproc_curlwp_set(struct lwp *l)
+{
+
+ KASSERT(curlwp == NULL);
+ lwproc_curlwpop(RUMPUSER_LWP_SET, l);
+}
+
+void
+rump_lwproc_curlwp_clear(struct lwp *l)
+{
+
+ KASSERT(l == curlwp);
+ lwproc_curlwpop(RUMPUSER_LWP_CLEAR, l);
+}
+
static void
lwproc_proc_free(struct proc *p)
{
@@ -219,7 +251,7 @@ lwproc_freelwp(struct lwp *l)
kmem_free(l->l_name, MAXCOMLEN);
lwp_finispecific(l);
- rumpuser_curlwpop(RUMPUSER_LWP_DESTROY, l);
+ lwproc_curlwpop(RUMPUSER_LWP_DESTROY, l);
membar_exit();
kmem_free(l, sizeof(*l));
@@ -255,7 +287,7 @@ lwproc_makelwp(struct proc *p, struct lw
lwp_initspecific(l);
membar_enter();
- rumpuser_curlwpop(RUMPUSER_LWP_CREATE, l);
+ lwproc_curlwpop(RUMPUSER_LWP_CREATE, l);
if (doswitch) {
rump_lwproc_switch(l);
}
@@ -364,13 +396,13 @@ rump_lwproc_switch(struct lwp *newlwp)
}
KERNEL_UNLOCK_ALL(NULL, &l->l_biglocks);
- rumpuser_curlwpop(RUMPUSER_LWP_CLEAR, l);
+ lwproc_curlwpop(RUMPUSER_LWP_CLEAR, l);
newlwp->l_cpu = newlwp->l_target_cpu = l->l_cpu;
newlwp->l_mutex = l->l_mutex;
newlwp->l_pflag |= LP_RUNNING;
- rumpuser_curlwpop(RUMPUSER_LWP_SET, newlwp);
+ lwproc_curlwpop(RUMPUSER_LWP_SET, newlwp);
curcpu()->ci_curlwp = newlwp;
KERNEL_LOCK(newlwp->l_biglocks, NULL);
Index: src/sys/rump/librump/rumpkern/rump.c
diff -u src/sys/rump/librump/rumpkern/rump.c:1.289 src/sys/rump/librump/rumpkern/rump.c:1.290
--- src/sys/rump/librump/rumpkern/rump.c:1.289 Mon Mar 10 22:44:11 2014
+++ src/sys/rump/librump/rumpkern/rump.c Sat Mar 15 15:15:27 2014
@@ -1,4 +1,4 @@
-/* $NetBSD: rump.c,v 1.289 2014/03/10 22:44:11 pooka Exp $ */
+/* $NetBSD: rump.c,v 1.290 2014/03/15 15:15:27 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.289 2014/03/10 22:44:11 pooka Exp $");
+__KERNEL_RCSID(0, "$NetBSD: rump.c,v 1.290 2014/03/15 15:15:27 pooka Exp $");
#include <sys/systm.h>
#define ELFSIZE ARCH_ELFSIZE
@@ -254,12 +254,10 @@ rump_init(void)
}
/* init minimal lwp/cpu context */
+ rump_lwproc_init();
l = &lwp0;
l->l_cpu = l->l_target_cpu = rump_cpu;
-
- /* lwp0 isn't created like other threads, so notify hypervisor here */
- rumpuser_curlwpop(RUMPUSER_LWP_CREATE, l);
- rumpuser_curlwpop(RUMPUSER_LWP_SET, l);
+ rump_lwproc_curlwp_set(l);
/* retrieve env vars which affect the early stage of bootstrap */
if (rumpuser_getparam("RUMP_THREADS", buf, sizeof(buf)) == 0) {
@@ -341,7 +339,7 @@ rump_init(void)
rump_scheduler_init(numcpu);
/* revert temporary context and schedule a semireal context */
- rumpuser_curlwpop(RUMPUSER_LWP_CLEAR, l);
+ rump_lwproc_curlwp_clear(l);
initproc = &proc0; /* borrow proc0 before we get initproc started */
rump_schedule();
bootlwp = curlwp;
Index: src/sys/rump/librump/rumpkern/rump_private.h
diff -u src/sys/rump/librump/rumpkern/rump_private.h:1.79 src/sys/rump/librump/rumpkern/rump_private.h:1.80
--- src/sys/rump/librump/rumpkern/rump_private.h:1.79 Fri Jan 17 01:32:53 2014
+++ src/sys/rump/librump/rumpkern/rump_private.h Sat Mar 15 15:15:27 2014
@@ -1,4 +1,4 @@
-/* $NetBSD: rump_private.h,v 1.79 2014/01/17 01:32:53 pooka Exp $ */
+/* $NetBSD: rump_private.h,v 1.80 2014/03/15 15:15:27 pooka Exp $ */
/*
* Copyright (c) 2007-2011 Antti Kantee. All Rights Reserved.
@@ -152,4 +152,8 @@ void rump_consdev_init(void);
void rump_hyperentropy_init(void);
+void rump_lwproc_init(void);
+void rump_lwproc_curlwp_set(struct lwp *);
+void rump_lwproc_curlwp_clear(struct lwp *);
+
#endif /* _SYS_RUMP_PRIVATE_H_ */
Index: src/sys/rump/librump/rumpkern/scheduler.c
diff -u src/sys/rump/librump/rumpkern/scheduler.c:1.35 src/sys/rump/librump/rumpkern/scheduler.c:1.36
--- src/sys/rump/librump/rumpkern/scheduler.c:1.35 Mon Dec 9 19:47:59 2013
+++ src/sys/rump/librump/rumpkern/scheduler.c Sat Mar 15 15:15:27 2014
@@ -1,4 +1,4 @@
-/* $NetBSD: scheduler.c,v 1.35 2013/12/09 19:47:59 pooka Exp $ */
+/* $NetBSD: scheduler.c,v 1.36 2014/03/15 15:15:27 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.35 2013/12/09 19:47:59 pooka Exp $");
+__KERNEL_RCSID(0, "$NetBSD: scheduler.c,v 1.36 2014/03/15 15:15:27 pooka Exp $");
#include <sys/param.h>
#include <sys/atomic.h>
@@ -240,7 +240,7 @@ rump_schedule()
* for this case -- anyone who cares about performance will
* start a real thread.
*/
- if (__predict_true((l = rumpuser_curlwp()) != NULL)) {
+ if (__predict_true((l = curlwp) != NULL)) {
rump_schedule_cpu(l);
LWP_CACHE_CREDS(l, l->l_proc);
} else {
@@ -248,7 +248,7 @@ rump_schedule()
/* schedule cpu and use lwp0 */
rump_schedule_cpu(&lwp0);
- rumpuser_curlwpop(RUMPUSER_LWP_SET, &lwp0);
+ rump_lwproc_curlwp_set(&lwp0);
/* allocate thread, switch to it, and release lwp0 */
l = rump__lwproc_alloclwp(initproc);
@@ -365,7 +365,7 @@ rump_schedule_cpu_interlock(struct lwp *
void
rump_unschedule()
{
- struct lwp *l = rumpuser_curlwp();
+ struct lwp *l = curlwp;
#ifdef DIAGNOSTIC
int nlock;
@@ -399,10 +399,10 @@ rump_unschedule()
lwp0.l_mutex = &unruntime_lock;
lwp0.l_pflag &= ~LP_RUNNING;
lwp0rele();
- rumpuser_curlwpop(RUMPUSER_LWP_CLEAR, &lwp0);
+ rump_lwproc_curlwp_clear(&lwp0);
} else if (__predict_false(l->l_flag & LW_RUMP_CLEAR)) {
- rumpuser_curlwpop(RUMPUSER_LWP_CLEAR, l);
+ rump_lwproc_curlwp_clear(l);
l->l_flag &= ~LW_RUMP_CLEAR;
}
}
Index: src/sys/rump/librump/rumpkern/threads.c
diff -u src/sys/rump/librump/rumpkern/threads.c:1.21 src/sys/rump/librump/rumpkern/threads.c:1.22
--- src/sys/rump/librump/rumpkern/threads.c:1.21 Thu May 2 19:15:01 2013
+++ src/sys/rump/librump/rumpkern/threads.c Sat Mar 15 15:15:27 2014
@@ -1,4 +1,4 @@
-/* $NetBSD: threads.c,v 1.21 2013/05/02 19:15:01 pooka Exp $ */
+/* $NetBSD: threads.c,v 1.22 2014/03/15 15:15:27 pooka Exp $ */
/*
* Copyright (c) 2007-2009 Antti Kantee. All Rights Reserved.
@@ -29,7 +29,7 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: threads.c,v 1.21 2013/05/02 19:15:01 pooka Exp $");
+__KERNEL_RCSID(0, "$NetBSD: threads.c,v 1.22 2014/03/15 15:15:27 pooka Exp $");
#include <sys/param.h>
#include <sys/atomic.h>
@@ -73,7 +73,7 @@ threadbouncer(void *arg)
}
/* schedule ourselves */
- rumpuser_curlwpop(RUMPUSER_LWP_SET, l);
+ rump_lwproc_curlwp_set(l);
rump_schedule();
/* free dance struct */
Index: src/sys/rump/librump/rumpkern/arch/x86/rump_x86_cpu.c
diff -u src/sys/rump/librump/rumpkern/arch/x86/rump_x86_cpu.c:1.1 src/sys/rump/librump/rumpkern/arch/x86/rump_x86_cpu.c:1.2
--- src/sys/rump/librump/rumpkern/arch/x86/rump_x86_cpu.c:1.1 Wed Feb 12 22:28:43 2014
+++ src/sys/rump/librump/rumpkern/arch/x86/rump_x86_cpu.c Sat Mar 15 15:15:27 2014
@@ -1,4 +1,4 @@
-/* $NetBSD: rump_x86_cpu.c,v 1.1 2014/02/12 22:28:43 pooka Exp $ */
+/* $NetBSD: rump_x86_cpu.c,v 1.2 2014/03/15 15:15:27 pooka Exp $ */
/*
* Copyright (c) 2008 Antti Kantee. All Rights Reserved.
@@ -29,13 +29,14 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: rump_x86_cpu.c,v 1.1 2014/02/12 22:28:43 pooka Exp $");
+__KERNEL_RCSID(0, "$NetBSD: rump_x86_cpu.c,v 1.2 2014/03/15 15:15:27 pooka Exp $");
#include <sys/param.h>
#include <machine/cpu.h>
#include "rump_private.h"
+#include "rump_curlwp.h"
struct cpu_info *cpu_info_list;
@@ -65,7 +66,7 @@ struct lwp *
x86_curlwp()
{
- return rumpuser_curlwp();
+ return rump_curlwp_fast();
}
void
Added files:
Index: src/sys/rump/librump/rumpkern/rump_curlwp.h
diff -u /dev/null src/sys/rump/librump/rumpkern/rump_curlwp.h:1.1
--- /dev/null Sat Mar 15 15:15:27 2014
+++ src/sys/rump/librump/rumpkern/rump_curlwp.h Sat Mar 15 15:15:27 2014
@@ -0,0 +1,54 @@
+/* $NetBSD: rump_curlwp.h,v 1.1 2014/03/15 15:15:27 pooka Exp $ */
+
+/*-
+ * Copyright (c) 2014 Antti Kantee. All Rights Reserved.
+ *
+ * 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.
+ */
+
+#ifndef _SYS_RUMP_CURLWP_H_
+#define _SYS_RUMP_CURLWP_H_
+
+struct lwp * rump_lwproc_curlwp_hypercall(void);
+
+/* hattrick numbers to avoid someone accidentally using "1" as the value */
+#define RUMP_CURLWP_MODEL_HYPERCALL 10501
+#define RUMP_CURLWP_MODEL___THREAD 20502
+#define RUMP_CURLWP_MODEL_REGISTER 30503
+#define RUMP_CURLWP_MODEL_DEFAULT RUMP_CURLWP_MODEL_HYPERCALL
+
+#ifndef RUMP_CURLWP_MODEL
+#define RUMP_CURLWP_MODEL RUMP_CURLWP_MODEL_DEFAULT
+#endif
+
+/* provides rump_curlwp_fast() */
+#if RUMP_CURLWP_MODEL == RUMP_CURLWP_MODEL_HYPERCALL
+#include "rump_curlwp_hypercall.h"
+#elif RUMP_CURLWP_MODEL == RUMP_CURLWP_MODEL___THREAD
+#include "rump_curlwp___thread.h"
+#elif RUMP_CURLWP_MODEL == RUMP_CURLWP_MODEL_REGISTER
+#error "RUMP_CURLWP_MODEL_REGISTER not yet implemented"
+#else
+#error "unknown RUMP_CURLWP"
+#endif
+
+#endif /* _SYS_RUMP_CURLWP_H_ */
Index: src/sys/rump/librump/rumpkern/rump_curlwp___thread.h
diff -u /dev/null src/sys/rump/librump/rumpkern/rump_curlwp___thread.h:1.1
--- /dev/null Sat Mar 15 15:15:27 2014
+++ src/sys/rump/librump/rumpkern/rump_curlwp___thread.h Sat Mar 15 15:15:27 2014
@@ -0,0 +1,63 @@
+/* $NetBSD: rump_curlwp___thread.h,v 1.1 2014/03/15 15:15:27 pooka Exp $ */
+
+/*-
+ * Copyright (c) 2014 Antti Kantee. All Rights Reserved.
+ *
+ * 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.
+ */
+
+extern __thread struct lwp *curlwp_storage;
+#ifdef RUMP_CURLWP_PRIVATE
+#include <rump/rumpuser.h>
+
+__thread struct lwp *curlwp_storage;
+static void
+lwproc_curlwpop(enum rumplwpop op, struct lwp *l)
+{
+
+ switch (op) {
+ case RUMPUSER_LWP_CREATE:
+ case RUMPUSER_LWP_DESTROY:
+ break;
+ case RUMPUSER_LWP_SET:
+ KASSERT(curlwp_storage == NULL);
+ curlwp_storage = l;
+ break;
+ case RUMPUSER_LWP_CLEAR:
+ KASSERT(curlwp_storage == l);
+ curlwp_storage = NULL;
+ break;
+ }
+ /*
+ * Need to keep hypercall layer in sync, since it can use curlwp
+ * for things like mutexes. Should be fixed/adjusted somehow.
+ */
+ rumpuser_curlwpop(op, l);
+}
+#endif
+
+static inline struct lwp * __attribute__((const))
+rump_curlwp_fast(void)
+{
+
+ return curlwp_storage;
+}
Index: src/sys/rump/librump/rumpkern/rump_curlwp_hypercall.h
diff -u /dev/null src/sys/rump/librump/rumpkern/rump_curlwp_hypercall.h:1.1
--- /dev/null Sat Mar 15 15:15:27 2014
+++ src/sys/rump/librump/rumpkern/rump_curlwp_hypercall.h Sat Mar 15 15:15:27 2014
@@ -0,0 +1,43 @@
+/* $NetBSD: rump_curlwp_hypercall.h,v 1.1 2014/03/15 15:15:27 pooka Exp $ */
+
+/*-
+ * Copyright (c) 2014 Antti Kantee. All Rights Reserved.
+ *
+ * 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.
+ */
+
+#ifdef RUMP_CURLWP_PRIVATE
+#include <rump/rumpuser.h>
+static void
+lwproc_curlwpop(enum rumplwpop op, struct lwp *l)
+{
+
+ rumpuser_curlwpop(op, l);
+}
+#endif
+
+static inline struct lwp *
+rump_curlwp_fast(void)
+{
+
+ return rump_lwproc_curlwp_hypercall();
+}