Skip site navigation (1)Skip section navigation (2)
Date:      Fri, 18 Jan 2008 10:39:57 GMT
From:      John Birrell <jb@FreeBSD.org>
To:        Perforce Change Reviews <perforce@freebsd.org>
Subject:   PERFORCE change 133544 for review
Message-ID:  <200801181039.m0IAdviq008312@repoman.freebsd.org>

next in thread | raw e-mail | index | archive | help
http://perforce.freebsd.org/chv.cgi?CH=133544

Change 133544 by jb@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 */
 



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?200801181039.m0IAdviq008312>