Skip site navigation (1)Skip section navigation (2)
Date:      Wed, 29 May 2013 23:02:05 -0700
From:      Adam Leventhal <ahl@delphix.com>
To:        Mark Johnston <markj@freebsd.org>
Cc:        rstone@freebsd.org, freebsd-dtrace@freebsd.org
Subject:   Re: adding SDT probe functions with 6+ DTrace arguments
Message-ID:  <CALWP=0aRG5zjcNBJsgA0gwp9x8J_gxEtagfVy3JfK2ePC0J0jA@mail.gmail.com>
In-Reply-To: <20130530040705.GA40320@gloom>
References:  <20130530040705.GA40320@gloom>

next in thread | previous in thread | raw e-mail | index | archive | help
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



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?CALWP=0aRG5zjcNBJsgA0gwp9x8J_gxEtagfVy3JfK2ePC0J0jA>