PERFORCE change 133544 for review
John Birrell
jb at FreeBSD.org
Fri Jan 18 02:39:58 PST 2008
http://perforce.freebsd.org/chv.cgi?CH=133544
Change 133544 by jb at jb_freebsd1 on 2008/01/18 10:39:39
Implement SDT argument definitions.
Affected files ...
.. //depot/projects/dtrace/src/sys/cddl/dev/sdt/sdt.c#9 edit
.. //depot/projects/dtrace/src/sys/kern/kern_proc.c#18 edit
.. //depot/projects/dtrace/src/sys/kern/kern_sdt.c#6 edit
.. //depot/projects/dtrace/src/sys/sys/sdt.h#11 edit
Differences ...
==== //depot/projects/dtrace/src/sys/cddl/dev/sdt/sdt.c#9 (text+ko) ====
@@ -46,6 +46,7 @@
static d_open_t sdt_open;
static int sdt_unload(void);
+static void sdt_getargdesc(void *, dtrace_id_t, void *, dtrace_argdesc_t *);
static void sdt_provide_probes(void *, dtrace_probedesc_t *);
static void sdt_destroy(void *, dtrace_id_t, void *);
static void sdt_enable(void *, dtrace_id_t, void *);
@@ -73,15 +74,43 @@
sdt_disable,
NULL,
NULL,
+ sdt_getargdesc,
NULL,
NULL,
- NULL,
sdt_destroy
};
static struct cdev *sdt_cdev;
static int
+sdt_argtype_callback(struct sdt_argtype *argtype, void *arg)
+{
+ dtrace_argdesc_t *desc = arg;
+
+ if (desc->dtargd_ndx == argtype->ndx) {
+ desc->dtargd_mapping = desc->dtargd_ndx; /* XXX */
+ strlcpy(desc->dtargd_native, argtype->type,
+ sizeof(desc->dtargd_native));
+ desc->dtargd_xlate[0] = '\0'; /* XXX */
+ }
+
+ return (0);
+}
+
+static void
+sdt_getargdesc(void *arg, dtrace_id_t id, void *parg, dtrace_argdesc_t *desc)
+{
+ struct sdt_probe *probe = parg;
+
+ if (desc->dtargd_ndx < probe->n_args)
+ (void) (sdt_argtype_listall(probe, sdt_argtype_callback, desc));
+ else
+ desc->dtargd_ndx = DTRACE_ARGNONE;
+
+ return;
+}
+
+static int
sdt_probe_callback(struct sdt_probe *probe, void *arg __unused)
{
struct sdt_provider *prov = probe->prov;
==== //depot/projects/dtrace/src/sys/kern/kern_proc.c#18 (text+ko) ====
@@ -147,8 +147,16 @@
p = (struct proc *)mem;
SDT_PROBE(proc, kernel, ctor , entry, p, size, arg, flags, 0);
+ SDT_PROBE_ARGTYPE(proc, kernel, ctor , entry, 0, "struct proc *");
+ SDT_PROBE_ARGTYPE(proc, kernel, ctor , entry, 1, "int");
+ SDT_PROBE_ARGTYPE(proc, kernel, ctor , entry, 2, "void *");
+ SDT_PROBE_ARGTYPE(proc, kernel, ctor , entry, 3, "int");
EVENTHANDLER_INVOKE(process_ctor, p);
SDT_PROBE(proc, kernel, ctor , return, p, size, arg, flags, 0);
+ SDT_PROBE_ARGTYPE(proc, kernel, ctor , return, 0, "struct proc *");
+ SDT_PROBE_ARGTYPE(proc, kernel, ctor , return, 1, "int");
+ SDT_PROBE_ARGTYPE(proc, kernel, ctor , return, 2, "void *");
+ SDT_PROBE_ARGTYPE(proc, kernel, ctor , return, 3, "int");
return (0);
}
@@ -165,6 +173,10 @@
p = (struct proc *)mem;
td = FIRST_THREAD_IN_PROC(p);
SDT_PROBE(proc, kernel, dtor , entry, p, size, arg, td, 0);
+ SDT_PROBE_ARGTYPE(proc, kernel, dtor , entry, 0, "struct proc *");
+ SDT_PROBE_ARGTYPE(proc, kernel, dtor , entry, 1, "int");
+ SDT_PROBE_ARGTYPE(proc, kernel, dtor , entry, 2, "void *");
+ SDT_PROBE_ARGTYPE(proc, kernel, dtor , entry, 3, "struct thread *");
if (td != NULL) {
#ifdef INVARIANTS
KASSERT((p->p_numthreads == 1),
@@ -183,6 +195,9 @@
if (p->p_ksi != NULL)
KASSERT(! KSI_ONQ(p->p_ksi), ("SIGCHLD queue"));
SDT_PROBE(proc, kernel, dtor , return, p, size, arg, 0, 0);
+ SDT_PROBE_ARGTYPE(proc, kernel, dtor , return, 0, "struct proc *");
+ SDT_PROBE_ARGTYPE(proc, kernel, dtor , return, 1, "int");
+ SDT_PROBE_ARGTYPE(proc, kernel, dtor , return, 2, "void *");
}
/*
@@ -195,6 +210,9 @@
p = (struct proc *)mem;
SDT_PROBE(proc, kernel, init , entry, p, size, flags, 0, 0);
+ SDT_PROBE_ARGTYPE(proc, kernel, init , entry, 0, "struct proc *");
+ SDT_PROBE_ARGTYPE(proc, kernel, init , entry, 1, "int");
+ SDT_PROBE_ARGTYPE(proc, kernel, init , entry, 2, "int");
p->p_sched = (struct p_sched *)&p[1];
bzero(&p->p_mtx, sizeof(struct mtx));
mtx_init(&p->p_mtx, "process lock", NULL, MTX_DEF | MTX_DUPOK);
@@ -203,6 +221,9 @@
EVENTHANDLER_INVOKE(process_init, p);
p->p_stats = pstats_alloc();
SDT_PROBE(proc, kernel, init , return, p, size, flags, 0, 0);
+ SDT_PROBE_ARGTYPE(proc, kernel, init , return, 0, "struct proc *");
+ SDT_PROBE_ARGTYPE(proc, kernel, init , return, 1, "int");
+ SDT_PROBE_ARGTYPE(proc, kernel, init , return, 2, "int");
return (0);
}
==== //depot/projects/dtrace/src/sys/kern/kern_sdt.c#6 (text+ko) ====
@@ -123,6 +123,9 @@
sx_xlock(&sdt_sx);
TAILQ_INSERT_TAIL(&probe->prov->probe_list, probe, probe_entry);
+
+ TAILQ_INIT(&probe->argtype_list);
+
probe->state = SDT_INIT;
sx_xunlock(&sdt_sx);
@@ -146,6 +149,38 @@
sx_xunlock(&sdt_sx);
}
+/*
+ * Called from SYSINIT to register a statically defined trace probe argument.
+ */
+void
+sdt_argtype_register(void *arg)
+{
+ struct sdt_argtype *argtype = arg;
+
+ sx_xlock(&sdt_sx);
+
+ TAILQ_INSERT_TAIL(&argtype->probe->argtype_list, argtype, argtype_entry);
+
+ argtype->probe->n_args++;
+
+ sx_xunlock(&sdt_sx);
+}
+
+/*
+ * Called from SYSUNINIT to de-register a statically defined trace probe argument.
+ */
+void
+sdt_argtype_deregister(void *arg)
+{
+ struct sdt_argtype *argtype = arg;
+
+ sx_xlock(&sdt_sx);
+
+ TAILQ_REMOVE(&argtype->probe->argtype_list, argtype, argtype_entry);
+
+ sx_xunlock(&sdt_sx);
+}
+
static void
sdt_init(void *arg)
{
@@ -210,3 +245,29 @@
return (error);
}
+
+/*
+ * List statically defined tracing probe arguments.
+ */
+int
+sdt_argtype_listall(struct sdt_probe *probe,
+ sdt_argtype_listall_func_t callback_func,void *arg)
+{
+ int error = 0;
+ int locked;
+ struct sdt_argtype *argtype;
+
+ locked = sx_xlocked(&sdt_sx);
+ if (!locked)
+ sx_xlock(&sdt_sx);
+
+ TAILQ_FOREACH(argtype, &probe->argtype_list, argtype_entry) {
+ if ((error = callback_func(argtype, arg)) != 0)
+ break;
+ }
+
+ if (!locked)
+ sx_xunlock(&sdt_sx);
+
+ return (error);
+}
==== //depot/projects/dtrace/src/sys/sys/sdt.h#11 (text+ko) ====
@@ -39,7 +39,8 @@
#define DTRACE_PROBE4(name, type1, arg1, type2, arg2, type3, arg3, type4, arg4)
#ifndef _KERNEL
-#error "no user-servicable parts inside (yet)"
+
+/* The promise of things to come. Worlds to explore. People to meet. Things to do. */
#else
@@ -48,6 +49,7 @@
#define SDT_PROVIDER_DEFINE(prov)
#define SDT_PROVIDER_DECLARE(prov)
#define SDT_PROBE(prov, mod, func, name, arg0, arg1, arg2, arg3, arg4)
+#define SDT_PROBE_ARGTYPE(prov, mod, func, name, num, type)
#else
@@ -70,8 +72,18 @@
SDT_INIT,
} sdt_state_t;
+struct sdt_probe;
struct sdt_provider;
+struct sdt_argtype {
+ int ndx; /* Argument index. */
+ const char *type; /* Argument type string. */
+ TAILQ_ENTRY(sdt_argtype)
+ argtype_entry; /* Argument type list entry. */
+ struct sdt_probe
+ *probe; /* Ptr to the probe structure. */
+};
+
struct sdt_probe {
int version; /* Set to sizeof(struct sdt_ref). */
sdt_state_t state;
@@ -79,10 +91,12 @@
*prov; /* Ptr to the provider structure. */
TAILQ_ENTRY(sdt_probe)
probe_entry; /* SDT probe list entry. */
+ TAILQ_HEAD(argtype_list_head, sdt_argtype) argtype_list;
const char *mod;
const char *func;
const char *name;
id_t id; /* DTrace probe ID. */
+ int n_args; /* Number of arguments. */
};
struct sdt_provider {
@@ -110,30 +124,46 @@
#define SDT_PROBE(prov, mod, func, name, arg0, arg1, arg2, arg3, arg4) \
static struct sdt_probe sdt_##prov##_##mod##_##func##_##name[1] = { \
{ sizeof(struct sdt_probe), 0, sdt_provider_##prov, \
- { NULL, NULL }, #mod, #func, #name, 0 } \
+ { NULL, NULL }, { NULL, NULL }, #mod, #func, #name, 0, 0 } \
}; \
SYSINIT(sdt_##prov##_##mod##_##func##_##name##_init, SI_SUB_KDTRACE, \
- SI_ORDER_ANY, sdt_probe_register, \
+ SI_ORDER_SECOND + 1, sdt_probe_register, \
sdt_##prov##_##mod##_##func##_##name ); \
SYSUNINIT(sdt_##prov##_##mod##_##func##_##name##_uninit, \
- SI_SUB_KDTRACE, SI_ORDER_ANY, sdt_probe_deregister, \
+ SI_SUB_KDTRACE, SI_ORDER_SECOND + 1, sdt_probe_deregister, \
sdt_##prov##_##mod##_##func##_##name ); \
if (sdt_##prov##_##mod##_##func##_##name->id) \
(*sdt_probe_func)(sdt_##prov##_##mod##_##func##_##name->id, \
(uintptr_t) arg0, (uintptr_t) arg1, (uintptr_t) arg2, \
(uintptr_t) arg3, (uintptr_t) arg4)
+#define SDT_PROBE_ARGTYPE(prov, mod, func, name, num, type) \
+ static struct sdt_argtype sdt_##prov##_##mod##_##func##_##name##num[1] \
+ = { { num, type, { NULL, NULL }, \
+ sdt_##prov##_##mod##_##func##_##name } \
+ }; \
+ SYSINIT(sdt_##prov##_##mod##_##func##_##name##num##_init, \
+ SI_SUB_KDTRACE, SI_ORDER_SECOND + 2, sdt_argtype_register, \
+ sdt_##prov##_##mod##_##func##_##name##num ); \
+ SYSUNINIT(sdt_##prov##_##mod##_##func##_##name##num##_uninit, \
+ SI_SUB_KDTRACE, SI_ORDER_SECOND + 2, sdt_argtype_deregister, \
+ sdt_##prov##_##mod##_##func##_##name##num )
+
+typedef int (*sdt_argtype_listall_func_t)(struct sdt_argtype *, void *);
+typedef int (*sdt_probe_listall_func_t)(struct sdt_probe *, void *);
typedef int (*sdt_provider_listall_func_t)(struct sdt_provider *, void *);
-typedef int (*sdt_probe_listall_func_t)(struct sdt_probe *, void *);
+void sdt_argtype_deregister(void *);
+void sdt_argtype_register(void *);
+void sdt_probe_deregister(void *);
+void sdt_probe_register(void *);
void sdt_provider_deregister(void *);
void sdt_provider_register(void *);
-void sdt_probe_deregister(void *);
-void sdt_probe_register(void *);
void sdt_probe_stub(u_int32_t, uintptr_t arg0, uintptr_t arg1, uintptr_t arg2,
uintptr_t arg3, uintptr_t arg4);
+int sdt_argtype_listall(struct sdt_probe *, sdt_argtype_listall_func_t, void *);
+int sdt_probe_listall(struct sdt_provider *, sdt_probe_listall_func_t, void *);
int sdt_provider_listall(sdt_provider_listall_func_t,void *);
-int sdt_probe_listall(struct sdt_provider *, sdt_probe_listall_func_t, void *);
#endif /* KDTRACE_HOOKS */
More information about the p4-projects
mailing list