Module Name: src
Committed By: chs
Date: Sun Dec 2 01:05:17 UTC 2012
Modified Files:
src/external/cddl/osnet/dev/cyclic: cyclic.c
src/external/cddl/osnet/dev/cyclic/i386: cyclic_machdep.c
src/external/cddl/osnet/sys/sys: cyclic_impl.h
src/sys/kern: kern_clock.c
src/sys/modules: Makefile
src/sys/modules/dtrace: Makefile
src/sys/sys: dtrace_bsd.h
Added Files:
src/sys/modules/cyclic: Makefile
src/sys/modules/dtrace/profile: Makefile
Log Message:
adapt the cyclic module and profile dtrace provider to netbsd.
for now, just hook the cyclic callback into hardclock().
To generate a diff of this commit:
cvs rdiff -u -r1.3 -r1.4 src/external/cddl/osnet/dev/cyclic/cyclic.c
cvs rdiff -u -r1.3 -r1.4 \
src/external/cddl/osnet/dev/cyclic/i386/cyclic_machdep.c
cvs rdiff -u -r1.3 -r1.4 src/external/cddl/osnet/sys/sys/cyclic_impl.h
cvs rdiff -u -r1.130 -r1.131 src/sys/kern/kern_clock.c
cvs rdiff -u -r1.115 -r1.116 src/sys/modules/Makefile
cvs rdiff -u -r0 -r1.1 src/sys/modules/cyclic/Makefile
cvs rdiff -u -r1.3 -r1.4 src/sys/modules/dtrace/Makefile
cvs rdiff -u -r0 -r1.1 src/sys/modules/dtrace/profile/Makefile
cvs rdiff -u -r1.6 -r1.7 src/sys/sys/dtrace_bsd.h
Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.
Modified files:
Index: src/external/cddl/osnet/dev/cyclic/cyclic.c
diff -u src/external/cddl/osnet/dev/cyclic/cyclic.c:1.3 src/external/cddl/osnet/dev/cyclic/cyclic.c:1.4
--- src/external/cddl/osnet/dev/cyclic/cyclic.c:1.3 Sun Dec 2 00:05:38 2012
+++ src/external/cddl/osnet/dev/cyclic/cyclic.c Sun Dec 2 01:05:16 2012
@@ -1,4 +1,4 @@
-/* $NetBSD: cyclic.c,v 1.3 2012/12/02 00:05:38 chs Exp $ */
+/* $NetBSD: cyclic.c,v 1.4 2012/12/02 01:05:16 chs Exp $ */
/*
* CDDL HEADER START
@@ -326,8 +326,10 @@
#include <sys/param.h>
#include <sys/conf.h>
#include <sys/kernel.h>
+#ifdef __FreeBSD___
#include <sys/lock.h>
#include <sys/sx.h>
+#endif
#include <sys/cyclic_impl.h>
#include <sys/module.h>
#include <sys/systm.h>
@@ -335,7 +337,32 @@
#include <sys/kmem.h>
#include <sys/cmn_err.h>
#include <sys/dtrace_bsd.h>
+#ifdef __FreeBSD__
#include <machine/cpu.h>
+#endif
+
+#ifdef __NetBSD__
+#include <sys/cpu.h>
+#include <sys/malloc.h>
+#include <sys/xcall.h>
+
+#undef mutex_init
+#define mtx_init(m, d, p, f) mutex_init(m, MUTEX_DEFAULT, IPL_CLOCK)
+#define mtx_lock_spin(x) mutex_spin_enter(x)
+#define mtx_unlock_spin(x) mutex_spin_exit(x)
+#define mtx_destroy(x) mutex_destroy(x)
+
+#define ASSERT(x) KASSERT(x)
+#define SYSINIT(a1, a2, a3, a4, a5)
+#define SYSUNINIT(a1, a2, a3, a4, a5)
+#define CPU_FOREACH(var) \
+ CPU_INFO_ITERATOR cii; \
+ struct cpu_info *ci; \
+ for (CPU_INFO_FOREACH(cii, ci))
+#define MAXCPU MAXCPUS
+#define TRAPF_USERMODE(x) CLKF_USERMODE(x)
+#define TRAPF_PC(x) CLKF_PC(x)
+#endif
static kmem_cache_t *cyclic_id_cache;
static cyc_id_t *cyclic_id_head;
@@ -873,7 +900,7 @@ cyclic_configure(cpu_t *c)
ASSERT(MUTEX_HELD(&cpu_lock));
if (cyclic_id_cache == NULL)
- cyclic_id_cache = kmem_cache_create("cyclic_id_cache",
+ cyclic_id_cache = kmem_cache_create(__UNCONST("cyclic_id_cache"),
sizeof (cyc_id_t), 0, NULL, NULL, NULL, NULL, NULL, 0);
cpu->cyp_cpu = c;
@@ -1110,7 +1137,7 @@ cyclic_id_t
cyclic_add(cyc_handler_t *hdlr, cyc_time_t *when)
{
cyc_id_t *idp = cyclic_new_id();
- solaris_cpu_t *c = &solaris_cpu[curcpu];
+ solaris_cpu_t *c = &solaris_cpu[cpu_number()];
ASSERT(MUTEX_HELD(&cpu_lock));
ASSERT(when->cyt_when >= 0 && when->cyt_interval > 0);
@@ -1217,6 +1244,7 @@ cyclic_add_omni(cyc_omni_handler_t *omni
idp->cyi_omni_hdlr = *omni;
CPU_FOREACH(i) {
+ i = cpu_index(ci);
c = &solaris_cpu[i];
if ((cpu = c->cpu_cyclic) == NULL)
continue;
@@ -1305,7 +1333,7 @@ cyclic_init(cyc_backend_t *be)
*/
bcopy(be, &cyclic_backend, sizeof (cyc_backend_t));
- cyclic_configure(&solaris_cpu[curcpu]);
+ cyclic_configure(&solaris_cpu[cpu_number()]);
}
/*
@@ -1320,15 +1348,20 @@ cyclic_mp_init(void)
cpu_t *c;
int i;
+#ifndef __NetBSD__
mutex_enter(&cpu_lock);
+#endif
CPU_FOREACH(i) {
+ i = cpu_index(ci);
c = &solaris_cpu[i];
if (c->cpu_cyclic == NULL)
cyclic_configure(c);
}
+#ifndef __NetBSD__
mutex_exit(&cpu_lock);
+#endif
}
static void
@@ -1338,6 +1371,7 @@ cyclic_uninit(void)
int id;
CPU_FOREACH(id) {
+ id = cpu_index(ci);
c = &solaris_cpu[id];
if (c->cpu_cyclic == NULL)
continue;
@@ -1379,6 +1413,7 @@ cyclic_unload(void)
SYSUNINIT(cyclic_unregister, SI_SUB_CYCLIC, SI_ORDER_SECOND, cyclic_unload, NULL);
+#ifdef __FreeBSD__
/* ARGSUSED */
static int
cyclic_modevent(module_t mod __unused, int type, void *data __unused)
@@ -1406,3 +1441,24 @@ cyclic_modevent(module_t mod __unused, i
DEV_MODULE(cyclic, cyclic_modevent, NULL);
MODULE_VERSION(cyclic, 1);
MODULE_DEPEND(cyclic, opensolaris, 1, 1, 1);
+#endif
+
+#ifdef __NetBSD__
+static int
+cyclic_modcmd(modcmd_t cmd, void *data)
+{
+ switch (cmd) {
+ case MODULE_CMD_INIT:
+ cyclic_load(NULL);
+ return 0;
+
+ case MODULE_CMD_FINI:
+ cyclic_unload();
+ return 0;
+ default:
+ return ENOTTY;
+ }
+}
+
+MODULE(MODULE_CLASS_MISC, cyclic, "dtrace");
+#endif
Index: src/external/cddl/osnet/dev/cyclic/i386/cyclic_machdep.c
diff -u src/external/cddl/osnet/dev/cyclic/i386/cyclic_machdep.c:1.3 src/external/cddl/osnet/dev/cyclic/i386/cyclic_machdep.c:1.4
--- src/external/cddl/osnet/dev/cyclic/i386/cyclic_machdep.c:1.3 Sun Dec 2 00:05:38 2012
+++ src/external/cddl/osnet/dev/cyclic/i386/cyclic_machdep.c Sun Dec 2 01:05:16 2012
@@ -1,4 +1,4 @@
-/* $NetBSD: cyclic_machdep.c,v 1.3 2012/12/02 00:05:38 chs Exp $ */
+/* $NetBSD: cyclic_machdep.c,v 1.4 2012/12/02 01:05:16 chs Exp $ */
/*-
* Copyright 2006-2008 John Birrell <[email protected]>
@@ -60,6 +60,9 @@ cyclic_machdep_init(void)
{
/* Register the cyclic backend. */
cyclic_init(&be);
+#ifdef __NetBSD__
+ cyclic_ap_start(NULL);
+#endif
}
static void
@@ -82,11 +85,11 @@ static hrtime_t exp_due[MAXCPU];
* initialiser as the callback for high speed timer events.
*/
static void
-cyclic_clock(struct trapframe *frame)
+cyclic_clock(struct clockframe *frame)
{
- cpu_t *c = &solaris_cpu[curcpu];
+ cpu_t *c = &solaris_cpu[cpu_number()];
- if (c->cpu_cyclic != NULL && gethrtime() >= exp_due[curcpu]) {
+ if (c->cpu_cyclic != NULL && gethrtime() >= exp_due[cpu_number()]) {
if (TRAPF_USERMODE(frame)) {
c->cpu_profile_pc = 0;
c->cpu_profile_upc = TRAPF_PC(frame);
@@ -107,23 +110,39 @@ cyclic_clock(struct trapframe *frame)
static void enable(cyb_arg_t arg)
{
/* Register the cyclic clock callback function. */
- cyclic_clock_func[curcpu] = cyclic_clock;
+ cyclic_clock_func[cpu_number()] = cyclic_clock;
}
static void disable(cyb_arg_t arg)
{
/* Reset the cyclic clock callback function. */
- cyclic_clock_func[curcpu] = NULL;
+ cyclic_clock_func[cpu_number()] = NULL;
}
static void reprogram(cyb_arg_t arg, hrtime_t exp)
{
- exp_due[curcpu] = exp;
+ exp_due[cpu_number()] = exp;
}
+#ifdef __NetBSD__
+static void xcall_func(void *arg0, void *arg1)
+{
+ cyc_func_t func;
+
+ func = arg0;
+ (*func)(arg1);
+}
+#endif
+
static void xcall(cyb_arg_t arg, cpu_t *c, cyc_func_t func, void *param)
{
+#ifdef __NetBSD__
+ uint64_t xc;
+ xc = xc_unicast(XC_HIGHPRI, xcall_func, func, param, cpu_lookup(c->cpuid));
+ xc_wait(xc);
+#else
smp_rendezvous_cpus((cpumask_t) (1 << c->cpuid),
smp_no_rendevous_barrier, func, smp_no_rendevous_barrier, param);
+#endif
}
Index: src/external/cddl/osnet/sys/sys/cyclic_impl.h
diff -u src/external/cddl/osnet/sys/sys/cyclic_impl.h:1.3 src/external/cddl/osnet/sys/sys/cyclic_impl.h:1.4
--- src/external/cddl/osnet/sys/sys/cyclic_impl.h:1.3 Sun Dec 2 00:05:39 2012
+++ src/external/cddl/osnet/sys/sys/cyclic_impl.h Sun Dec 2 01:05:16 2012
@@ -1,4 +1,4 @@
-/* $NetBSD: cyclic_impl.h,v 1.3 2012/12/02 00:05:39 chs Exp $ */
+/* $NetBSD: cyclic_impl.h,v 1.4 2012/12/02 01:05:16 chs Exp $ */
/*
* CDDL HEADER START
@@ -269,7 +269,7 @@ typedef struct cyc_cpu {
cyc_index_t cyp_nelems;
cyc_index_t cyp_size;
cyc_backend_t *cyp_backend;
- struct mtx cyp_mtx;
+ kmutex_t cyp_mtx;
} cyc_cpu_t;
typedef struct cyc_omni_cpu {
Index: src/sys/kern/kern_clock.c
diff -u src/sys/kern/kern_clock.c:1.130 src/sys/kern/kern_clock.c:1.131
--- src/sys/kern/kern_clock.c:1.130 Sun Oct 30 01:57:40 2011
+++ src/sys/kern/kern_clock.c Sun Dec 2 01:05:16 2012
@@ -1,4 +1,4 @@
-/* $NetBSD: kern_clock.c,v 1.130 2011/10/30 01:57:40 christos Exp $ */
+/* $NetBSD: kern_clock.c,v 1.131 2012/12/02 01:05:16 chs Exp $ */
/*-
* Copyright (c) 2000, 2004, 2006, 2007, 2008 The NetBSD Foundation, Inc.
@@ -69,8 +69,9 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: kern_clock.c,v 1.130 2011/10/30 01:57:40 christos Exp $");
+__KERNEL_RCSID(0, "$NetBSD: kern_clock.c,v 1.131 2012/12/02 01:05:16 chs Exp $");
+#include "opt_dtrace.h"
#include "opt_ntp.h"
#include "opt_perfctrs.h"
@@ -93,6 +94,13 @@ __KERNEL_RCSID(0, "$NetBSD: kern_clock.c
#include <sys/gmon.h>
#endif
+#ifdef KDTRACE_HOOKS
+#include <sys/dtrace_bsd.h>
+#include <sys/cpu.h>
+
+cyclic_clock_func_t cyclic_clock_func[MAXCPUS];
+#endif
+
/*
* Clock handling routines.
*
@@ -225,6 +233,13 @@ hardclock(struct clockframe *frame)
* Update real-time timeout queue.
*/
callout_hardclock();
+
+#ifdef KDTRACE_HOOKS
+ cyclic_clock_func_t func = cyclic_clock_func[cpu_index(ci)];
+ if (func) {
+ (*func)((struct clockframe *)frame);
+ }
+#endif
}
/*
Index: src/sys/modules/Makefile
diff -u src/sys/modules/Makefile:1.115 src/sys/modules/Makefile:1.116
--- src/sys/modules/Makefile:1.115 Tue Nov 6 07:59:09 2012
+++ src/sys/modules/Makefile Sun Dec 2 01:05:16 2012
@@ -1,4 +1,4 @@
-# $NetBSD: Makefile,v 1.115 2012/11/06 07:59:09 alnsn Exp $
+# $NetBSD: Makefile,v 1.116 2012/12/02 01:05:16 chs Exp $
.include <bsd.own.mk>
@@ -241,6 +241,7 @@ SUBDIR+= dm
.endif
.if (${MKDTRACE} != "no")
+SUBDIR+= cyclic
SUBDIR+= dtrace
.endif
Index: src/sys/modules/dtrace/Makefile
diff -u src/sys/modules/dtrace/Makefile:1.3 src/sys/modules/dtrace/Makefile:1.4
--- src/sys/modules/dtrace/Makefile:1.3 Fri Mar 12 21:53:16 2010
+++ src/sys/modules/dtrace/Makefile Sun Dec 2 01:05:17 2012
@@ -1,8 +1,8 @@
-# $NetBSD: Makefile,v 1.3 2010/03/12 21:53:16 darran Exp $
+# $NetBSD: Makefile,v 1.4 2012/12/02 01:05:17 chs Exp $
# $FreeBSD: src/sys/modules/dtrace/Makefile,v 1.6.2.1 2009/08/03 08:13:06 kensmith Exp $
.include <bsd.own.mk>
-SUBDIR= dtrace sdt fbt
+SUBDIR= dtrace sdt fbt profile
.include <bsd.subdir.mk>
Index: src/sys/sys/dtrace_bsd.h
diff -u src/sys/sys/dtrace_bsd.h:1.6 src/sys/sys/dtrace_bsd.h:1.7
--- src/sys/sys/dtrace_bsd.h:1.6 Sun Dec 2 00:05:38 2012
+++ src/sys/sys/dtrace_bsd.h Sun Dec 2 01:05:16 2012
@@ -1,4 +1,4 @@
-/* $NetBSD: dtrace_bsd.h,v 1.6 2012/12/02 00:05:38 chs Exp $ */
+/* $NetBSD: dtrace_bsd.h,v 1.7 2012/12/02 01:05:16 chs Exp $ */
/*-
* Copyright (c) 2007-2008 John Birrell ([email protected])
@@ -55,15 +55,8 @@ struct ucred;
* Cyclic clock function type definition used to hook the cyclic
* subsystem into the appropriate timer interrupt.
*/
-typedef void (*cyclic_clock_func_t)(struct trapframe *);
-
-/*
- * These external variables are actually machine-dependent, so
- * they might not actually exist.
- *
- * Defining them here avoids a proliferation of header files.
- */
-extern cyclic_clock_func_t cyclic_clock_func[];
+typedef void (*cyclic_clock_func_t)(struct clockframe *);
+extern cyclic_clock_func_t cyclic_clock_func[];
/*
* The dtrace module handles traps that occur during a DTrace probe.
Added files:
Index: src/sys/modules/cyclic/Makefile
diff -u /dev/null src/sys/modules/cyclic/Makefile:1.1
--- /dev/null Sun Dec 2 01:05:17 2012
+++ src/sys/modules/cyclic/Makefile Sun Dec 2 01:05:16 2012
@@ -0,0 +1,16 @@
+# $FreeBSD: src/sys/modules/dtrace/sdt/Makefile,v 1.1.4.1 2009/08/03 08:13:06 kensmith Exp $
+
+.include "../../Makefile.inc"
+
+.PATH: ${NETBSDSRCDIR}/external/cddl/osnet/dev/cyclic
+
+KMOD= cyclic
+SRCS= cyclic.c
+
+CPPFLAGS+= -I${NETBSDSRCDIR}/external/cddl/osnet/sys \
+ -I${NETBSDSRCDIR}/external/cddl/osnet/dev/cyclic/${MACHINE:S/amd64/i386/} \
+ -I${NETBSDSRCDIR}/external/cddl/osnet/dist/uts/common
+
+CPPFLAGS+= -Wno-unknown-pragmas -Wno-cast-qual
+
+.include <bsd.kmodule.mk>
Index: src/sys/modules/dtrace/profile/Makefile
diff -u /dev/null src/sys/modules/dtrace/profile/Makefile:1.1
--- /dev/null Sun Dec 2 01:05:17 2012
+++ src/sys/modules/dtrace/profile/Makefile Sun Dec 2 01:05:17 2012
@@ -0,0 +1,16 @@
+# $NetBSD: Makefile,v 1.1 2012/12/02 01:05:17 chs Exp $
+
+.include "../../Makefile.inc"
+
+.PATH: ${NETBSDSRCDIR}/external/cddl/osnet/dev/profile
+
+KMOD= profile
+SRCS= profile.c
+
+CPPFLAGS+= -I${NETBSDSRCDIR}/external/cddl/osnet/sys \
+ -I${NETBSDSRCDIR}/external/cddl/osnet/dev/profile \
+ -I${NETBSDSRCDIR}/external/cddl/osnet/dist/uts/common
+
+CPPFLAGS+= -Wno-unknown-pragmas -Wno-cast-qual
+
+.include <bsd.kmodule.mk>