Date: Wed, 29 May 2013 23:14:32 -0700 From: Brendan Gregg <brendan.gregg@joyent.com> To: Adam Leventhal <ahl@delphix.com> Cc: rstone@freebsd.org, Mark Johnston <markj@freebsd.org>, freebsd-dtrace@freebsd.org Subject: Re: adding SDT probe functions with 6+ DTrace arguments Message-ID: <CA%2BXzFFjOE7y4QueSuqw8zcWMWk7pVyGKifZwgbZcANXYpKrVyA@mail.gmail.com> In-Reply-To: <CALWP=0aRG5zjcNBJsgA0gwp9x8J_gxEtagfVy3JfK2ePC0J0jA@mail.gmail.com> References: <20130530040705.GA40320@gloom> <CALWP=0aRG5zjcNBJsgA0gwp9x8J_gxEtagfVy3JfK2ePC0J0jA@mail.gmail.com>
next in thread | previous in thread | raw e-mail | index | archive | help
G'Day Mark, As this might be interesting: to check that DTRACE_PROBE7 worked, in Solaris I had added an sdt:::test probe, which could be invoked by the DTrace test suite (sdt/tst.sdtargs.c) by calling uadmin() with A_SDTTEST: case A_SDTTEST: { DTRACE_PROBE7(test, int, 1, int, 2, int, 3, int, 4, int, 5, int, 6, int, 7); break; } Getting the tcp and ip providers working will be great. Brendan On Wed, May 29, 2013 at 11:02 PM, Adam Leventhal <ahl@delphix.com> wrote: > 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@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@freebsd.org mailing list > > https://lists.freebsd.org/mailman/listinfo/freebsd-dtrace > > To unsubscribe, send any mail to "freebsd-dtrace-unsubscribe@freebsd.org > " > > > > -- > Adam Leventhal > CTO, Delphix > http://blog.delphix.com/ahl > _______________________________________________ > freebsd-dtrace@freebsd.org mailing list > https://lists.freebsd.org/mailman/listinfo/freebsd-dtrace > To unsubscribe, send any mail to "freebsd-dtrace-unsubscribe@freebsd.org" > -- Brendan Gregg, Joyent http://dtrace.org/blogs/brendan
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?CA%2BXzFFjOE7y4QueSuqw8zcWMWk7pVyGKifZwgbZcANXYpKrVyA>