Module Name: src
Committed By: pooka
Date: Wed Apr 23 16:17:55 UTC 2014
Modified Files:
src/sys/rump/librump/rumpkern: rump.c rump_private.h
Log Message:
Include LIST_ENTRY() in "struct rump_component".
Main benefit: rump_component_load() can now be called from an
early-running constructor since the routine doesn't need to allocate
memory.
To generate a diff of this commit:
cvs rdiff -u -r1.294 -r1.295 src/sys/rump/librump/rumpkern/rump.c
cvs rdiff -u -r1.81 -r1.82 src/sys/rump/librump/rumpkern/rump_private.h
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/rump.c
diff -u src/sys/rump/librump/rumpkern/rump.c:1.294 src/sys/rump/librump/rumpkern/rump.c:1.295
--- src/sys/rump/librump/rumpkern/rump.c:1.294 Wed Apr 9 23:53:36 2014
+++ src/sys/rump/librump/rumpkern/rump.c Wed Apr 23 16:17:55 2014
@@ -1,4 +1,4 @@
-/* $NetBSD: rump.c,v 1.294 2014/04/09 23:53:36 pooka Exp $ */
+/* $NetBSD: rump.c,v 1.295 2014/04/23 16:17:55 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.294 2014/04/09 23:53:36 pooka Exp $");
+__KERNEL_RCSID(0, "$NetBSD: rump.c,v 1.295 2014/04/23 16:17:55 pooka Exp $");
#include <sys/systm.h>
#define ELFSIZE ARCH_ELFSIZE
@@ -691,13 +691,8 @@ static int compinited[RUMP_COMPONENT_MAX
/*
* Yea, this is O(n^2), but we're only looking at a handful of components.
* Components are always initialized from the thread that called rump_init().
- * Could also free these when done with them, but prolly not worth it.
*/
-struct compstore {
- const struct rump_component *cs_rc;
- LIST_ENTRY(compstore) cs_entries;
-};
-static LIST_HEAD(, compstore) cshead = LIST_HEAD_INITIALIZER(cshead);
+static LIST_HEAD(, rump_component) rchead = LIST_HEAD_INITIALIZER(rchead);
/*
* add components which are visible from the current object.
@@ -714,20 +709,27 @@ rump_component_addlocal(void)
}
static void
-rump_component_load(const struct rump_component *rc)
+rump_component_load(const struct rump_component *rc_const)
{
- struct compstore *cs;
+ struct rump_component *rc, *rc_iter;
+
+ /*
+ * XXX: this is ok since the "const" was removed from the
+ * definition of RUMP_COMPONENT().
+ *
+ * However, to preserve the hypercall interface, the const
+ * remains here. This can be fixed in the next hypercall revision.
+ */
+ rc = __UNCONST(rc_const);
KASSERT(curlwp == bootlwp);
- LIST_FOREACH(cs, &cshead, cs_entries) {
- if (rc == cs->cs_rc)
+ LIST_FOREACH(rc_iter, &rchead, rc_entries) {
+ if (rc_iter == rc)
return;
}
- cs = kmem_alloc(sizeof(*cs), KM_SLEEP);
- cs->cs_rc = rc;
- LIST_INSERT_HEAD(&cshead, cs, cs_entries);
+ LIST_INSERT_HEAD(&rchead, rc, rc_entries);
KASSERT(rc->rc_type < RUMP_COMPONENT_MAX);
compcounter[rc->rc_type]++;
}
@@ -744,13 +746,11 @@ rump_component_count(enum rump_component
void
rump_component_init(enum rump_component_type type)
{
- struct compstore *cs;
const struct rump_component *rc;
KASSERT(curlwp == bootlwp);
KASSERT(!compinited[type]);
- LIST_FOREACH(cs, &cshead, cs_entries) {
- rc = cs->cs_rc;
+ LIST_FOREACH(rc, &rchead, rc_entries) {
if (rc->rc_type == type)
rc->rc_init();
}
Index: src/sys/rump/librump/rumpkern/rump_private.h
diff -u src/sys/rump/librump/rumpkern/rump_private.h:1.81 src/sys/rump/librump/rumpkern/rump_private.h:1.82
--- src/sys/rump/librump/rumpkern/rump_private.h:1.81 Wed Apr 9 23:53:36 2014
+++ src/sys/rump/librump/rumpkern/rump_private.h Wed Apr 23 16:17:55 2014
@@ -1,4 +1,4 @@
-/* $NetBSD: rump_private.h,v 1.81 2014/04/09 23:53:36 pooka Exp $ */
+/* $NetBSD: rump_private.h,v 1.82 2014/04/23 16:17:55 pooka Exp $ */
/*
* Copyright (c) 2007-2011 Antti Kantee. All Rights Reserved.
@@ -73,10 +73,11 @@ enum rump_component_type {
struct rump_component {
enum rump_component_type rc_type;
void (*rc_init)(void);
+ LIST_ENTRY(rump_component) rc_entries;
};
#define RUMP_COMPONENT(type) \
static void rumpcompinit##type(void); \
-static const struct rump_component rumpcomp##type = { \
+static struct rump_component rumpcomp##type = { \
.rc_type = type, \
.rc_init = rumpcompinit##type, \
}; \