Skip site navigation (1)Skip section navigation (2)
Date:      Wed, 3 Sep 2014 14:09:48 -0700
From:      Shrikanth Kamath <shrikanth07@gmail.com>
To:        avg@freebsd.org, markj@freebsd.org, freebsd-hackers@freebsd.org,  freebsd-dtrace@freebsd.org
Subject:   Re: Usage of DTRACE_PROBE macro from sdt.h in kernel modules
Message-ID:  <CAEOAkMXbn_jeLru4THvtnpj4EsEDLutgK=gOkAciYkgWCYBEJg@mail.gmail.com>
In-Reply-To: <540711ED.2050909@FreeBSD.org>
References:  <CAEOAkMWw07D-XTx8JXvVjU%2BOjUQbKcOZmYoLvzSGA=80B8q-tw@mail.gmail.com> <20140902204413.GC59246@charmander.home> <540711ED.2050909@FreeBSD.org>

next in thread | previous in thread | raw e-mail | index | archive | help
Thanks  Mark/Andriy for helping with this query. I checked the define
KDTRACE_HOOKS define that is set. Rather I tried this, I defined a
fake provider just to check if that prompts sdt_kld_load to create the
SDT probes from my kernel module.

+ SDT_PROVIDER_DEFINE(fake);
And it does help load the SDT probes I created, even though I am not
using the fake provider I defined. I feel that sdt_kld_load is flawed
when it is looking for sdt_providers_set in the module. It expects at
least a provider define and cannot use one of the defined ones in
kernel by just declaring it.

         if (linker_file_lookup_set(lf, "sdt_providers_set", &begin,
&end, NULL))
             return;

I intended to use DTRACE_PROBE() instead of the conventional
SDT_PROBE_DEFINE/SDT_PROBE usage because I wanted to create probes
which have probe names based on __LINE__ macro...disclaimer...this was
just for experiment sakes...

E.g
func_foo()
{
    ....
    if ()
        return EINVAL;
    ...
    if ()
        return EINVAL;
    ...
    if ()
        return EINVAL;
}

which I replaced with
func_foo()
{
    ...
    if ()
        RETSDT(func_foo, EINVAL);
    ...
    if ()
        RETSDT(func_foo, EINVAL);
    ...
    if ()
        RETSDT(func_foo, EINVAL);
}
where RETSDT macro and other macros are defined as

#define PROBENAME1(func, __LINE__) func ## __LINE__
#define PROBENAME(func, line) PROBENAME1(func, line)

#define RETSDT(func, error_code)       \
    do {                                                    \
        DTRACE_PROBE(PROBENAME(func, __LINE__));\
        return (error_code);               \
    } while (0)

With the fake provider I defined I get to see and execute my SDT probes
% dtrace -l | grep func_foo
56455        sdt          netstack                 func_foo1592

Here netstack is my module, and I have a probe name based on __LINE__
which is 1592.
Don't know if that is good way to do it but using SDT_PROBE_DEFINE
looks like a problem because of the presence of __LINE__ in the
probename.

Thanks for reaching out...
--
Shrikanth R K

On Wed, Sep 3, 2014 at 6:04 AM, Andriy Gapon <avg@freebsd.org> wrote:
> on 02/09/2014 23:44 Mark Johnston said the following:
>> Somewhat confusingly, DTRACE_PROBE* shouldn't be used in the kernel.
>
> But it can be used.
>
> Shrikanth, please double check that KDTRACE_HOOKS is defined when you compile
> your module.
>
> --
> Andriy Gapon



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