adding SDT probe functions with 6+ DTrace arguments
Adam Leventhal
ahl at delphix.com
Thu May 30 06:02:06 UTC 2013
Hey Mark,
I'm just now familiarizing myself with the way that FreeBSD DTrace
handles SDT probes, but certainly having more arguments (as needed)
makes sense, and the approach you've taken seems in keeping with the
existing methodology.
Adam
On Wed, May 29, 2013 at 9:07 PM, Mark Johnston <markj at freebsd.org> wrote:
> 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 *);
> _______________________________________________
> freebsd-dtrace at freebsd.org mailing list
> https://lists.freebsd.org/mailman/listinfo/freebsd-dtrace
> To unsubscribe, send any mail to "freebsd-dtrace-unsubscribe at freebsd.org"
--
Adam Leventhal
CTO, Delphix
http://blog.delphix.com/ahl
More information about the freebsd-dtrace
mailing list