Skip site navigation (1)Skip section navigation (2)
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>