Date: Thu, 4 Sep 2014 10:48:11 -0700 From: John-Mark Gurney <jmg@funkthat.com> To: Shrikanth Kamath <shrikanth07@gmail.com> Cc: freebsd-hackers@freebsd.org, Mark Johnston <markj@freebsd.org>, avg@freebsd.org, freebsd-dtrace@freebsd.org Subject: Re: Usage of DTRACE_PROBE macro from sdt.h in kernel modules Message-ID: <20140904174811.GK82175@funkthat.com> In-Reply-To: <CAEOAkMVnDWwDbgBQ4j%2BNg3z-p1uP6X6NO-EkY94Zm12C9M58yg@mail.gmail.com> References: <CAEOAkMWw07D-XTx8JXvVjU%2BOjUQbKcOZmYoLvzSGA=80B8q-tw@mail.gmail.com> <20140902204413.GC59246@charmander.home> <540711ED.2050909@FreeBSD.org> <CAEOAkMXbn_jeLru4THvtnpj4EsEDLutgK=gOkAciYkgWCYBEJg@mail.gmail.com> <20140903234950.GB38016@charmander.home> <CAEOAkMVnDWwDbgBQ4j%2BNg3z-p1uP6X6NO-EkY94Zm12C9M58yg@mail.gmail.com>
next in thread | previous in thread | raw e-mail | index | archive | help
Shrikanth Kamath wrote this message on Thu, Sep 04, 2014 at 02:23 -0700: > On Wed, Sep 3, 2014 at 4:49 PM, Mark Johnston <markj@freebsd.org> wrote: > > On Wed, Sep 03, 2014 at 02:09:48PM -0700, Shrikanth Kamath wrote: > >> 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; > > > > You're completely right; this issue was fixed in > > http://svnweb.freebsd.org/base?view=revision&revision=267706 > > > >> > >> 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. > > > > Why not just use a single probe and make the line number and function > > name arguments to the probe? That is, write something like > > > > #define RETSDT(error_code) do { \ > > DTRACE_PROBE2(error__return, __func__, __LINE__) > > return (error_code); > > } while (0) > > > Mark, for some reason using a single probe does not seem to fire the probe. I'm doing something similar in my code: cryptodev.c:SDT_PROBE_DEFINE1(opencrypto, dev, ioctl, error, "int"/*line number*/); cryptodev.c: SDT_PROBE1(opencrypto, dev, ioctl, error, __LINE__); and it worked for me... -- John-Mark Gurney Voice: +1 415 225 5579 "All that I will do, has been done, All that I have, has not."
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?20140904174811.GK82175>