Skip site navigation (1)Skip section navigation (2)
Date:      Thu, 30 May 2013 00:07:05 -0400
From:      Mark Johnston <markj@freebsd.org>
To:        freebsd-dtrace@freebsd.org
Cc:        rstone@freebsd.org
Subject:   adding SDT probe functions with 6+ DTrace arguments
Message-ID:  <20130530040705.GA40320@gloom>

next in thread | raw e-mail | index | archive | help
Hello,

Does anyone have objections or comments on the patch below? It simply
makes it possible to use the SDT_* macros to implement DTrace probes
with more than 5 arguments. dtrace_probe() only takes 5 arguments, so
some ugly casting is needed, but it works properly in my testing on
amd64. In fact, there are a couple of bugs in the way that DTrace
fetches the 6th argument (or the 7th, and so on) from the probe site,
but I'll be fixing that soon as well, along with the test case that's
supposed to detect this problem in the first place.

I don't know of any existing SDT providers in FreeBSD that would use
these macros, but the ip, iscsi and tcp providers will - hence my
interest in making sure that this functionality works properly.

Thanks!
-Mark

diff --git a/sys/sys/sdt.h b/sys/sys/sdt.h
index 522e1f2..21edd53 100644
--- a/sys/sys/sdt.h
+++ b/sys/sys/sdt.h
@@ -91,6 +91,10 @@
 #define	SDT_PROBE_DEFINE3(prov, mod, func, name, sname, arg0, arg1, arg2)
 #define	SDT_PROBE_DEFINE4(prov, mod, func, name, sname, arg0, arg1, arg2, arg3)
 #define	SDT_PROBE_DEFINE5(prov, mod, func, name, sname, arg0, arg1, arg2, arg3, arg4)
+#define	SDT_PROBE_DEFINE6(prov, mod, func, name, snamp, arg0, arg1, arg2,      \
+    arg3, arg4, arg5)
+#define	SDT_PROBE_DEFINE7(prov, mod, func, name, snamp, arg0, arg1, arg2,      \
+    arg3, arg4, arg5, arg6)
 
 #define	SDT_PROBE0(prov, mod, func, name)
 #define	SDT_PROBE1(prov, mod, func, name, arg0)
@@ -98,6 +102,9 @@
 #define	SDT_PROBE3(prov, mod, func, name, arg0, arg1, arg2)
 #define	SDT_PROBE4(prov, mod, func, name, arg0, arg1, arg2, arg3)
 #define	SDT_PROBE5(prov, mod, func, name, arg0, arg1, arg2, arg3, arg4)
+#define	SDT_PROBE6(prov, mod, func, name, arg0, arg1, arg2, arg3, arg4, arg5)
+#define	SDT_PROBE7(prov, mod, func, name, arg0, arg1, arg2, arg3, arg4, arg5,  \
+    arg6)
 
 #else
 
@@ -233,6 +240,27 @@ struct sdt_provider {
 	SDT_PROBE_ARGTYPE(prov, mod, func, name, 3, arg3);		\
 	SDT_PROBE_ARGTYPE(prov, mod, func, name, 4, arg4)
 
+#define	SDT_PROBE_DEFINE6(prov, mod, func, name, sname, arg0, arg1, arg2, arg3,\
+    arg4, arg5) \
+	SDT_PROBE_DEFINE(prov, mod, func, name, sname);			\
+	SDT_PROBE_ARGTYPE(prov, mod, func, name, 0, arg0);		\
+	SDT_PROBE_ARGTYPE(prov, mod, func, name, 1, arg1);		\
+	SDT_PROBE_ARGTYPE(prov, mod, func, name, 2, arg2);		\
+	SDT_PROBE_ARGTYPE(prov, mod, func, name, 3, arg3);		\
+	SDT_PROBE_ARGTYPE(prov, mod, func, name, 4, arg4);		\
+	SDT_PROBE_ARGTYPE(prov, mod, func, name, 5, arg5);
+
+#define	SDT_PROBE_DEFINE7(prov, mod, func, name, sname, arg0, arg1, arg2, arg3,\
+    arg4, arg5, arg6) \
+	SDT_PROBE_DEFINE(prov, mod, func, name, sname);			\
+	SDT_PROBE_ARGTYPE(prov, mod, func, name, 0, arg0);		\
+	SDT_PROBE_ARGTYPE(prov, mod, func, name, 1, arg1);		\
+	SDT_PROBE_ARGTYPE(prov, mod, func, name, 2, arg2);		\
+	SDT_PROBE_ARGTYPE(prov, mod, func, name, 3, arg3);		\
+	SDT_PROBE_ARGTYPE(prov, mod, func, name, 4, arg4);		\
+	SDT_PROBE_ARGTYPE(prov, mod, func, name, 5, arg5);		\
+	SDT_PROBE_ARGTYPE(prov, mod, func, name, 6, arg6);
+
 #define	SDT_PROBE0(prov, mod, func, name)				\
 	SDT_PROBE(prov, mod, func, name, 0, 0, 0, 0, 0)
 #define	SDT_PROBE1(prov, mod, func, name, arg0)				\
@@ -245,6 +273,27 @@ struct sdt_provider {
 	SDT_PROBE(prov, mod, func, name, arg0, arg1, arg2, arg3, 0)
 #define	SDT_PROBE5(prov, mod, func, name, arg0, arg1, arg2, arg3, arg4) \
 	SDT_PROBE(prov, mod, func, name, arg0, arg1, arg2, arg3, arg4)
+#define	SDT_PROBE6(prov, mod, func, name, arg0, arg1, arg2, arg3, arg4, arg5)  \
+	do {								       \
+		if (sdt_##prov##_##mod##_##func##_##name->id)		       \
+			(*(void (*)(uint32_t, uintptr_t, uintptr_t, uintptr_t, \
+			    uintptr_t, uintptr_t, uintptr_t))sdt_probe_func)(  \
+			    sdt_##prov##_##mod##_##func##_##name->id,	       \
+			    (uintptr_t)arg0, (uintptr_t)arg1, (uintptr_t)arg2, \
+			    (uintptr_t)arg3, (uintptr_t)arg4, (uintptr_t)arg5);\
+	} while (0)
+#define	SDT_PROBE7(prov, mod, func, name, arg0, arg1, arg2, arg3, arg4, arg5,  \
+    arg6)								       \
+	do {								       \
+		if (sdt_##prov##_##mod##_##func##_##name->id)		       \
+			(*(void (*)(uint32_t, uintptr_t, uintptr_t, uintptr_t, \
+			    uintptr_t, uintptr_t, uintptr_t, uintptr_t))       \
+			    sdt_probe_func)(				       \
+			    sdt_##prov##_##mod##_##func##_##name->id,	       \
+			    (uintptr_t)arg0, (uintptr_t)arg1, (uintptr_t)arg2, \
+			    (uintptr_t)arg3, (uintptr_t)arg4, (uintptr_t)arg5, \
+			    (uintptr_t)arg6);				       \
+	} while (0)
 
 typedef int (*sdt_argtype_listall_func_t)(struct sdt_argtype *, void *);
 typedef int (*sdt_probe_listall_func_t)(struct sdt_probe *, void *);



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