Module Name: src
Committed By: pgoyette
Date: Sun Mar 22 13:30:11 UTC 2020
Modified Files:
src/lib/librumpuser: rumpuser_dl.c
src/sys/rump/include/rump: rumpuser.h
src/sys/rump/librump/rumpkern: rump.c
Log Message:
Teach rump to process __link_set_evcnts entries. (Second part of
fix for PR kern/55088)
To generate a diff of this commit:
cvs rdiff -u -r1.32 -r1.33 src/lib/librumpuser/rumpuser_dl.c
cvs rdiff -u -r1.115 -r1.116 src/sys/rump/include/rump/rumpuser.h
cvs rdiff -u -r1.342 -r1.343 src/sys/rump/librump/rumpkern/rump.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_dl.c
diff -u src/lib/librumpuser/rumpuser_dl.c:1.32 src/lib/librumpuser/rumpuser_dl.c:1.33
--- src/lib/librumpuser/rumpuser_dl.c:1.32 Sat Mar 21 04:48:37 2020
+++ src/lib/librumpuser/rumpuser_dl.c Sun Mar 22 13:30:10 2020
@@ -1,4 +1,4 @@
-/* $NetBSD: rumpuser_dl.c,v 1.32 2020/03/21 04:48:37 pgoyette Exp $ */
+/* $NetBSD: rumpuser_dl.c,v 1.33 2020/03/22 13:30:10 pgoyette Exp $ */
/*
* Copyright (c) 2009 Antti Kantee. All Rights Reserved.
@@ -40,15 +40,12 @@
#include "rumpuser_port.h"
#if !defined(lint)
-__RCSID("$NetBSD: rumpuser_dl.c,v 1.32 2020/03/21 04:48:37 pgoyette Exp $");
+__RCSID("$NetBSD: rumpuser_dl.c,v 1.33 2020/03/22 13:30:10 pgoyette Exp $");
#endif /* !lint */
#include <sys/types.h>
#include <sys/time.h>
-
-#ifdef NOTYET
#include <sys/evcnt.h>
-#endif
#include <assert.h>
@@ -353,7 +350,8 @@ getsymbols(struct link_map *map, int ism
static void
process_object(void *handle,
- rump_modinit_fn domodinit, rump_compload_fn docompload)
+ rump_modinit_fn domodinit, rump_compload_fn docompload,
+ rump_evcntattach_fn doevcntattach)
{
const struct modinfo *const *mi_start, *const *mi_end;
struct rump_component *const *rc, *const *rc_end;
@@ -362,9 +360,7 @@ process_object(void *handle,
typedef void sysctl_setup_func(struct sysctllog **);
sysctl_setup_func *const *sfp, *const *sfp_end;
-#ifdef NOTYET /* We don't yet handle link_set_evcnts */
struct evcnt *const *evp, *const *evp_end;
-#endif
mi_start = dlsym(handle, "__start_link_set_modules");
mi_end = dlsym(handle, "__stop_link_set_modules");
@@ -388,16 +384,14 @@ process_object(void *handle,
assert(sfp == sfp_end);
}
-#ifdef NOTYET
/* handle link_set_evcnts */
evp = dlsym(handle, "__start_link_set_evcnts");
evp_end = dlsym(handle, "__stop_link_set_evcnts");
if (evp && evp_end) {
for (; evp < evp_end; evp++)
- evcnt_attach_static(*evp);
+ doevcntattach(*evp);
assert(evp == evp_end);
}
-#endif
}
/*
@@ -406,7 +400,8 @@ process_object(void *handle,
*/
void
rumpuser_dl_bootstrap(rump_modinit_fn domodinit,
- rump_symload_fn symload, rump_compload_fn compload)
+ rump_symload_fn symload, rump_compload_fn compload,
+ rump_evcntattach_fn doevcntattach)
{
struct link_map *map, *origmap, *mainmap;
void *mainhandle;
@@ -501,7 +496,7 @@ rumpuser_dl_bootstrap(rump_modinit_fn do
if (handle == NULL)
continue;
}
- process_object(handle, domodinit, compload);
+ process_object(handle, domodinit, compload, doevcntattach);
if (map != mainmap)
dlclose(handle);
}
@@ -512,7 +507,8 @@ rumpuser_dl_bootstrap(rump_modinit_fn do
*/
void
rumpuser_dl_bootstrap(rump_modinit_fn domodinit,
- rump_symload_fn symload, rump_compload_fn compload)
+ rump_symload_fn symload, rump_compload_fn compload,
+ rump_evcntattach_fn doevcntattach)
{
return;
Index: src/sys/rump/include/rump/rumpuser.h
diff -u src/sys/rump/include/rump/rumpuser.h:1.115 src/sys/rump/include/rump/rumpuser.h:1.116
--- src/sys/rump/include/rump/rumpuser.h:1.115 Wed Dec 27 09:01:53 2017
+++ src/sys/rump/include/rump/rumpuser.h Sun Mar 22 13:30:10 2020
@@ -1,4 +1,4 @@
-/* $NetBSD: rumpuser.h,v 1.115 2017/12/27 09:01:53 ozaki-r Exp $ */
+/* $NetBSD: rumpuser.h,v 1.116 2020/03/22 13:30:10 pgoyette Exp $ */
/*
* Copyright (c) 2007-2013 Antti Kantee. All Rights Reserved.
@@ -224,10 +224,13 @@ void rumpuser_cv_has_waiters(struct rump
struct modinfo;
struct rump_component;
+struct evcnt;
typedef void (*rump_modinit_fn)(const struct modinfo *const *, size_t);
typedef int (*rump_symload_fn)(void *, uint64_t, char *, uint64_t);
typedef void (*rump_compload_fn)(const struct rump_component *);
-void rumpuser_dl_bootstrap(rump_modinit_fn, rump_symload_fn, rump_compload_fn);
+typedef void (*rump_evcntattach_fn)(struct evcnt *);
+void rumpuser_dl_bootstrap(rump_modinit_fn, rump_symload_fn, rump_compload_fn,
+ rump_evcntattach_fn);
/*
* misc management
Index: src/sys/rump/librump/rumpkern/rump.c
diff -u src/sys/rump/librump/rumpkern/rump.c:1.342 src/sys/rump/librump/rumpkern/rump.c:1.343
--- src/sys/rump/librump/rumpkern/rump.c:1.342 Sat Feb 22 21:45:34 2020
+++ src/sys/rump/librump/rumpkern/rump.c Sun Mar 22 13:30:10 2020
@@ -1,4 +1,4 @@
-/* $NetBSD: rump.c,v 1.342 2020/02/22 21:45:34 ad Exp $ */
+/* $NetBSD: rump.c,v 1.343 2020/03/22 13:30:10 pgoyette 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.342 2020/02/22 21:45:34 ad Exp $");
+__KERNEL_RCSID(0, "$NetBSD: rump.c,v 1.343 2020/03/22 13:30:10 pgoyette Exp $");
#include <sys/systm.h>
#define ELFSIZE ARCH_ELFSIZE
@@ -129,6 +129,7 @@ rump_proc_vfs_init_fn rump_proc_vfs_init
rump_proc_vfs_release_fn rump_proc_vfs_release = (void *)nullop;
static void add_linkedin_modules(const struct modinfo *const *, size_t);
+static void add_static_evcnt(struct evcnt *);
static pid_t rspo_wrap_getpid(void) {
return rump_sysproxy_hyp_getpid();
@@ -423,7 +424,7 @@ rump_init(void)
/* process dso's */
rumpuser_dl_bootstrap(add_linkedin_modules,
- rump_kernelfsym_load, rump_component_load);
+ rump_kernelfsym_load, rump_component_load, add_static_evcnt);
rump_component_addlocal();
rump_component_init(RUMP_COMPONENT_KERN);
@@ -645,6 +646,18 @@ add_linkedin_modules(const struct modinf
module_builtin_add(mip, nmodinfo, false);
}
+/*
+ * Add an evcnt. Just in case it might already have been added, remove
+ * it first.
+ */
+static void
+add_static_evcnt(struct evcnt *ev)
+{
+
+ evcnt_detach(ev);
+ evcnt_attach_static(ev);
+}
+
int
rump_kernelfsym_load(void *symtab, uint64_t symsize,
char *strtab, uint64_t strsize)