Source-Changes-HG archive
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]
[src/trunk]: src Make librumpuser linkage once again free of librump.
details: https://anonhg.NetBSD.org/src/rev/732234efa84e
branches: trunk
changeset: 758307:732234efa84e
user: pooka <pooka%NetBSD.org@localhost>
date: Mon Nov 01 13:49:10 2010 +0000
description:
Make librumpuser linkage once again free of librump.
problem pointed out by <he>
diffstat:
lib/librumpuser/rumpuser_sp.c | 86 ++++++++++++++++++++++++++++++++++-----
sys/rump/include/rump/rumpuser.h | 22 +++++++--
sys/rump/librump/rumpkern/rump.c | 12 ++++-
3 files changed, 99 insertions(+), 21 deletions(-)
diffs (247 lines):
diff -r 35f8c61e0d0e -r 732234efa84e lib/librumpuser/rumpuser_sp.c
--- a/lib/librumpuser/rumpuser_sp.c Mon Nov 01 06:41:50 2010 +0000
+++ b/lib/librumpuser/rumpuser_sp.c Mon Nov 01 13:49:10 2010 +0000
@@ -1,4 +1,4 @@
-/* $NetBSD: rumpuser_sp.c,v 1.2 2010/10/28 14:37:29 pooka Exp $ */
+/* $NetBSD: rumpuser_sp.c,v 1.3 2010/11/01 13:49:10 pooka Exp $ */
/*
* Copyright (c) 2010 Antti Kantee. All Rights Reserved.
@@ -38,7 +38,7 @@
*/
#include <sys/cdefs.h>
-__RCSID("$NetBSD: rumpuser_sp.c,v 1.2 2010/10/28 14:37:29 pooka Exp $");
+__RCSID("$NetBSD: rumpuser_sp.c,v 1.3 2010/11/01 13:49:10 pooka Exp $");
#include <sys/types.h>
#include <sys/mman.h>
@@ -60,6 +60,7 @@
#include <unistd.h>
#include <rump/rump.h>
+#include <rump/rump_syscalls.h>
#include <rump/rumpuser.h>
//#define DEBUG
@@ -149,6 +150,66 @@
static struct spclient clispc;
+static struct rumpuser_sp_ops spops;
+
+/*
+ * Manual wrappers, since librump does not have access to the
+ * user namespace wrapped interfaces.
+ */
+
+static void
+lwproc_switch(struct lwp *l)
+{
+
+ rump_schedule();
+ spops.spop_lwproc_switch(l);
+ rump_unschedule();
+}
+
+static void
+lwproc_release(void)
+{
+
+ rump_schedule();
+ spops.spop_lwproc_release();
+ rump_unschedule();
+}
+
+static int
+lwproc_newproc(void)
+{
+ int rv;
+
+ rump_schedule();
+ rv = spops.spop_lwproc_newproc();
+ rump_unschedule();
+
+ return rv;
+}
+
+static struct lwp *
+lwproc_curlwp(void)
+{
+ struct lwp *l;
+
+ rump_schedule();
+ l = spops.spop_lwproc_curlwp();
+ rump_unschedule();
+
+ return l;
+}
+
+static int
+rumpsyscall(int sysnum, void *data, register_t *retval)
+{
+ int rv;
+
+ rump_schedule();
+ rv = spops.spop_syscall(sysnum, data, retval);
+ rump_unschedule();
+
+ return rv;
+}
static int
dosend(struct spclient *spc, const void *data, size_t dlen)
@@ -320,8 +381,8 @@
DPRINTF(("rump_sp: disconnecting [%u]\n", idx));
- rump_pub_lwproc_switch(spc->spc_lwp);
- rump_pub_lwproc_releaselwp();
+ lwproc_switch(spc->spc_lwp);
+ lwproc_release();
free(spc->spc_buf);
memset(spc, 0, sizeof(*spc));
@@ -373,7 +434,7 @@
return error;
}
- if ((error = rump_pub_lwproc_newproc()) != 0) {
+ if ((error = lwproc_newproc()) != 0) {
close(newfd);
return error;
}
@@ -389,14 +450,14 @@
pfdlist[i].fd = newfd;
spclist[i].spc_fd = newfd;
- spclist[i].spc_lwp = rump_pub_lwproc_curlwp();
+ spclist[i].spc_lwp = lwproc_curlwp();
if (maxidx < i)
maxidx = i;
DPRINTF(("rump_sp: added new connection at idx %u, pid %d\n",
- i, rump_sys_getpid()));
+ i, rump_sys_getpid())); /* XXX: getpid not spop */
- rump_pub_lwproc_switch(NULL);
+ lwproc_switch(NULL);
return 0;
}
@@ -412,9 +473,9 @@
sysnum, 0));
pthread_setspecific(spclient_tls, spc);
- rump_pub_lwproc_switch(spc->spc_lwp);
- rv = rump_pub_syscall(sysnum, data, retval);
- rump_pub_lwproc_switch(NULL);
+ lwproc_switch(spc->spc_lwp);
+ rv = rumpsyscall(sysnum, data, retval);
+ lwproc_switch(NULL);
pthread_setspecific(spclient_tls, NULL);
send_syscall_resp(spc, rhdr->rsp_reqno, rv, retval);
@@ -848,7 +909,7 @@
}
int
-rumpuser_sp_init(int *typep)
+rumpuser_sp_init(const struct rumpuser_sp_ops *spopsp, int *typep)
{
struct spservarg *sarg;
struct sockaddr *sap;
@@ -860,6 +921,7 @@
p = NULL;
error = 0;
+ spops = *spopsp;
type = RUMP_SP_NONE;
if ((p = getenv("RUMP_SP_SERVER")) != NULL) {
diff -r 35f8c61e0d0e -r 732234efa84e sys/rump/include/rump/rumpuser.h
--- a/sys/rump/include/rump/rumpuser.h Mon Nov 01 06:41:50 2010 +0000
+++ b/sys/rump/include/rump/rumpuser.h Mon Nov 01 13:49:10 2010 +0000
@@ -1,4 +1,4 @@
-/* $NetBSD: rumpuser.h,v 1.46 2010/10/27 20:44:50 pooka Exp $ */
+/* $NetBSD: rumpuser.h,v 1.47 2010/11/01 13:49:10 pooka Exp $ */
/*
* Copyright (c) 2007 Antti Kantee. All Rights Reserved.
@@ -36,7 +36,7 @@
#include <stdint.h>
#endif
-#define RUMPUSER_VERSION 1
+#define RUMPUSER_VERSION 2
int rumpuser_getversion(void);
struct msghdr;
@@ -203,13 +203,23 @@
void rumpuser_dl_component_init(int, rump_component_init_fn);
/* syscall proxy routines */
-#define RUMP_SP_NONE 0
-#define RUMP_SP_CLIENT 1
-#define RUMP_SP_SERVER 2
-int rumpuser_sp_init(int *);
+
+struct rumpuser_sp_ops {
+ void (*spop_lwproc_switch)(struct lwp *);
+ void (*spop_lwproc_release)(void);
+ int (*spop_lwproc_newproc)(void);
+ struct lwp * (*spop_lwproc_curlwp)(void);
+ int (*spop_syscall)(int, void *, register_t *);
+};
+
+int rumpuser_sp_init(const struct rumpuser_sp_ops *, int *);
int rumpuser_sp_copyin(const void *, void *, size_t);
int rumpuser_sp_copyout(const void *, void *, size_t);
int rumpuser_sp_syscall(int, const void *, size_t, register_t *);
int rumpuser_sp_anonmmap(size_t, void **);
+#define RUMP_SP_NONE 0
+#define RUMP_SP_CLIENT 1
+#define RUMP_SP_SERVER 2
+
#endif /* _RUMP_RUMPUSER_H_ */
diff -r 35f8c61e0d0e -r 732234efa84e sys/rump/librump/rumpkern/rump.c
--- a/sys/rump/librump/rumpkern/rump.c Mon Nov 01 06:41:50 2010 +0000
+++ b/sys/rump/librump/rumpkern/rump.c Mon Nov 01 13:49:10 2010 +0000
@@ -1,4 +1,4 @@
-/* $NetBSD: rump.c,v 1.193 2010/10/29 15:32:24 pooka Exp $ */
+/* $NetBSD: rump.c,v 1.194 2010/11/01 13:49:10 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.193 2010/10/29 15:32:24 pooka Exp $");
+__KERNEL_RCSID(0, "$NetBSD: rump.c,v 1.194 2010/11/01 13:49:10 pooka Exp $");
#include <sys/systm.h>
#define ELFSIZE ARCH_ELFSIZE
@@ -191,6 +191,7 @@
int
rump__init(int rump_version)
{
+ struct rumpuser_sp_ops spops;
char buf[256];
struct timespec ts;
uint64_t sec, nsec;
@@ -207,7 +208,12 @@
rump_inited = 1;
/* Check our role as a rump proxy */
- if ((error = rumpuser_sp_init(&rumpsp_type)) != 0)
+ spops.spop_lwproc_switch = rump_lwproc_switch;
+ spops.spop_lwproc_release = rump_lwproc_releaselwp;
+ spops.spop_lwproc_newproc = rump_lwproc_newproc;
+ spops.spop_lwproc_curlwp = rump_lwproc_curlwp;
+ spops.spop_syscall = rump_syscall;
+ if ((error = rumpuser_sp_init(&spops, &rumpsp_type)) != 0)
return error;
/* If we're a client, we can return directly. Otherwise, proceed. */
Home |
Main Index |
Thread Index |
Old Index