Re: [lttng-dev] Assertion tgt_fc failed when trying to trace callstack-user
Hi Evan, It turns out it's a Babeltrace 2 bug. Here the fix: https://review.lttng.org/c/babeltrace/+/6257. It should be merged into the master and stable-2.0 branches soon. Thank you for reporting the issue, Francis On 8/4/21 3:55 AM, Evan Galea wrote: Hi Francis, thanks for your reply. As it turns out, running babeltrace on the file worked and I'm able to read the traces. I am running babeltrace 1.5.8, lttng 2.12.4, lttng-tools 2.12.x stable, and lttng modules 5.8.0-63. I attached the trace of the file. On Mon, Aug 2, 2021 at 8:56 AM Francis Deslauriers <mailto:francis.deslauri...@efficios.com>> wrote: Hi Evan, On 8/1/21 5:11 AM, Evan Galea via lttng-dev wrote: Hi there Thanks for help on my previous issue. I was able to get callstack-user to work and see it in my traces. However, in order to get it to run I needed to enable-event --kernel all. Is it necessary to have all kernel events enabled to run callstack-user? Or is it just one specific event? When I try to run it without enabling all kernel events the command is accepted and it runs but I get the following error when trying to view my traces: (╯°□°)╯︵ ┻━┻ ctf-meta-update-value-storing-indexes.c:65: update_field_class_stored_value_index(): Assertion `tgt_fc` failed. Aborted (core dumped) What does this error mean? Should I just continue to enable all kernel events? It's a Babeltrace 2 error. Now, we need to find out if the root cause is the LTTng kernel tracer or Babeltrace2 itself. What is the "one specific event" you're enabling that seems to cause this issue? Do you have access to a Babeltrace 1.5 build? if so, could you try to read that same trace using it? Could you please share a small trace reproducing this issue? What version of LTTng-tools, LTTng-Modules, and Babeltrace2 are you using? Cheers, Francis My current command setup, not sure if relevant lttng create && lttng enable-channel mychannel --subbuf-size 1 lttng enable-event --kernel --all && lttng add-context -u -t vpid -t vtid -t procname && lttng add-context --kernel --type callstack-user && lttng add-context --kernel --type callstack-kernel && lttng enable-event --jul jello again thank you for your time Evan Galea ___ lttng-dev mailing list lttng-dev@lists.lttng.org <mailto:lttng-dev@lists.lttng.org> https://lists.lttng.org/cgi-bin/mailman/listinfo/lttng-dev <https://lists.lttng.org/cgi-bin/mailman/listinfo/lttng-dev> ___ lttng-dev mailing list lttng-dev@lists.lttng.org https://lists.lttng.org/cgi-bin/mailman/listinfo/lttng-dev
Re: [lttng-dev] Assertion tgt_fc failed when trying to trace callstack-user
Hi Evan, On 8/1/21 5:11 AM, Evan Galea via lttng-dev wrote: Hi there Thanks for help on my previous issue. I was able to get callstack-user to work and see it in my traces. However, in order to get it to run I needed to enable-event --kernel all. Is it necessary to have all kernel events enabled to run callstack-user? Or is it just one specific event? When I try to run it without enabling all kernel events the command is accepted and it runs but I get the following error when trying to view my traces: (╯°□°)╯︵ ┻━┻ ctf-meta-update-value-storing-indexes.c:65: update_field_class_stored_value_index(): Assertion `tgt_fc` failed. Aborted (core dumped) What does this error mean? Should I just continue to enable all kernel events? It's a Babeltrace 2 error. Now, we need to find out if the root cause is the LTTng kernel tracer or Babeltrace2 itself. What is the "one specific event" you're enabling that seems to cause this issue? Do you have access to a Babeltrace 1.5 build? if so, could you try to read that same trace using it? Could you please share a small trace reproducing this issue? What version of LTTng-tools, LTTng-Modules, and Babeltrace2 are you using? Cheers, Francis My current command setup, not sure if relevant lttng create && lttng enable-channel mychannel --subbuf-size 1 lttng enable-event --kernel --all && lttng add-context -u -t vpid -t vtid -t procname && lttng add-context --kernel --type callstack-user && lttng add-context --kernel --type callstack-kernel && lttng enable-event --jul jello again thank you for your time Evan Galea ___ lttng-dev mailing list lttng-dev@lists.lttng.org https://lists.lttng.org/cgi-bin/mailman/listinfo/lttng-dev ___ lttng-dev mailing list lttng-dev@lists.lttng.org https://lists.lttng.org/cgi-bin/mailman/listinfo/lttng-dev
Re: [lttng-dev] convert call_site to func/offset
Hi Changcheng, This is not currently supported by Babeltrace. It could probably be done the same way we do it with the "ip" and "vpid" contexts in the debug-info component class but it's not done yet. Thanks, Francis Le mer. 1 juill. 2020, à 11 h 58, Liu, Changcheng via lttng-dev < lttng-dev@lists.lttng.org> a écrit : > Hi all, > I checked __cyg_profile_func_enter implementation. > The caller address is recorded into call_site field. > > Does anyone know how to let babeltrace show the call_site into > "func/offset" format instead of the running virtual address? > > B.R. > Changcheng > ___ > lttng-dev mailing list > lttng-dev@lists.lttng.org > https://lists.lttng.org/cgi-bin/mailman/listinfo/lttng-dev > -- Francis Deslauriers Computer Engineer EfficiOS inc. ___ lttng-dev mailing list lttng-dev@lists.lttng.org https://lists.lttng.org/cgi-bin/mailman/listinfo/lttng-dev
Re: [lttng-dev] tracing page_faults with lttng?
Le sam. 2 nov. 2019, à 11 h 41, Milian Wolff via lttng-dev a écrit : > > On Samstag, 12. Oktober 2019 23:31:51 CET Milian Wolff via lttng-dev wrote: > > On Montag, 29. Mai 2017 10:44:50 CEST Milian Wolff wrote: > > > On Wednesday, May 24, 2017 6:26:38 PM CEST Francis Deslauriers wrote: > > > > Hi Milian, > > > > Are you running on an x86 processor? > > > > > > Yes, Intel(R) Core(TM) i7-4770 CPU @ 3.40GHz. > > > > > > > The pagefault tracepoints are called : x86_exceptions_page_fault_user, > > > > x86_exceptions_page_fault_kernel > > > > Can you see those tracepoints when you run: lttng list --kernel > > > > > > Yes: > > > > > > $ lttng list --kernel | grep fault > > > > > > x86_exceptions_page_fault_user (loglevel: TRACE_EMERG (0)) (type: > > > tracepoint) > > > > > > x86_exceptions_page_fault_kernel (loglevel: TRACE_EMERG (0)) (type: > > > tracepoint) > > > > > > kvm_async_pf_doublefault (loglevel: TRACE_EMERG (0)) (type: > > > tracepoint) > > > > Hey there, > > > > a follow up to the above question: What about tracing page faults on ARM? > > Perf can do that, but I see no page_fault trace points in the output of > > `lttng list -k`? > > ping? Hi Milian, I believe that the page fault event you see with Perf is a perf event, not a trace event. What is the name of the event you see exactly? In order to trace the page faults on Arm with LTTng, we will need to add trace event tracepoints to the do_page_fault() functions in the arm (or arm64) architecture of the kernel. Francis > > -- > Milian Wolff | milian.wo...@kdab.com | Senior Software Engineer > KDAB (Deutschland) GmbH, a KDAB Group company > Tel: +49-30-521325470 > KDAB - The Qt, C++ and OpenGL > Experts___ > lttng-dev mailing list > lttng-dev@lists.lttng.org > https://lists.lttng.org/cgi-bin/mailman/listinfo/lttng-dev -- Francis Deslauriers Computer Engineer EfficiOS inc. ___ lttng-dev mailing list lttng-dev@lists.lttng.org https://lists.lttng.org/cgi-bin/mailman/listinfo/lttng-dev
[lttng-dev] Tracing Summit 2019 - Videos
Hi all, The videos of the Tracing Summit 2019 talks are now available on Youtube here: https://www.youtube.com/playlist?list=PLuo4E47p5_7ZeRpUZEUyF2kWyA6KzTTkI. See you all next year! -- Francis Deslauriers Computer Engineer EfficiOS inc. ___ lttng-dev mailing list lttng-dev@lists.lttng.org https://lists.lttng.org/cgi-bin/mailman/listinfo/lttng-dev
[lttng-dev] Tracing Summit 2019 - Schedule Release
Hi all, We're happy to announce the schedule for the Tracing Summit 2019 is now available. We are going to have an amazing conference with diverse topics such as trace analysis, GPU tracing, distributed systems tracing and more. Checkout the schedule and talk abstracts on the website.[1] Tracing Summit 2019 will be held in San Diego, California on August 20th, 2019, Don't forget to register for the summit either when buying your Open Source Summit ticket or using this link [2]! See you in August! The Tracing Summit Organizers [1] https://tracingsummit.org/wiki/TracingSummit2019 [2] https://www.cvent.com/events/tracing-summit-2019/registration-63351d06945a46d890b8e5a200dbc0fc.aspx?fqp=true -- Francis Deslauriers Computer Engineer EfficiOS inc. ___ lttng-dev mailing list lttng-dev@lists.lttng.org https://lists.lttng.org/cgi-bin/mailman/listinfo/lttng-dev
Re: [lttng-dev] Tracing Summit 2019: Announcement and Call for Proposals, August 20th, 2019, San Diego, CA
Hi all, This is a friendly reminder that the deadline for submitting talk proposals for the Tracing Summit 2019 [1] is coming up soon (July 1st). Submit you talk today through this form: https://forms.gle/L6mR2ZN3Nt7bUxY98. The Tracing Summit 2019 will be held in San Diego, California on August 20th, 2019, at the Hilton San Diego Bayfront, co-located with the Open Source Summit & Embedded Linux Conference North America 2019 This year tickets are $100 and seating is limited to 100 people. To register, you can add the Tracing Summit as an addon to your Open Source Summit ticket or use this link to register solely for the Tracing Summit: https://www.cvent.com/events/tracing-summit-2019/registration-63351d06945a46d890b8e5a200dbc0fc.aspx. We are actively looking for sponsors to support the Tracing Summit. Contact us at i...@tracingsummit.org. More info: https://tracingsummit.org/wiki/TracingSummit2019 Thank you, On behalf of the Diagnostic and Monitoring Workgroup, Tracing Summit organizers Le mar. 16 avr. 2019, à 11 h 54, Francis Deslauriers a écrit : > > Hi all, > > This is a Call for Proposals for the Tracing Summit 2019 [0] which > will be held in San Diego, California, USA at the Hilton San Diego > Bayfront, co-located with the Open Source Summit & Embedded Linux > Conference North America 2019 [1] on August 20th, 2019. > > You can subscribe to our mailing list ot get the latest info on the event: [2] > > The Tracing Summit is single-day, single-track conference on the topic > of tracing. The event focuses on the field of software and hardware > tracing, gathering developers and end-users of tracing and trace > analysis tools. The main goal of the Tracing Summit is to provide > space for discussion between people of the various areas that benefit > from tracing, namely parallel, distributed and/or real-time systems, > as well as kernel development. > > We are welcoming 30 minute presentations from both end users and > developers, on topics covering, but not limited to: > -Investigation workflow of Real-Time, latency, and throughput issues, > -Trace collection and extraction, > -Trace filtering, > -Trace aggregation, > -Trace formats, > -Tracing multi-core systems, > -Trace abstraction, > -Trace modeling, > -Automated trace analysis (e.g. dependency analysis), > -Tracing large clusters and distributed systems, > -Hardware-level tracing (e.g. DSP, GPU, bare-metal), > -Trace visualisation, > -Interaction between debugging and tracing, > -Tracing remote control, > -Analysis of large trace datasets, > -Cloud trace collection and analysis, > -Integration between trace tools, > -Live tracing & monitoring, > -Programmable tracing (e.g. eBPF). > > Those can cover recently available technologies, ongoing work, and yet > non-existing technologies (which are compellingly interesting to > end-users). Please understand that this open forum is not the proper > place to present sales or marketing pitches, nor technologies which > are prevented from being freely used in open source. > > * Submit you talk today using this form: https://forms.gle/L6mR2ZN3Nt7bUxY98 * > > The submission deadline is July 1st 2019 at 23:59 EST. > > This year tickets are $100 and seating is limited to 100 people. To > register, you can add the Tracing Summit as an addon to your Open > Source Summit ticket [3] or use this link [4] to register solely for > the Tracing Summit. > > The Tracing Summit is sponsored by EfficiOS. We are actively looking > for sponsors to support the Tracing Summit. Contact us at > i...@tracingsummit.org. > > Please send any query about this conference to i...@tracingsummit.org. > > This event is organized by Francis Deslauriers and Mathieu Desnoyers > on the behalf of the Linux Foundation Diagnostic and Monitoring > Workgroup [5]. > > [0] : https://tracingsummit.org > [1]: > https://events.linuxfoundation.org/events/open-source-summit-north-america-2019 > [2]: http://eepurl.com/goakfv > [3]: > https://www.cvent.com/events/open-source-summit-embedded-linux-conference-north-america-2019/registration-0ed1330c38bd4845be29b91c9d2444ce.aspx?fqp=true > [4]: > https://www.cvent.com/events/tracing-summit-2019/registration-63351d06945a46d890b8e5a200dbc0fc.aspx?fqp=true > [5]: https://diamon.org > > -- > Francis Deslauriers > Computer Engineer > EfficiOS inc. -- Francis Deslauriers Computer Engineer EfficiOS inc. ___ lttng-dev mailing list lttng-dev@lists.lttng.org https://lists.lttng.org/cgi-bin/mailman/listinfo/lttng-dev
[lttng-dev] Tracing Summit 2019: Announcement and Call for Proposals, August 20th, 2019, San Diego, CA
Hi all, This is a Call for Proposals for the Tracing Summit 2019 [0] which will be held in San Diego, California, USA at the Hilton San Diego Bayfront, co-located with the Open Source Summit & Embedded Linux Conference North America 2019 [1] on August 20th, 2019. You can subscribe to our mailing list ot get the latest info on the event: [2] The Tracing Summit is single-day, single-track conference on the topic of tracing. The event focuses on the field of software and hardware tracing, gathering developers and end-users of tracing and trace analysis tools. The main goal of the Tracing Summit is to provide space for discussion between people of the various areas that benefit from tracing, namely parallel, distributed and/or real-time systems, as well as kernel development. We are welcoming 30 minute presentations from both end users and developers, on topics covering, but not limited to: -Investigation workflow of Real-Time, latency, and throughput issues, -Trace collection and extraction, -Trace filtering, -Trace aggregation, -Trace formats, -Tracing multi-core systems, -Trace abstraction, -Trace modeling, -Automated trace analysis (e.g. dependency analysis), -Tracing large clusters and distributed systems, -Hardware-level tracing (e.g. DSP, GPU, bare-metal), -Trace visualisation, -Interaction between debugging and tracing, -Tracing remote control, -Analysis of large trace datasets, -Cloud trace collection and analysis, -Integration between trace tools, -Live tracing & monitoring, -Programmable tracing (e.g. eBPF). Those can cover recently available technologies, ongoing work, and yet non-existing technologies (which are compellingly interesting to end-users). Please understand that this open forum is not the proper place to present sales or marketing pitches, nor technologies which are prevented from being freely used in open source. * Submit you talk today using this form: https://forms.gle/L6mR2ZN3Nt7bUxY98 * The submission deadline is July 1st 2019 at 23:59 EST. This year tickets are $100 and seating is limited to 100 people. To register, you can add the Tracing Summit as an addon to your Open Source Summit ticket [3] or use this link [4] to register solely for the Tracing Summit. The Tracing Summit is sponsored by EfficiOS. We are actively looking for sponsors to support the Tracing Summit. Contact us at i...@tracingsummit.org. Please send any query about this conference to i...@tracingsummit.org. This event is organized by Francis Deslauriers and Mathieu Desnoyers on the behalf of the Linux Foundation Diagnostic and Monitoring Workgroup [5]. [0] : https://tracingsummit.org [1]: https://events.linuxfoundation.org/events/open-source-summit-north-america-2019 [2]: http://eepurl.com/goakfv [3]: https://www.cvent.com/events/open-source-summit-embedded-linux-conference-north-america-2019/registration-0ed1330c38bd4845be29b91c9d2444ce.aspx?fqp=true [4]: https://www.cvent.com/events/tracing-summit-2019/registration-63351d06945a46d890b8e5a200dbc0fc.aspx?fqp=true [5]: https://diamon.org -- Francis Deslauriers Computer Engineer EfficiOS inc. ___ lttng-dev mailing list lttng-dev@lists.lttng.org https://lists.lttng.org/cgi-bin/mailman/listinfo/lttng-dev
Re: [lttng-dev] Tracepoints firing without being enabled in LTTng
Le mer. 20 févr. 2019, à 09 h 10, Mosleh Uddin a écrit : > > Hello, > > Here is what I do to get the consistent behavior: > When the app is running as a service, lttng list -u does not display any > events, initially I do have to lttng enable-events and lttng start to see the > tracepoints in lttng view. However, after lttng start, I can disable all > events and I can still see the events coming through in lttng view. When I > run the app normally, lttng list -u displays the tracepoints I place in the > app, and all functionality of lttng works as expected. > > I apologize, I am in the process of trying to get you the outputs you are > asking for, however due to confidentiality with the app the outputs of > running the commands need to be reviewed by others. I will try to get this to > you as soon as I can. I understand. Thanks, Francis > > I can say the service is being kick started by systemd. Also I believe the > app is mass-closing file descriptors when it is daemonizing. I tried to > dynamically load the liblttng-ust-fd.so but the behavior did not change. > > Thanks, > Mosleh > > On Tue, Feb 19, 2019 at 5:16 PM Francis Deslauriers > wrote: >> >> Hi Mosleh, >> Just to be clear: >> When you run your app as a service (background), lttng list -u doesn't >> display any events AND you see events in the live session without >> having run enable-event and start commands. >> When you run your app normally, lttng list -u displays events AND you >> only see events after running enable-event and start commands. >> Is that correct? >> >> Please provide the output of the lttng-sessiond in verbose mode using >> the following command: >> > lttng-sessiond -vvv >> please provide the output of your application as a service with this >> environment variable: LTTNG_UST_DEBUG=1 >> and please provide us with the service file describing how your >> service is started. >> Put all of this on a pastebin.com >> >> Is your application mass-closing file descriptors when it's >> daemonizing? how about using fork() syscall without an exec() after >> it? If so, have a look at this part of the UST man page: >> https://lttng.org/man/3/lttng-ust/v2.10/#doc-_using_lttng_ust_with_daemons >> >> Thank you, >> Francis >> >> >> Le mar. 19 févr. 2019, à 16 h 37, Mosleh Uddin a >> écrit : >> > >> > Hello, >> > >> > Sorry for the late reply. I was able to figure out the weird behavior from >> > the application. Turns out if I run my application as a service, lttng no >> > longer can see any of the UST tracepoints and causes the behavior I was >> > explaining. >> > When I execute the application normally (./app_name), the functionality is >> > as expected. Is this the expected behavior? Is there some way I can trace >> > the userspace application while running it as a service simultaneously? >> > >> > Thanks for any info, >> > Mosleh >> > >> > On Fri, Feb 15, 2019 at 2:48 PM Francis Deslauriers >> > wrote: >> >> >> >> Can you start the lttng-sessiond in verbose mode using the following >> >> command: >> >> > lttng-sessiond -vvv >> >> and then do the lttng create, start of application and lttng view on >> >> another console. >> >> >> >> Then copy the output of the sessiond on https://pastebin.com/ and send us >> >> the link. >> >> >> >> Thank you, >> >> Francis >> >> >> >> Le ven. 15 févr. 2019, à 14 h 36, Mosleh Uddin a >> >> écrit : >> >>> >> >>> That's correct, I don't enable any events or do: lttng start. >> >>> Here is some snapshots of starting everything up, followed by starting >> >>> my application. >> >>> >> >>> >> >>> Here are the outputs for the commands: >> >>> >> >>> >> >>> >> >>> >> >>> >> >>> >> >>> >> >>> Note that even though the session is inactive, when a trace event occurs >> >>> in my application it is being recorded in the appropriate directory: >> >>> >> >>> >> >>> >> >>> Also maybe important, the system has root only user. Would having the >> >>> application belonging to a different user and trying to run as root >> >>> cause these kinds of complications? I did notice whe
Re: [lttng-dev] Tracepoints firing without being enabled in LTTng
Hi Mosleh, Just to be clear: When you run your app as a service (background), lttng list -u doesn't display any events AND you see events in the live session without having run enable-event and start commands. When you run your app normally, lttng list -u displays events AND you only see events after running enable-event and start commands. Is that correct? Please provide the output of the lttng-sessiond in verbose mode using the following command: > lttng-sessiond -vvv please provide the output of your application as a service with this environment variable: LTTNG_UST_DEBUG=1 and please provide us with the service file describing how your service is started. Put all of this on a pastebin.com Is your application mass-closing file descriptors when it's daemonizing? how about using fork() syscall without an exec() after it? If so, have a look at this part of the UST man page: https://lttng.org/man/3/lttng-ust/v2.10/#doc-_using_lttng_ust_with_daemons Thank you, Francis Le mar. 19 févr. 2019, à 16 h 37, Mosleh Uddin a écrit : > > Hello, > > Sorry for the late reply. I was able to figure out the weird behavior from > the application. Turns out if I run my application as a service, lttng no > longer can see any of the UST tracepoints and causes the behavior I was > explaining. > When I execute the application normally (./app_name), the functionality is as > expected. Is this the expected behavior? Is there some way I can trace the > userspace application while running it as a service simultaneously? > > Thanks for any info, > Mosleh > > On Fri, Feb 15, 2019 at 2:48 PM Francis Deslauriers > wrote: >> >> Can you start the lttng-sessiond in verbose mode using the following command: >> > lttng-sessiond -vvv >> and then do the lttng create, start of application and lttng view on another >> console. >> >> Then copy the output of the sessiond on https://pastebin.com/ and send us >> the link. >> >> Thank you, >> Francis >> >> Le ven. 15 févr. 2019, à 14 h 36, Mosleh Uddin a >> écrit : >>> >>> That's correct, I don't enable any events or do: lttng start. >>> Here is some snapshots of starting everything up, followed by starting my >>> application. >>> >>> >>> Here are the outputs for the commands: >>> >>> >>> >>> >>> >>> >>> >>> Note that even though the session is inactive, when a trace event occurs in >>> my application it is being recorded in the appropriate directory: >>> >>> >>> >>> Also maybe important, the system has root only user. Would having the >>> application belonging to a different user and trying to run as root cause >>> these kinds of complications? I did notice when testing on a raspberry pi >>> that running an application as a root user would mean running sessions as >>> root user as well. >>> >>> Thanks, >>> Mosleh >>> >>> On Fri, Feb 15, 2019 at 11:55 AM Francis Deslauriers >>> wrote: >>>> >>>> Adding back lttng-dev mailing list. >>>> >>>> So you don't even run a lttng-enable-event command? >>>> That's odd. >>>> >>>> Can you send us the output of the following commands: >>>> Is it possible that there are other lttng-sessiond daemons running on >>>> the machine? >>>> > ps aux | grep "lttng-sessiond" >>>> Verify if there are other active tracing sessions: >>>> > lttng list >>>> Check the details of the current session: >>>> > lttng status >>>> >>>> Thank you, >>>> Francis >>>> >>>> Le ven. 15 févr. 2019, à 11 h 29, Mosleh Uddin a >>>> écrit : >>>> > >>>> > Hi Francis, >>>> > >>>> > Thank you for the quick response. >>>> > Just to clear things up, my application is running when I run that >>>> > command. >>>> > >>>> > The commands I am running are: >>>> > > lttng-sessiond -d >>>> > > lttng create my-sess --live >>>> > After this command I start my application. If I then do the command: >>>> > > lttng view >>>> > I will see the tracepoints in the application in the terminal even >>>> > though I have not done: lttng start. >>>> > >>>> > I thought it was strange that I cannot find my application in the: lttng >>>> > list command under any domain. >>
Re: [lttng-dev] Tracepoints firing without being enabled in LTTng
Can you start the lttng-sessiond in verbose mode using the following command: > lttng-sessiond -vvv and then do the lttng create, start of application and lttng view on another console. Then copy the output of the sessiond on https://pastebin.com/ and send us the link. Thank you, Francis Le ven. 15 févr. 2019, à 14 h 36, Mosleh Uddin a écrit : > That's correct, I don't enable any events or do: lttng start. > Here is some snapshots of starting everything up, followed by starting my > application. > [image: image.png] > > Here are the outputs for the commands: > > [image: image.png] > > [image: image.png] > > [image: image.png] > > Note that even though the session is inactive, when a trace event occurs > in my application it is being recorded in the appropriate directory: > > [image: image.png] > > Also maybe important, the system has root only user. Would having the > application belonging to a different user and trying to run as root cause > these kinds of complications? I did notice when testing on a raspberry pi > that running an application as a root user would mean running sessions as > root user as well. > > Thanks, > Mosleh > > On Fri, Feb 15, 2019 at 11:55 AM Francis Deslauriers < > francis.deslauri...@efficios.com> wrote: > >> Adding back lttng-dev mailing list. >> >> So you don't even run a lttng-enable-event command? >> That's odd. >> >> Can you send us the output of the following commands: >> Is it possible that there are other lttng-sessiond daemons running on >> the machine? >> > ps aux | grep "lttng-sessiond" >> Verify if there are other active tracing sessions: >> > lttng list >> Check the details of the current session: >> > lttng status >> >> Thank you, >> Francis >> >> Le ven. 15 févr. 2019, à 11 h 29, Mosleh Uddin a >> écrit : >> > >> > Hi Francis, >> > >> > Thank you for the quick response. >> > Just to clear things up, my application is running when I run that >> command. >> > >> > The commands I am running are: >> > > lttng-sessiond -d >> > > lttng create my-sess --live >> > After this command I start my application. If I then do the command: >> > > lttng view >> > I will see the tracepoints in the application in the terminal even >> though I have not done: lttng start. >> > >> > I thought it was strange that I cannot find my application in the: >> lttng list command under any domain. >> > Also the reason I start my application after creating a session is >> because the system automatically starts the application using systemd, >> > in order to get tracing data at all I have to manually stop the >> application and start it again after creating a session. >> > >> > Thanks again for any help, >> > Mosleh >> > >> > On Fri, Feb 15, 2019 at 10:32 AM Francis Deslauriers < >> francis.deslauri...@efficios.com> wrote: >> >> >> >> Hi Mosleh, >> >> It's expected to not see any event when running lttng list -u if no >> >> lttng-ust instrumented applications are running. >> >> >> >> What are the exact lttng commands you are running to see those >> >> unexpected events? >> >> >> >> Thank you, >> >> Francis >> >> >> >> >> >> Le ven. 15 févr. 2019, à 10 h 08, Mosleh Uddin >> a écrit : >> >> > >> >> > Hello, >> >> > >> >> > I am having a strange issue with my current application. For some >> context, I have integrated LTTng into a Yocto build and put custom trace >> points in my embedded system application. Once I load the built image onto >> my system and start a session daemon, I try to list all available userspace >> events (using lttng list -u), but no events show up. >> >> > >> >> > The strange occurrence is when I create a session (lltng create >> my-sess) and not start tracing the trace events will display on the screen >> regardless (when starting session in live mode with lttng view). I was >> wondering if anyone has any insight on this issue I am having. >> >> > >> >> > Thanks for any assistance, >> >> > Mosleh >> >> > ___ >> >> > lttng-dev mailing list >> >> > lttng-dev@lists.lttng.org >> >> > https://lists.lttng.org/cgi-bin/mailman/listinfo/lttng-dev >> >> >> >> -- >> >> Francis Deslauriers >> >> Computer Engineer >> >> EfficiOS inc. >> >> >> >> -- >> Francis Deslauriers >> Computer Engineer >> EfficiOS inc. >> > ___ > lttng-dev mailing list > lttng-dev@lists.lttng.org > https://lists.lttng.org/cgi-bin/mailman/listinfo/lttng-dev > -- Francis Deslauriers Computer Engineer EfficiOS inc. ___ lttng-dev mailing list lttng-dev@lists.lttng.org https://lists.lttng.org/cgi-bin/mailman/listinfo/lttng-dev
Re: [lttng-dev] Tracepoints firing without being enabled in LTTng
Adding back lttng-dev mailing list. So you don't even run a lttng-enable-event command? That's odd. Can you send us the output of the following commands: Is it possible that there are other lttng-sessiond daemons running on the machine? > ps aux | grep "lttng-sessiond" Verify if there are other active tracing sessions: > lttng list Check the details of the current session: > lttng status Thank you, Francis Le ven. 15 févr. 2019, à 11 h 29, Mosleh Uddin a écrit : > > Hi Francis, > > Thank you for the quick response. > Just to clear things up, my application is running when I run that command. > > The commands I am running are: > > lttng-sessiond -d > > lttng create my-sess --live > After this command I start my application. If I then do the command: > > lttng view > I will see the tracepoints in the application in the terminal even though I > have not done: lttng start. > > I thought it was strange that I cannot find my application in the: lttng list > command under any domain. > Also the reason I start my application after creating a session is because > the system automatically starts the application using systemd, > in order to get tracing data at all I have to manually stop the application > and start it again after creating a session. > > Thanks again for any help, > Mosleh > > On Fri, Feb 15, 2019 at 10:32 AM Francis Deslauriers > wrote: >> >> Hi Mosleh, >> It's expected to not see any event when running lttng list -u if no >> lttng-ust instrumented applications are running. >> >> What are the exact lttng commands you are running to see those >> unexpected events? >> >> Thank you, >> Francis >> >> >> Le ven. 15 févr. 2019, à 10 h 08, Mosleh Uddin a >> écrit : >> > >> > Hello, >> > >> > I am having a strange issue with my current application. For some context, >> > I have integrated LTTng into a Yocto build and put custom trace points in >> > my embedded system application. Once I load the built image onto my system >> > and start a session daemon, I try to list all available userspace events >> > (using lttng list -u), but no events show up. >> > >> > The strange occurrence is when I create a session (lltng create my-sess) >> > and not start tracing the trace events will display on the screen >> > regardless (when starting session in live mode with lttng view). I was >> > wondering if anyone has any insight on this issue I am having. >> > >> > Thanks for any assistance, >> > Mosleh >> > ___ >> > lttng-dev mailing list >> > lttng-dev@lists.lttng.org >> > https://lists.lttng.org/cgi-bin/mailman/listinfo/lttng-dev >> >> -- >> Francis Deslauriers >> Computer Engineer >> EfficiOS inc. -- Francis Deslauriers Computer Engineer EfficiOS inc. ___ lttng-dev mailing list lttng-dev@lists.lttng.org https://lists.lttng.org/cgi-bin/mailman/listinfo/lttng-dev
Re: [lttng-dev] Tracepoints firing without being enabled in LTTng
Hi Mosleh, It's expected to not see any event when running lttng list -u if no lttng-ust instrumented applications are running. What are the exact lttng commands you are running to see those unexpected events? Thank you, Francis Le ven. 15 févr. 2019, à 10 h 08, Mosleh Uddin a écrit : > > Hello, > > I am having a strange issue with my current application. For some context, I > have integrated LTTng into a Yocto build and put custom trace points in my > embedded system application. Once I load the built image onto my system and > start a session daemon, I try to list all available userspace events (using > lttng list -u), but no events show up. > > The strange occurrence is when I create a session (lltng create my-sess) and > not start tracing the trace events will display on the screen regardless > (when starting session in live mode with lttng view). I was wondering if > anyone has any insight on this issue I am having. > > Thanks for any assistance, > Mosleh > ___ > lttng-dev mailing list > lttng-dev@lists.lttng.org > https://lists.lttng.org/cgi-bin/mailman/listinfo/lttng-dev -- Francis Deslauriers Computer Engineer EfficiOS inc. ___ lttng-dev mailing list lttng-dev@lists.lttng.org https://lists.lttng.org/cgi-bin/mailman/listinfo/lttng-dev
Re: [lttng-dev] "Hands-free" tracepoints using LD_PRELOAD
es >> >- Implementations of struct "wrappers" that provide custom ostream >> >operators >> >- A map between type names and wrapper names >> > >> > The machinery here seems fairly general-purpose, but I don't presume to be >> > an expert. My implementation is somewhat error-prone, and my main hope in >> > reaching out to the mailing list was that LTTng already had some of these >> > steps better-implemented. >> >> AFAIK, lttng does not have an equivalent. >> >> > Step #2 is particularly problematic due to >> > ambiguities in the mangling grammar, and will need support going forward to >> > generalize well. >> >> What is the status of this step in your project? >> >> What are the problems that make your implementation "error-pone"? >> >> Would you mind linking us to said project so we can have a look? >> >> I would be interested in seeing at first lttng tracepoint used as Francis >> demonstrated and see from there were this project can go. >> >> > >> > I would be happy to contribute some or all of my implementation if it's >> > something that the LTTng community would be interested in supporting and >> > extending. >> >> We are clearly open for discussion and helping you improve the project. I am >> not >> so sure on supporting and extending it. Others might have a different >> opinion. >> >> >> Cheers >> >> -- >> Jonathan Rajotte-Julien >> EfficiOS -- Francis Deslauriers Computer Engineer EfficiOS inc. ___ lttng-dev mailing list lttng-dev@lists.lttng.org https://lists.lttng.org/cgi-bin/mailman/listinfo/lttng-dev
Re: [lttng-dev] "Hands-free" tracepoints using LD_PRELOAD
Hi Brian, If I understand correctly, you want developers to provide a whitelist of functions that they want to instrument in an arbitrary shared library, and then have a system that instruments those functions without having to recompile the library with LTTng-UST tracepoints. Can you give us an example of annotation that the shim developer would provide? Do you need to support the extraction of function arguments? If you don't, here are two straightforward and tested approaches to solve your problem: First, overriding target symbols using LD_PRELOAD (like you suggested above): 1. Create boilerplate script #1 that generates tracepoints definitions [1] based on function name, 2. Create boilerplate script #2 that generates a function calling the right tracepoint and the original target function [2], 3. For each target symbol "bar", using script #1, create a tracepoint definition "libfoo:bar_tp", and compile them into a tracepoints.o. object file, 4. For each target symbol "bar", using script #2, create a function "bar" that calls the bar_tp tracepoint (e.g. tracepoint(libfoo, bar_tp) ) and then calls the original bar function in libfoo.so (using dlsym(3)), and compile those callsites into a callsites.o object file, 5. Create a shared library libshim.so using tracepoints.o and callsites.o object files and link it to lttng-ust lib and the dynamic loader lib using :"-llttng-ust -ldl", Those steps results in the creation of a libshim.so file that contains the "bar" overriding function (containing the tracepoint callsite) that will be called instead of "bar" function in the libfoo.so library when LD_PRELOADing it (e.g. LD_PRELOAD=libshim.so ./fooapp). Here is the Makefile I used to test this [3] to give you a sense of the pipeline. Second, using the newly added --userspace-probe instrumentation: This option allows you to instrument any ELF symbol without recompiling or restarting the target process. For example, to instrument the "bar" function in the /tmp/libfoo.so file you could run to following command: > lttng enable-event -k --userspace-probe="elf:/tmp/libfoo.so:bar" $event_name You could write a script that takes the list of target functions and adds userspace-probes on each of them. This approach has the advantage that you can also instrument functions in the binary and not only functions in shared libraries. This instrumentation type uses the kernel tracer and thus requires using the lttng-modules. If you do need to save the function arguments, I believe it's possible using the first approach, by tweaking the two boilerplate scripts depending on what are the annotations you want to provide. Supporting argument extraction with userspace-probes is part of our long term goal and would be a really powerful feature but will require a significant engineering effort to accomplish. [1] : https://lttng.org/docs/v2.10/#doc-tpp-header [2]: https://lttng.org/docs/v2.10/#doc-probing-the-application-source-code [3]: http://paste.ubuntu.com/p/5fBSgRqXsB/ I hope this make sense. Please don't hesitate if you want more details. Thank you, Francis Le ven. 18 janv. 2019, à 16 h 04, Brian Rossa a écrit : > > Hello, > > I have a custom tracing solution that I'm interested in porting to LTTng. It > works as follows: > > Input is a whitelist of mangled names taken from a target library, libfoo.so. > For each name, generate a logging shim (example) for the corresponding call. > Compile all the logging shims into a shared library, libshim.so. > Trace any application using libfoo by running it as LD_PRELOAD=libshim.so > ./fooapp > > There are two nice things about this approach that I would like to preserve: > > The shim developer only needs to provide the whitelist and a bit of extra > annotation. From there, the shim can be be authored using a boilerplate > generator. > The app developer doesn't have to do anything other than pass the LD_PRELOAD > flag. > > The downside is that the only tracepoints are those corresponding to the > whitelist, but I'm fine with that. > > Can this kind of "hands-free" developer experience be supported by LTTng? > > Thanks! > ~br > ___ > lttng-dev mailing list > lttng-dev@lists.lttng.org > https://lists.lttng.org/cgi-bin/mailman/listinfo/lttng-dev -- Francis Deslauriers Computer Engineer EfficiOS inc. ___ lttng-dev mailing list lttng-dev@lists.lttng.org https://lists.lttng.org/cgi-bin/mailman/listinfo/lttng-dev
[lttng-dev] Videos of the Tracing Summit 2018
Hi, The videos of the Tracing Summit 2018 are now online: https://www.youtube.com/playlist?list=PLuo4E47p5_7aBCdobf_XpEPcDFNPhpRNs You can also access them from the schedule here: https://tracingsummit.org/wiki/TracingSummit2018#Schedule -- On behalf of the Diagnostic and Monitoring Workgroup, Francis Deslauriers ___ lttng-dev mailing list lttng-dev@lists.lttng.org https://lists.lttng.org/cgi-bin/mailman/listinfo/lttng-dev
[lttng-dev] [BETA RELEASE] LTTng Scope 0.4
Hi all, We are announcing the release of LTTng Scope 0.4.0. This release has a few improvements over LTTng Scope 0.3: * Open more than one trace thanks to the new "Trace Project Setup" window. (e.g. Kernel + UST traces) You can always reopen this window to add traces to or remove traces from the current trace project by clicking "File" -> "Project Setup..." or by right-clicking the project item in the left pane and clicking "Project Setup". * Event count chart: use vertical bars instead of an area chart. A given bar indicates the number of event records of which the timestamps are between the beginning and the end of the bar. * Event count chart: use natural ticks, depending on the current zoom level, on the horizontal (time) axis. For example, the difference between individual ticks can be 100 ms, 500 ms, 1 s, 2 s, 15 s, 30 minutes, 1 day, etc. * Event count chart: add axis units ("Count / Time") below the view's title on the left. * Add the version to the main window's title bar. * Bug fix: refresh the views when you move vertical dividers or when you resize the main window. * Bug fix: event count chart: round tick labels correctly to avoid noticing floating point number errors. Of course, because LTTng Scope's development is still in the beta phase, you could discover bugs when trying the tool. Feel free to report them on GitHub: <https://github.com/lttng/lttng-scope/issues>. Project's description and screenshot: <https://lttng.org/beta/#lttng-scope> GitHub page: <https://github.com/lttng/lttng-scope> Installer for Linux: <https://lttng.org/files/lttng-scope/lttng-scope-0.4.0-linux-x64-installer.run> Installer for Windows: <https://lttng.org/files/lttng-scope/lttng-scope-0.4.0-windows-installer.exe> Installer for macOS: <https://lttng.org/files/lttng-scope/lttng-scope-0.4.0-osx-installer.dmg> On the behalf of the EfficiOS team, -- Francis Deslauriers Software developer EfficiOS inc. ___ lttng-dev mailing list lttng-dev@lists.lttng.org https://lists.lttng.org/cgi-bin/mailman/listinfo/lttng-dev
[lttng-dev] Tracing Summit 2018 Schedule Released
Hi all, We're happy to announce the schedule for the Tracing Summit 2018 is now available. We're going to have an amazing conference with diverse topics such as trace analysis, hardware tracing, and distributed systems tracing. Check out the schedule and talk abstracts on the Tracing Summit wiki. [1] Tracing Summit 2018 will be held in Edinburgh, UK on October 25th, 2018, Don't forget to register for the summit, it's free! [2] See you in October! [1]: https://tracingsummit.org/wiki/TracingSummit2018#Schedule [2]: https://tracingsummit.org/wiki/TracingSummit2018#Registration -- Francis Deslauriers Software developer EfficiOS inc. ___ lttng-dev mailing list lttng-dev@lists.lttng.org https://lists.lttng.org/cgi-bin/mailman/listinfo/lttng-dev
[lttng-dev] Tracing Summit 2018 - CFP extended until Sept. 10th
Hi all, To take into account that a lot of people are on vacations over the month of August, we are announcing the extension of the CFP for the Tracing Summit 2018 until Monday September 10th. This gives 6 more days to get your talk proposals in. Thank you to all of you who submitted talks. We received great ones! More info: https://tracingsummit.org/wiki/TracingSummit2018 Thank you, -- On behalf of the Diagnostic and Monitoring Workgroup, Francis Deslauriers ___ lttng-dev mailing list lttng-dev@lists.lttng.org https://lists.lttng.org/cgi-bin/mailman/listinfo/lttng-dev
[lttng-dev] [PATCH lttng-ust] Move symbol preventing unloading of probe providers
Issue = Calling dlclose on the probe provider library that first loaded __tracepoints__disable_destructors in the symbol table does not unregister the probes from the callsites as the destructors are not executed. The __tracepoints__disable_destructors weak symbol is exposed by probe providers, liblttng-ust.so and liblttng-ust-tracepoint.so libraries. If a probe provider is loaded first into the address space, its definition is bound to the symbol. All the subsequent loaded libraries using the symbol will use the existing definition of the symbol, thus creating a situation where liblttng-ust.so or liblttng-ust-tracepoint.so depend on the probe provider library. This prevents the dynamic loader from unloading the library as it is still in use by other libraries. Because of this, the execution of its destructors and the unregistration of the probes is postponed. Since the unregistration of the probes is postponed, event will be generate if the callsite is executed even though the probes should not be loaded. Solution To overcome this issue, we no longer expose this symbol in the tracepoint.h file to remove the explicit dependency of the probe provider on the symbol. We instead use the existing dlopen handle on liblttng-ust-tracepoint.so and use dlsym to get handles on functions that disable and get the state of the destructors. Version compatibility = - This change is backward compatible with UST applications and libraries built on lttng-ust version before 2.11. Those applications will use the __tracepoints__disable_destructors symbol that is now only exposed by the liblttng-ust-tracepoint.so library. This symbol is alway checked in 2.11 in case an old app is running. - Applications built with this change will also work in older versions of lttng-ust as there is a check to see if the new destructor state checking method should be used, if it should not we fallback to a compatibility method. To ensure compatibility in this case, we also look up and keep up to date the __tracepoints__disable_destructors value using the dlopen-dlsym combo. Signed-off-by: Francis Deslauriers --- include/lttng/tracepoint.h | 108 ++--- liblttng-ust/tracepoint.c | 40 + 2 files changed, 123 insertions(+), 25 deletions(-) diff --git a/include/lttng/tracepoint.h b/include/lttng/tracepoint.h index 39f2c4d..9b52bc6 100644 --- a/include/lttng/tracepoint.h +++ b/include/lttng/tracepoint.h @@ -226,21 +226,6 @@ struct lttng_ust_tracepoint_dlopen { extern struct lttng_ust_tracepoint_dlopen tracepoint_dlopen; extern struct lttng_ust_tracepoint_dlopen *tracepoint_dlopen_ptr; -/* Disable tracepoint destructors. */ -int __tracepoints__disable_destructors __attribute__((weak)); - -/* - * Programs that have threads that survive after they exit, and - * therefore call library destructors, should disable the tracepoint - * destructors by calling tracepoint_disable_destructors(). This will - * leak the tracepoint instrumentation library shared object, leaving - * its teardown to the operating system process teardown. - */ -static inline void tracepoint_disable_destructors(void) -{ - __tracepoints__disable_destructors = 1; -} - /* * These weak symbols, the constructor, and destructor take care of * registering only _one_ instance of the tracepoints per shared-ojbect @@ -265,6 +250,39 @@ struct lttng_ust_tracepoint_dlopen tracepoint_dlopen struct lttng_ust_tracepoint_dlopen *tracepoint_dlopen_ptr __attribute__((weak, visibility("hidden"))); +/* + * Tracepoint dynamic linkage handling (callbacks). Hidden visibility: shared + * across objects in a module/main executable. The callbacks are used to + * control and check if the destructors should be executed. + */ +struct lttng_ust_tracepoint_destructors_syms { + int *old_tracepoint_disable_destructors; + void (*tracepoint_disable_destructors)(void); + int (*tracepoint_get_destructors_state)(void); +}; + +extern struct lttng_ust_tracepoint_destructors_syms tracepoint_destructors_syms; +extern struct lttng_ust_tracepoint_destructors_syms *tracepoint_destructors_syms_ptr; + +struct lttng_ust_tracepoint_destructors_syms tracepoint_destructors_syms + __attribute__((weak, visibility("hidden"))); +struct lttng_ust_tracepoint_destructors_syms *tracepoint_destructors_syms_ptr + __attribute__((weak, visibility("hidden"))); + +static inline void tracepoint_disable_destructors(void) +{ + if (!tracepoint_dlopen_ptr) + tracepoint_dlopen_ptr = _dlopen; + if (!tracepoint_destructors_syms_ptr) + tracepoint_destructors_syms_ptr = _destructors_syms; + if (tracepoint_dlopen_ptr->liblttngust_handle + && tracepoint_destructors_syms_ptr->tracepoint_disable_destructors) { + tracepoint_destructors_syms_ptr->t
[lttng-dev] [CFP] Call For Presentations reminder and registration for Tracing Summit 2018 on Oct 25th in Edinburgh, UK
Hi all, This is a friendly reminder that the deadline for submitting talk proposals for Tracing Summit 2018[1] is coming up soon (Sept 1st). Submit you talk today using submiss...@tracingsummit.org and don't forget to include the following: - Talk title, - Talk abstract (900 characters maximum), - Description of the targeted audience (900 characters maximum), - Short biography (900 characters maximum). The Tracing Summit 2018 will be held in Edinburgh, UK on October 25th, 2018, at the Edinburgh International Conference Centre, co-located with the Open Source Summit & Embedded Linux Conference 2018. You can register right now either through the Open Source Summit Europe registration page[2] by adding the free Tracing Summit addon or by registering specifically for the Tracing Summit using this registration form[3]. Thank you, On behalf of the Diagnostic and Monitoring Workgroup, Francis Deslauriers [1] https://tracingsummit.org/wiki/TracingSummit2018 [2] https://www.regonline.com/OSSEU2018 [3] https://regonline.com/tracingsummit18 ___ lttng-dev mailing list lttng-dev@lists.lttng.org https://lists.lttng.org/cgi-bin/mailman/listinfo/lttng-dev
[lttng-dev] [CFP] Tracing Summit 2018 Call for Presentations, October 25th, 2018, Edinburgh, UK
Hi, This is a Call for Presentations for the Tracing Summit 2018 which will be held in Edinburgh, UK on October 25th, 2018, at the Edinburgh International Conference Centre, co-located with the Open Source Summit Europe & Embedded Linux Conference Europe. The Tracing Summit is single-day, single-track conference on the topic of tracing. The event focuses on the field of software and hardware tracing, gathering developers and end-users of tracing and trace analysis tools. The main goal of the Tracing Summit is to provide space for discussion between people of the various areas that benefit from tracing, namely parallel, distributed and/or real-time systems, as well as kernel development. We are welcoming 30 minutes presentations from both users and developers, on topics covering, but not limited to: * Investigation workflow of Real-Time, latency, and throughput issues, * Trace collection and extraction, * Trace filtering, * Trace aggregation, * Trace formats, * Tracing multi-core systems, * Trace abstraction, * Trace modeling, * Automated trace analysis (e.g. dependency analysis), * Tracing large clusters and distributed systems, * Hardware-level tracing (e.g. DSP, GPU, bare-metal), * Trace visualisation, * Interaction between debugging and tracing, * Tracing remote control, * Analysis of large trace datasets, * Cloud trace collection and analysis, * Integration between trace tools, * Live tracing & monitoring. Those can cover recently available technologies, ongoing work, and yet non-existing technologies (which are compellingly interesting to end-users). Please understand that this open forum is not the proper place to present sales or marketing pitches, nor technologies which are prevented from being freely used in open source. If you are interested in presenting, please submit a proposal to submiss...@tracingsummit.org before *September 1st, 2018, at 23:59 EST*. Please provide the following information: * Talk title, * Talk abstract, (900 characters maximum) * Description of the targeted audience (900 characters maximum), * Short biography (900 characters maximum). Attending the Tracing Summit is free of charge. More details on registration will be available shortly, be sure to checkout the Tracing Summit 2018 website for all the latest information on this topic: https://www.tracingsummit.org/wiki/TracingSummit2018 The Tracing Summit is organized by the Linux Foundation Diagnostic and Monitoring Workgroup (https://diamon.org). The Tracing Summit is sponsored by EfficiOS <https://www.efficios.com/>. Please let us know if your company is interested in sponsoring this event. Thank you, On behalf of the Diagnostic and Monitoring Workgroup, Francis Deslauriers & Mathieu Desnoyers ___ lttng-dev mailing list lttng-dev@lists.lttng.org https://lists.lttng.org/cgi-bin/mailman/listinfo/lttng-dev
[lttng-dev] [PATCH lttng-ust v4] Fix: destructors do not run on probe provider dlclose
Calling dlclose on the probe provider library that first loaded __tracepoints__disable_destructors in the symbol table does not unregister the probes from the callsites as the destructors are not executed. The __tracepoints__disable_destructors weak symbol is exposed by probe providers, liblttng-ust.so and liblttng-ust-tracepoint.so libraries. If a probe provider is loaded first into the address space, its definition is bound to the symbol. All the subsequent loaded libraries using the symbol will use the existing definition of the symbol, thus creating a situation where liblttng-ust.so or liblttng-ust-tracepoint.so depend on the probe provider library. This prevents the dynamic loader from unloading the library as it is still in use by other libraries. Because of this, the execution of its destructors and the unregistration of the probes is postponed. To overcome this issue, we no longer expose this symbol in the tracepoint.h file to remove the explicit dependency of the probe provider on the symbol. We instead use the existing dlopen handle on liblttng-ust-tracepoint.so to get handles on getter and setter functions for this value. Signed-off-by: Francis Deslauriers <francis.deslauri...@efficios.com> --- include/lttng/tracepoint.h | 82 +++--- liblttng-ust/tracepoint.c | 56 +++ 2 files changed, 119 insertions(+), 19 deletions(-) diff --git a/include/lttng/tracepoint.h b/include/lttng/tracepoint.h index 39f2c4d..d285347 100644 --- a/include/lttng/tracepoint.h +++ b/include/lttng/tracepoint.h @@ -226,21 +226,6 @@ struct lttng_ust_tracepoint_dlopen { extern struct lttng_ust_tracepoint_dlopen tracepoint_dlopen; extern struct lttng_ust_tracepoint_dlopen *tracepoint_dlopen_ptr; -/* Disable tracepoint destructors. */ -int __tracepoints__disable_destructors __attribute__((weak)); - -/* - * Programs that have threads that survive after they exit, and - * therefore call library destructors, should disable the tracepoint - * destructors by calling tracepoint_disable_destructors(). This will - * leak the tracepoint instrumentation library shared object, leaving - * its teardown to the operating system process teardown. - */ -static inline void tracepoint_disable_destructors(void) -{ - __tracepoints__disable_destructors = 1; -} - /* * These weak symbols, the constructor, and destructor take care of * registering only _one_ instance of the tracepoints per shared-ojbect @@ -265,6 +250,47 @@ struct lttng_ust_tracepoint_dlopen tracepoint_dlopen struct lttng_ust_tracepoint_dlopen *tracepoint_dlopen_ptr __attribute__((weak, visibility("hidden"))); +/* + * Tracepoint dynamic linkage handling (callbacks). Hidden visibility: shared + * across objects in a module/main executable. The callbacks are used to + * control and check if the destructors should be executed. + */ +struct lttng_ust_tracepoint_destructors_syms { + void (*tracepoint_enable_destructors)(void); + void (*tracepoint_disable_destructors)(void); + int (*tracepoint_get_destructors_state)(void); +}; + +extern struct lttng_ust_tracepoint_destructors_syms tracepoint_destructors_syms; +extern struct lttng_ust_tracepoint_destructors_syms *tracepoint_destructors_syms_ptr; + +struct lttng_ust_tracepoint_destructors_syms tracepoint_destructors_syms + __attribute__((weak, visibility("hidden"))); +struct lttng_ust_tracepoint_destructors_syms *tracepoint_destructors_syms_ptr + __attribute__((weak, visibility("hidden"))); + +static inline void tracepoint_disable_destructors(void) +{ + if (!tracepoint_dlopen_ptr) + tracepoint_dlopen_ptr = _dlopen; + if (!tracepoint_destructors_syms_ptr) + tracepoint_destructors_syms_ptr = _destructors_syms; + if (tracepoint_dlopen_ptr->liblttngust_handle + && tracepoint_destructors_syms_ptr->tracepoint_disable_destructors) + tracepoint_destructors_syms_ptr->tracepoint_disable_destructors(); +} + +static inline void tracepoint_enable_destructors(void) +{ + if (!tracepoint_dlopen_ptr) + tracepoint_dlopen_ptr = _dlopen; + if (!tracepoint_destructors_syms_ptr) + tracepoint_destructors_syms_ptr = _destructors_syms; + if (tracepoint_dlopen_ptr->liblttngust_handle + && tracepoint_destructors_syms_ptr->tracepoint_enable_destructors) + tracepoint_destructors_syms_ptr->tracepoint_enable_destructors(); +} + #ifndef _LGPL_SOURCE static inline void lttng_ust_notrace __tracepoint__init_urcu_sym(void); @@ -335,8 +361,11 @@ __tracepoints__destroy(void) return; if (!tracepoint_dlopen_ptr) tracepoint_dlopen_ptr = _dlopen; - if (!__tracepoints__disable_destructors - && tracepoi
[lttng-dev] [PATCH lttng-ust v3] Fix: destructors do not run on probe provider dlclose
Calling dlclose on the probe provider library that first loaded __tracepoints__disable_destructors in the symbol table does not unregister the probes from the callsites as the destructors are not executed. The __tracepoints__disable_destructors weak symbol is exposed by probe providers, liblttng-ust.so and liblttng-ust-tracepoint.so libraries. If a probe provider is loaded first into the address space, its definition is bound to the symbol. All the subsequent loaded libraries using the symbol will use the existing definition of the symbol, thus creating a situation where liblttng-ust.so or liblttng-ust-tracepoint.so depend on the probe provider library. This prevents the dynamic loader from unloading the library as it is still in use by other libraries. Because of this, the execution of its destructors and the unregistration of the probes is postponed. To overcome this issue, we no longer expose this symbol in the tracepoint.h file to remove the explicit dependency of the probe provider on the symbol. We instead use the existing dlopen handle on liblttng-ust-tracepoint.so to get handles on getter and setter functions for this value. Signed-off-by: Francis Deslauriers <francis.deslauri...@efficios.com> --- include/lttng/tracepoint.h | 82 +++--- liblttng-ust/tracepoint.c | 61 ++ 2 files changed, 124 insertions(+), 19 deletions(-) diff --git a/include/lttng/tracepoint.h b/include/lttng/tracepoint.h index 39f2c4d..d285347 100644 --- a/include/lttng/tracepoint.h +++ b/include/lttng/tracepoint.h @@ -226,21 +226,6 @@ struct lttng_ust_tracepoint_dlopen { extern struct lttng_ust_tracepoint_dlopen tracepoint_dlopen; extern struct lttng_ust_tracepoint_dlopen *tracepoint_dlopen_ptr; -/* Disable tracepoint destructors. */ -int __tracepoints__disable_destructors __attribute__((weak)); - -/* - * Programs that have threads that survive after they exit, and - * therefore call library destructors, should disable the tracepoint - * destructors by calling tracepoint_disable_destructors(). This will - * leak the tracepoint instrumentation library shared object, leaving - * its teardown to the operating system process teardown. - */ -static inline void tracepoint_disable_destructors(void) -{ - __tracepoints__disable_destructors = 1; -} - /* * These weak symbols, the constructor, and destructor take care of * registering only _one_ instance of the tracepoints per shared-ojbect @@ -265,6 +250,47 @@ struct lttng_ust_tracepoint_dlopen tracepoint_dlopen struct lttng_ust_tracepoint_dlopen *tracepoint_dlopen_ptr __attribute__((weak, visibility("hidden"))); +/* + * Tracepoint dynamic linkage handling (callbacks). Hidden visibility: shared + * across objects in a module/main executable. The callbacks are used to + * control and check if the destructors should be executed. + */ +struct lttng_ust_tracepoint_destructors_syms { + void (*tracepoint_enable_destructors)(void); + void (*tracepoint_disable_destructors)(void); + int (*tracepoint_get_destructors_state)(void); +}; + +extern struct lttng_ust_tracepoint_destructors_syms tracepoint_destructors_syms; +extern struct lttng_ust_tracepoint_destructors_syms *tracepoint_destructors_syms_ptr; + +struct lttng_ust_tracepoint_destructors_syms tracepoint_destructors_syms + __attribute__((weak, visibility("hidden"))); +struct lttng_ust_tracepoint_destructors_syms *tracepoint_destructors_syms_ptr + __attribute__((weak, visibility("hidden"))); + +static inline void tracepoint_disable_destructors(void) +{ + if (!tracepoint_dlopen_ptr) + tracepoint_dlopen_ptr = _dlopen; + if (!tracepoint_destructors_syms_ptr) + tracepoint_destructors_syms_ptr = _destructors_syms; + if (tracepoint_dlopen_ptr->liblttngust_handle + && tracepoint_destructors_syms_ptr->tracepoint_disable_destructors) + tracepoint_destructors_syms_ptr->tracepoint_disable_destructors(); +} + +static inline void tracepoint_enable_destructors(void) +{ + if (!tracepoint_dlopen_ptr) + tracepoint_dlopen_ptr = _dlopen; + if (!tracepoint_destructors_syms_ptr) + tracepoint_destructors_syms_ptr = _destructors_syms; + if (tracepoint_dlopen_ptr->liblttngust_handle + && tracepoint_destructors_syms_ptr->tracepoint_enable_destructors) + tracepoint_destructors_syms_ptr->tracepoint_enable_destructors(); +} + #ifndef _LGPL_SOURCE static inline void lttng_ust_notrace __tracepoint__init_urcu_sym(void); @@ -335,8 +361,11 @@ __tracepoints__destroy(void) return; if (!tracepoint_dlopen_ptr) tracepoint_dlopen_ptr = _dlopen; - if (!__tracepoints__disable_destructors - && tracepoi
[lttng-dev] [PATCH lttng-ust v2] Fix: destructors do not run on probe provider dlclose
Calling dlclose on the probe provider library that first loaded __tracepoints__disable_destructors in the symbol table does not unregister the probes from the callsites as the destructors are not executed. The __tracepoints__disable_destructors weak symbol is exposed by probe providers, liblttng-ust.so and liblttng-ust-tracepoint.so libraries. If a probe provider is loaded first into the address space, its definition is binded to the symbol. All the subsequent loaded libraries using the symbol will use the existing definition of the symbol, thus creating a situation where liblttng-ust.so or liblttng-ust-tracepoint.so depend on the probe provider library. This prevents the dynamic loader from unloading the library as it is still in use by other libraries. Because of this, the execution of its destructors and the unregistration of the probes is postponed. To overcome this issue, we no longer expose this symbol in the tracepoint.h file to remove the explicit dependency of the probe provider on the symbol. We instead use the existing dlopen handle on liblttng-ust-tracepoint.so to get handles on getter and setter functions for this value. Signed-off-by: Francis Deslauriers <francis.deslauri...@efficios.com> --- include/lttng/tracepoint.h | 82 +++--- liblttng-ust/tracepoint.c | 35 2 files changed, 98 insertions(+), 19 deletions(-) diff --git a/include/lttng/tracepoint.h b/include/lttng/tracepoint.h index 39f2c4d..d285347 100644 --- a/include/lttng/tracepoint.h +++ b/include/lttng/tracepoint.h @@ -226,21 +226,6 @@ struct lttng_ust_tracepoint_dlopen { extern struct lttng_ust_tracepoint_dlopen tracepoint_dlopen; extern struct lttng_ust_tracepoint_dlopen *tracepoint_dlopen_ptr; -/* Disable tracepoint destructors. */ -int __tracepoints__disable_destructors __attribute__((weak)); - -/* - * Programs that have threads that survive after they exit, and - * therefore call library destructors, should disable the tracepoint - * destructors by calling tracepoint_disable_destructors(). This will - * leak the tracepoint instrumentation library shared object, leaving - * its teardown to the operating system process teardown. - */ -static inline void tracepoint_disable_destructors(void) -{ - __tracepoints__disable_destructors = 1; -} - /* * These weak symbols, the constructor, and destructor take care of * registering only _one_ instance of the tracepoints per shared-ojbect @@ -265,6 +250,47 @@ struct lttng_ust_tracepoint_dlopen tracepoint_dlopen struct lttng_ust_tracepoint_dlopen *tracepoint_dlopen_ptr __attribute__((weak, visibility("hidden"))); +/* + * Tracepoint dynamic linkage handling (callbacks). Hidden visibility: shared + * across objects in a module/main executable. The callbacks are used to + * control and check if the destructors should be executed. + */ +struct lttng_ust_tracepoint_destructors_syms { + void (*tracepoint_enable_destructors)(void); + void (*tracepoint_disable_destructors)(void); + int (*tracepoint_get_destructors_state)(void); +}; + +extern struct lttng_ust_tracepoint_destructors_syms tracepoint_destructors_syms; +extern struct lttng_ust_tracepoint_destructors_syms *tracepoint_destructors_syms_ptr; + +struct lttng_ust_tracepoint_destructors_syms tracepoint_destructors_syms + __attribute__((weak, visibility("hidden"))); +struct lttng_ust_tracepoint_destructors_syms *tracepoint_destructors_syms_ptr + __attribute__((weak, visibility("hidden"))); + +static inline void tracepoint_disable_destructors(void) +{ + if (!tracepoint_dlopen_ptr) + tracepoint_dlopen_ptr = _dlopen; + if (!tracepoint_destructors_syms_ptr) + tracepoint_destructors_syms_ptr = _destructors_syms; + if (tracepoint_dlopen_ptr->liblttngust_handle + && tracepoint_destructors_syms_ptr->tracepoint_disable_destructors) + tracepoint_destructors_syms_ptr->tracepoint_disable_destructors(); +} + +static inline void tracepoint_enable_destructors(void) +{ + if (!tracepoint_dlopen_ptr) + tracepoint_dlopen_ptr = _dlopen; + if (!tracepoint_destructors_syms_ptr) + tracepoint_destructors_syms_ptr = _destructors_syms; + if (tracepoint_dlopen_ptr->liblttngust_handle + && tracepoint_destructors_syms_ptr->tracepoint_enable_destructors) + tracepoint_destructors_syms_ptr->tracepoint_enable_destructors(); +} + #ifndef _LGPL_SOURCE static inline void lttng_ust_notrace __tracepoint__init_urcu_sym(void); @@ -335,8 +361,11 @@ __tracepoints__destroy(void) return; if (!tracepoint_dlopen_ptr) tracepoint_dlopen_ptr = _dlopen; - if (!__tracepoints__disable_destructors - && tracepoint_dlopen_ptr->liblttngust_handle + if (
[lttng-dev] [PATCH lttng-ust] Fix: destructors do not run on probe provider dlclose
Calling dlclose on a probe provider library does not unregister the probes from the callsites as the destructors are not executed. The __tracepoints__disable_destructors weak symbol was exposed by probe providers, liblttng-ust.so and liblttng-ust-tracepoint.so libraries. If a probe provider was loaded first into the address space, its definition would be binded to the symbol. All the subsequent libraries using the symbol would use the existing definition of the symbol. Thus creating a a situation where liblttng-ust.so or liblttng-ust-tracepoint.so would have a dependency on the probe provider library. This was preventing the dynamic loader from unloading the library as it was still in use by other libraries. Because of this, the execution of its destructors and the unregistration of the probes was postponed. To overcome this issue, we no longer expose this symbol in the tracepoint.h file to remove the explicit dependency of the probe provider on the symbol. We instead use the existing dlopen handle on liblttng-ust-tracepoint.so to get an handle on a getter and setter functions for this value. Signed-off-by: Francis Deslauriers <francis.deslauri...@efficios.com> --- include/lttng/tracepoint.h | 31 ++- liblttng-ust/tracepoint.c | 26 ++ 2 files changed, 40 insertions(+), 17 deletions(-) diff --git a/include/lttng/tracepoint.h b/include/lttng/tracepoint.h index 39f2c4d..95f5de9 100644 --- a/include/lttng/tracepoint.h +++ b/include/lttng/tracepoint.h @@ -221,26 +221,13 @@ struct lttng_ust_tracepoint_dlopen { void (*rcu_read_lock_sym_bp)(void); void (*rcu_read_unlock_sym_bp)(void); void *(*rcu_dereference_sym_bp)(void *p); + void (*tracepoint_set_destructors_disabled)(int is_disabled); + int (*tracepoint_get_destructors_disabled)(void); }; extern struct lttng_ust_tracepoint_dlopen tracepoint_dlopen; extern struct lttng_ust_tracepoint_dlopen *tracepoint_dlopen_ptr; -/* Disable tracepoint destructors. */ -int __tracepoints__disable_destructors __attribute__((weak)); - -/* - * Programs that have threads that survive after they exit, and - * therefore call library destructors, should disable the tracepoint - * destructors by calling tracepoint_disable_destructors(). This will - * leak the tracepoint instrumentation library shared object, leaving - * its teardown to the operating system process teardown. - */ -static inline void tracepoint_disable_destructors(void) -{ - __tracepoints__disable_destructors = 1; -} - /* * These weak symbols, the constructor, and destructor take care of * registering only _one_ instance of the tracepoints per shared-ojbect @@ -335,7 +322,8 @@ __tracepoints__destroy(void) return; if (!tracepoint_dlopen_ptr) tracepoint_dlopen_ptr = _dlopen; - if (!__tracepoints__disable_destructors + if (tracepoint_dlopen_ptr->tracepoint_get_destructors_disabled + && !tracepoint_dlopen_ptr->tracepoint_get_destructors_disabled() && tracepoint_dlopen_ptr->liblttngust_handle && !__tracepoint_ptrs_registered) { ret = dlclose(tracepoint_dlopen_ptr->liblttngust_handle); @@ -423,6 +411,14 @@ __tracepoints__ptrs_init(void) URCU_FORCE_CAST(int (*)(struct lttng_ust_tracepoint * const *), dlsym(tracepoint_dlopen_ptr->liblttngust_handle, "tracepoint_unregister_lib")); + tracepoint_dlopen_ptr->tracepoint_set_destructors_disabled = + URCU_FORCE_CAST(void (*)(int), + dlsym(tracepoint_dlopen_ptr->liblttngust_handle, + "tracepoint_set_destructors_disabled")); + tracepoint_dlopen_ptr->tracepoint_get_destructors_disabled = + URCU_FORCE_CAST(int (*)(void), + dlsym(tracepoint_dlopen_ptr->liblttngust_handle, + "tracepoint_get_destructors_disabled")); __tracepoint__init_urcu_sym(); if (tracepoint_dlopen_ptr->tracepoint_register_lib) { tracepoint_dlopen_ptr->tracepoint_register_lib(__start___tracepoints_ptrs, @@ -444,7 +440,8 @@ __tracepoints__ptrs_destroy(void) tracepoint_dlopen_ptr = _dlopen; if (tracepoint_dlopen_ptr->tracepoint_unregister_lib) tracepoint_dlopen_ptr->tracepoint_unregister_lib(__start___tracepoints_ptrs); - if (!__tracepoints__disable_destructors + if (tracepoint_dlopen_ptr->tracepoint_get_destructors_disabled + && !tracepoint_dlopen_ptr->tracepoint_get_destructors_disabled() && tracepoint_dlopen_ptr->liblttngust_handle
[lttng-dev] [PATCH lttng-tools v2 5/5] Tests: add duplicated providers tests
Signed-off-by: Francis Deslauriers <francis.deslauri...@efficios.com> --- configure.ac| 1 + tests/fast_regression | 1 + tests/regression/ust/multi-lib/Makefile.am | 114 +++ tests/regression/ust/multi-lib/README | 21 ++ tests/regression/ust/multi-lib/callsites.c | 34 +++ tests/regression/ust/multi-lib/callsites.h | 21 ++ tests/regression/ust/multi-lib/multi-lib-test.c | 251 +++ tests/regression/ust/multi-lib/probes.c | 18 ++ tests/regression/ust/multi-lib/probes.h | 195 ++ tests/regression/ust/multi-lib/test_multi_lib | 262 10 files changed, 918 insertions(+) create mode 100644 tests/regression/ust/multi-lib/Makefile.am create mode 100644 tests/regression/ust/multi-lib/README create mode 100644 tests/regression/ust/multi-lib/callsites.c create mode 100644 tests/regression/ust/multi-lib/callsites.h create mode 100644 tests/regression/ust/multi-lib/multi-lib-test.c create mode 100644 tests/regression/ust/multi-lib/probes.c create mode 100644 tests/regression/ust/multi-lib/probes.h create mode 100755 tests/regression/ust/multi-lib/test_multi_lib diff --git a/configure.ac b/configure.ac index b6ea39c..e22872c 100644 --- a/configure.ac +++ b/configure.ac @@ -1090,6 +1090,7 @@ AC_CONFIG_FILES([ tests/regression/ust/buffers-pid/Makefile tests/regression/ust/periodical-metadata-flush/Makefile tests/regression/ust/multi-session/Makefile + tests/regression/ust/multi-lib/Makefile tests/regression/ust/overlap/Makefile tests/regression/ust/overlap/demo/Makefile tests/regression/ust/linking/Makefile diff --git a/tests/fast_regression b/tests/fast_regression index bbce068..f76b53d 100644 --- a/tests/fast_regression +++ b/tests/fast_regression @@ -21,6 +21,7 @@ regression/tools/regen-statedump/test_ust regression/ust/before-after/test_before_after regression/ust/buffers-pid/test_buffers_pid regression/ust/multi-session/test_multi_session +regression/ust/multi-lib/test_multi_lib regression/ust/nprocesses/test_nprocesses regression/ust/overlap/test_overlap regression/ust/java-jul/test_java_jul diff --git a/tests/regression/ust/multi-lib/Makefile.am b/tests/regression/ust/multi-lib/Makefile.am new file mode 100644 index 000..f78ce7f --- /dev/null +++ b/tests/regression/ust/multi-lib/Makefile.am @@ -0,0 +1,114 @@ +noinst_SCRIPTS = test_multi_lib +noinst_PROGRAMS = exec-with-callsites exec-without-callsites + +exec_with_callsites_SOURCES = multi-lib-test.c callsites.c +exec_with_callsites_LDFLAGS = -ldl -lpopt +exec_with_callsites_CFLAGS = -DHAS_CALLSITES=1 + +exec_without_callsites_SOURCES = multi-lib-test.c +exec_without_callsites_LDFLAGS = -ldl -lpopt -llttng-ust +exec_without_callsites_LDADD = probes.o +exec_without_callsites_CFLAGS = -DHAS_CALLSITES=0 + +PROBES_SRC=probes.c probes.h +PROBES_LDF=-shared -module -llttng-ust -avoid-version -rpath $(abs_builddir)/.libs/ +PROBES_CF=-c -I$(srcdir)/ + +probes.o: probes.c probes.h + $(CC) $(PROBES_CF) -o $@ $< + +noinst_LTLIBRARIES = libprobes_a.la libprobes_a_prime.la \ + libprobes_b.la libprobes_c.la libprobes_c_prime.la \ + libprobes_d.la libprobes_e.la libprobes_f.la \ + libprobes_g.la libprobes_h.la libprobes_i.la \ + libprobes_j.la libprobes_k.la libprobes_l.la \ + libprobes_m.la libprobes_n.la libprobes_o.la \ + libprobes_p.la + +noinst_LTLIBRARIES += libcallsites_1.la libcallsites_2.la + +CALLSITES_SRC=callsites.c callsites.h +CALLSITES_LDF=-shared -module -llttng-ust -avoid-version -rpath $(abs_builddir)/.libs/ +CALLSITES_CF=-c -I. + +libprobes_a_la_SOURCES = $(PROBES_SRC) +libprobes_a_la_LDFLAGS = $(PROBES_LDF) +libprobes_a_la_CFLAGS = $(PROBES_CF) -DACTIVATE_PROBES_A + +libprobes_a_prime_la_SOURCES = $(PROBES_SRC) +libprobes_a_prime_la_LDFLAGS = $(PROBES_LDF) +libprobes_a_prime_la_CFLAGS = $(PROBES_CF) -DACTIVATE_PROBES_A + +libprobes_b_la_SOURCES = $(PROBES_SRC) +libprobes_b_la_LDFLAGS = $(PROBES_LDF) +libprobes_b_la_CFLAGS = $(PROBES_CF) -DACTIVATE_PROBES_B + +libprobes_c_la_SOURCES = $(PROBES_SRC) +libprobes_c_la_LDFLAGS = $(PROBES_LDF) +libprobes_c_la_CFLAGS = $(PROBES_CF) -DACTIVATE_PROBES_C + +libprobes_c_prime_la_SOURCES = $(PROBES_SRC) +libprobes_c_prime_la_LDFLAGS = $(PROBES_LDF) +libprobes_c_prime_la_CFLAGS = $(PROBES_CF) -DACTIVATE_PROBES_C + +libprobes_d_la_SOURCES = $(PROBES_SRC) +libprobes_d_la_LDFLAGS = $(PROBES_LDF) +libprobes_d_la_CFLAGS = $(PROBES_CF) -DACTIVATE_PROBES_D + +libprobes_e_la_SOURCES = $(PROBES_SRC) +libprobes_e_la_LDFLAGS = $(PROBES_LDF) +libprobes_e_la_CFLAGS = $(PROBES_CF) -DACTIVATE_PROBES_E + +libprobes_f_la_SOURCES = $(PROBES_SRC) +libprobes_f_la_LDFLAGS = $(PROBES_LDF) +libprobes_f_la_CFLAGS = $(PROBES_CF) -DACTIVATE
[lttng-dev] [PATCH lttng-tools v2 0/5] Support probes with the same name but different event payload
This patch set allows for multiple probes with the same name to be hooked on the same callsite. Right now, the Session Daemon only considers the name and signature of the events to determine if two events are identical. This could lead to trace corruptions when two probes would have the same name and signature but really different binary trace layouts. We now compare probes by doing a deep compare of every field. If two events are _exactly_ the same and have the same metadata then the same event ID will be used, if they are different a new event ID is created. When used with its corresponding UST patch set[1], it allows for dynamic library upgrade scenarios during tracing. The user can now dlopen a new version of a provider library and dlclose an old version without restarting the process. This patch set also includes regression tests for both the deep comparaison and the newly added dlclose capability. [1]: https://github.com/frdeso/lttng-ust/tree/dlclose-support Francis Deslauriers (5): Fix: probes should be compared strictly by events metadata Fix: calling ht_{hash, match}_enum with wrong argument Tests: allow the use of regular expressions to match events Tests: add function to validate the number of an event name in metadata Tests: add duplicated providers tests configure.ac| 1 + src/bin/lttng-sessiond/Makefile.am | 3 +- src/bin/lttng-sessiond/ust-field-utils.c| 289 src/bin/lttng-sessiond/ust-field-utils.h| 29 +++ src/bin/lttng-sessiond/ust-registry.c | 46 +++- tests/fast_regression | 1 + tests/regression/ust/multi-lib/Makefile.am | 114 ++ tests/regression/ust/multi-lib/README | 21 ++ tests/regression/ust/multi-lib/callsites.c | 34 +++ tests/regression/ust/multi-lib/callsites.h | 21 ++ tests/regression/ust/multi-lib/multi-lib-test.c | 251 tests/regression/ust/multi-lib/probes.c | 18 ++ tests/regression/ust/multi-lib/probes.h | 195 tests/regression/ust/multi-lib/test_multi_lib | 262 + tests/unit/Makefile.am | 1 + tests/utils/utils.sh| 27 ++- 16 files changed, 1299 insertions(+), 14 deletions(-) create mode 100644 src/bin/lttng-sessiond/ust-field-utils.c create mode 100644 src/bin/lttng-sessiond/ust-field-utils.h create mode 100644 tests/regression/ust/multi-lib/Makefile.am create mode 100644 tests/regression/ust/multi-lib/README create mode 100644 tests/regression/ust/multi-lib/callsites.c create mode 100644 tests/regression/ust/multi-lib/callsites.h create mode 100644 tests/regression/ust/multi-lib/multi-lib-test.c create mode 100644 tests/regression/ust/multi-lib/probes.c create mode 100644 tests/regression/ust/multi-lib/probes.h create mode 100755 tests/regression/ust/multi-lib/test_multi_lib -- 2.7.4 ___ lttng-dev mailing list lttng-dev@lists.lttng.org https://lists.lttng.org/cgi-bin/mailman/listinfo/lttng-dev
[lttng-dev] [PATCH lttng-tools v2 3/5] Tests: allow the use of regular expressions to match events
Signed-off-by: Francis Deslauriers <francis.deslauri...@efficios.com> --- tests/utils/utils.sh | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tests/utils/utils.sh b/tests/utils/utils.sh index e8dfcda..9bf1fcc 100644 --- a/tests/utils/utils.sh +++ b/tests/utils/utils.sh @@ -1457,7 +1457,7 @@ function validate_trace_exp() which $BABELTRACE_BIN >/dev/null skip $? -ne 0 "Babeltrace binary not found. Skipping trace validation" - traced=$($BABELTRACE_BIN $trace_path 2>/dev/null | grep ${event_exp} | wc -l) + traced=$($BABELTRACE_BIN $trace_path 2>/dev/null | grep --extended-regexp ${event_exp} | wc -l) if [ "$traced" -ne 0 ]; then pass "Validate trace for expression '${event_exp}', $traced events" else @@ -1476,7 +1476,7 @@ function validate_trace_only_exp() which $BABELTRACE_BIN >/dev/null skip $? -ne 0 "Babeltrace binary not found. Skipping trace matches" - local count=$($BABELTRACE_BIN $trace_path | grep ${event_exp} | wc -l) + local count=$($BABELTRACE_BIN $trace_path | grep --extended-regexp ${event_exp} | wc -l) local total=$($BABELTRACE_BIN $trace_path | wc -l) if [ "$count" -ne 0 ] && [ "$total" -eq "$count" ]; then -- 2.7.4 ___ lttng-dev mailing list lttng-dev@lists.lttng.org https://lists.lttng.org/cgi-bin/mailman/listinfo/lttng-dev
[lttng-dev] [PATCH lttng-tools v2 1/5] Fix: probes should be compared strictly by events metadata
Currently, events are compared using names and signatures. Events with different payloads but identical name and signatures could lead to corrupted trace because the Session Daemon would consider them identical and give them the same event ID. Events should be compared using the name, loglevel, fields and model_emf_uri to ensure that their respective metadata is the same. Signed-off-by: Francis Deslauriers <francis.deslauri...@efficios.com> --- src/bin/lttng-sessiond/Makefile.am | 3 +- src/bin/lttng-sessiond/ust-field-utils.c | 289 +++ src/bin/lttng-sessiond/ust-field-utils.h | 29 src/bin/lttng-sessiond/ust-registry.c| 42 - tests/unit/Makefile.am | 1 + 5 files changed, 354 insertions(+), 10 deletions(-) create mode 100644 src/bin/lttng-sessiond/ust-field-utils.c create mode 100644 src/bin/lttng-sessiond/ust-field-utils.h diff --git a/src/bin/lttng-sessiond/Makefile.am b/src/bin/lttng-sessiond/Makefile.am index 413fe75..6fc1809 100644 --- a/src/bin/lttng-sessiond/Makefile.am +++ b/src/bin/lttng-sessiond/Makefile.am @@ -40,7 +40,8 @@ lttng_sessiond_SOURCES = utils.c utils.h \ if HAVE_LIBLTTNG_UST_CTL lttng_sessiond_SOURCES += trace-ust.c ust-registry.c ust-app.c \ ust-consumer.c ust-consumer.h ust-thread.c \ - ust-metadata.c ust-clock.h agent-thread.c agent-thread.h + ust-metadata.c ust-clock.h agent-thread.c agent-thread.h \ + ust-field-utils.h ust-field-utils.c endif # Add main.c at the end for compile order diff --git a/src/bin/lttng-sessiond/ust-field-utils.c b/src/bin/lttng-sessiond/ust-field-utils.c new file mode 100644 index 000..8388052 --- /dev/null +++ b/src/bin/lttng-sessiond/ust-field-utils.c @@ -0,0 +1,289 @@ +/* + * Copyright (C) 2018 - Francis Deslauriers <francis.deslauri...@efficios.com> + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License, version 2 only, as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License along with + * this program; if not, write to the Free Software Foundation, Inc., 51 + * Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + */ + +#include +#include + +#include "ust-field-utils.h" + +/* + * The ustctl_field is made of a combination of C basic types + * ustctl_basic_type and _ustctl_basic_type. + * + * ustctl_basic_type contains an enumeration describing the abstract type. + * _ustctl_basic_type does _NOT_ contain an enumeration describing the + * abstract type. + * + * A layer is needed to use the same code for both structures. + * When dealing with _ustctl_basic_type, we need to use the abstract type of + * the ustctl_type struct. + */ + +/* + * Compare two ustctl_integer_type fields. + * Returns 1 if both are identical. + */ +static bool match_ustctl_field_integer(struct ustctl_integer_type *first, + struct ustctl_integer_type *second) +{ + if (first->size != second->size) { + goto no_match; + } + if (first->alignment != second->alignment) { + goto no_match; + } + if (first->signedness != second->signedness) { + goto no_match; + } + if (first->encoding != second->encoding) { + goto no_match; + } + if (first->base != second->base) { + goto no_match; + } + if (first->reverse_byte_order != second->reverse_byte_order) { + goto no_match; + } + + return true; + +no_match: + return false; +} + +/* + * Compare two _ustctl_basic_type fields known to be of type integer. + * Returns 1 if both are identical. + */ +static bool match_ustctl_field_integer_from_raw_basic_type( + union _ustctl_basic_type *first, union _ustctl_basic_type *second) +{ + return match_ustctl_field_integer(>integer, >integer); +} + +/* + * Compare two _ustctl_basic_type fields known to be of type enum. + * Returns 1 if both are identical. + */ +static bool match_ustctl_field_enum_from_raw_basic_type( + union _ustctl_basic_type *first, union _ustctl_basic_type *second) +{ + /* +* Compare enumeration ID. Enumeration ID is provided to the application by +* the session daemon before event registration. +*/ + if (first->enumeration.id != second->enumeration.id) { + goto no_match; + } + + /* +* Sanity check of the name and container
[lttng-dev] [PATCH lttng-tools v2 2/5] Fix: calling ht_{hash, match}_enum with wrong argument
ht_hash_enum and ht_match_enum are currently called with the address of the pointer to a ust_registry_enum rather than the expected pointer to a ust_registry_enum. This means that those function calls would end up using garbage for hashing and comparing. Signed-off-by: Francis Deslauriers <francis.deslauri...@efficios.com> --- src/bin/lttng-sessiond/ust-registry.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/bin/lttng-sessiond/ust-registry.c b/src/bin/lttng-sessiond/ust-registry.c index a875515..19bd30f 100644 --- a/src/bin/lttng-sessiond/ust-registry.c +++ b/src/bin/lttng-sessiond/ust-registry.c @@ -558,8 +558,8 @@ struct ust_registry_enum * struct lttng_ht_iter iter; cds_lfht_lookup(session->enums->ht, - ht_hash_enum((void *) _enum_lookup, lttng_ht_seed), - ht_match_enum, _enum_lookup, ); + ht_hash_enum((void *) reg_enum_lookup, lttng_ht_seed), + ht_match_enum, reg_enum_lookup, ); node = lttng_ht_iter_get_node_str(); if (!node) { goto end; -- 2.7.4 ___ lttng-dev mailing list lttng-dev@lists.lttng.org https://lists.lttng.org/cgi-bin/mailman/listinfo/lttng-dev
[lttng-dev] [PATCH lttng-tools v2 4/5] Tests: add function to validate the number of an event name in metadata
Signed-off-by: Francis Deslauriers <francis.deslauri...@efficios.com> --- tests/utils/utils.sh | 23 +++ 1 file changed, 23 insertions(+) diff --git a/tests/utils/utils.sh b/tests/utils/utils.sh index 9bf1fcc..60df376 100644 --- a/tests/utils/utils.sh +++ b/tests/utils/utils.sh @@ -1343,6 +1343,29 @@ function add_context_kernel_fail() add_context_lttng 1 -k "$@" } +function validate_metadata_event () +{ + local event_name=$1 + local nr_event_id=$2 + local trace_path=$3 + + local metadata_file=$(find $trace_path | grep metadata) + local metadata_path=$(dirname $metadata_file) + + which $BABELTRACE_BIN >/dev/null + skip $? -ne 0 "Babeltrace binary not found. Skipping trace matches" + + local count=$($BABELTRACE_BIN --output-format=ctf-metadata $metadata_path | grep $event_name | wc -l) + + if [ "$count" -ne "$nr_event_id" ]; then + fail "Metadata match with the metadata of $count event(s) named $event_name" + diag "$count matching event id found in metadata" + else + pass "Metadata match with the metadata of $count event(s) named $event_name" + fi + +} + function trace_matches () { local event_name=$1 -- 2.7.4 ___ lttng-dev mailing list lttng-dev@lists.lttng.org https://lists.lttng.org/cgi-bin/mailman/listinfo/lttng-dev
[lttng-dev] [PATCH lttng-ust v2 2/6] Cleanup: Move version numbers in separate variables in configure script
Signed-off-by: Francis Deslauriers <francis.deslauri...@efficios.com> --- configure.ac | 6 +- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/configure.ac b/configure.ac index fb2f278..b0b4157 100644 --- a/configure.ac +++ b/configure.ac @@ -20,7 +20,11 @@ AC_SUBST([PATCHLEVEL_VERSION], [V_PATCH]) # Following the numbering scheme proposed by libtool for the library version # http://www.gnu.org/software/libtool/manual/html_node/Updating-version-info.html # This is the library version of liblttng-ust. -AC_SUBST([LTTNG_UST_LIBRARY_VERSION], [0:0:0]) +m4_define([UST_LIB_V_MAJOR], [0]) +m4_define([UST_LIB_V_MINOR], [0]) +m4_define([UST_LIB_V_PATCH], [0]) + +AC_SUBST([LTTNG_UST_LIBRARY_VERSION], [UST_LIB_V_MAJOR:UST_LIB_V_MINOR:UST_LIB_V_PATCH]) # note: remember to update tracepoint.h dlopen() to match this version # number. TODO: eventually automate by exporting the major number. -- 2.7.4 ___ lttng-dev mailing list lttng-dev@lists.lttng.org https://lists.lttng.org/cgi-bin/mailman/listinfo/lttng-dev
[lttng-dev] [PATCH lttng-ust v2 4/6] Manually dlopen() liblttng-ust.so to prevent unloading
The support of probe provider dlclose() allows for the following problematic scenario: - Application is not linked against the liblttng-ust.so - Application dlopen() a probe provider library that is linked against liblttng-ust.so - Application dlclose() the probe provider In this scenario, the probe provider has a dependency on liblttng-ust.so, so when it's loaded by the application, liblttng-ust.so is loaded too. The probe provider library now has the only reference to the liblttng-ust.so library. When the application calls dlclose() on it, all its references are dropped, thus triggering the unloading of both the probe provider library and liblttng-ust.so. This scenario is problematic because lttng ust_listener_threads are in DETACHED state. We cannot join them and therefore we cannot unload the library containing the code they run. Only the operating system can free those resources. The reason why those threads are in DETACHED state is to quickly teardown applications on process exit. A possible solution to investigate: if we can determine whether liblttng-ust.so is being dlopen (directly or undirectly) or it's linked against the application, we could set the detached state accordingly. To prevent that unloading, we pin it in memory by grabbing an extra reference on the library, with a RTLD_NODELETE flag. This will prevent the dynamic loader from ever removing the liblttng-ust.so library from the process' address space. Signed-off-by: Francis Deslauriers <francis.deslauri...@efficios.com> --- v2: Rephrase commit message and comment --- configure.ac | 1 + liblttng-ust/Makefile.am | 2 ++ liblttng-ust/lttng-ust-comm.c | 25 + 3 files changed, 28 insertions(+) diff --git a/configure.ac b/configure.ac index b0b4157..4fc6f9c 100644 --- a/configure.ac +++ b/configure.ac @@ -25,6 +25,7 @@ m4_define([UST_LIB_V_MINOR], [0]) m4_define([UST_LIB_V_PATCH], [0]) AC_SUBST([LTTNG_UST_LIBRARY_VERSION], [UST_LIB_V_MAJOR:UST_LIB_V_MINOR:UST_LIB_V_PATCH]) +AC_SUBST([LTTNG_UST_LIBRARY_VERSION_MAJOR], [UST_LIB_V_MAJOR]) # note: remember to update tracepoint.h dlopen() to match this version # number. TODO: eventually automate by exporting the major number. diff --git a/liblttng-ust/Makefile.am b/liblttng-ust/Makefile.am index 982be69..a7edfd5 100644 --- a/liblttng-ust/Makefile.am +++ b/liblttng-ust/Makefile.am @@ -60,6 +60,8 @@ liblttng_ust_runtime_la_SOURCES = \ string-utils.c \ string-utils.h +liblttng_ust_runtime_la_CFLAGS = -DLTTNG_UST_LIBRARY_VERSION_MAJOR=\"$(LTTNG_UST_LIBRARY_VERSION_MAJOR)\" + if HAVE_PERF_EVENT liblttng_ust_runtime_la_SOURCES += \ lttng-context-perf-counters.c \ diff --git a/liblttng-ust/lttng-ust-comm.c b/liblttng-ust/lttng-ust-comm.c index 511b9cf..57e5ce6 100644 --- a/liblttng-ust/lttng-ust-comm.c +++ b/liblttng-ust/lttng-ust-comm.c @@ -27,6 +27,7 @@ #include #include #include +#include #include #include #include @@ -59,6 +60,9 @@ #include "../libringbuffer/getcpu.h" #include "getenv.h" +/* Concatenate lttng ust shared library name with its major version number. */ +#define LTTNG_UST_LIB_SO_NAME "liblttng-ust.so." LTTNG_UST_LIBRARY_VERSION_MAJOR + /* * Has lttng ust comm constructor been called ? */ @@ -1648,6 +1652,7 @@ void __attribute__((constructor)) lttng_ust_init(void) pthread_attr_t thread_attr; int timeout_mode; int ret; + void *handle; if (uatomic_xchg(, 1) == 1) return; @@ -1662,6 +1667,26 @@ void __attribute__((constructor)) lttng_ust_init(void) lttng_ust_loaded = 1; /* +* We need to ensure that the liblttng-ust library is not unloaded to avoid +* the unloading of code used by the ust_listener_threads as we can not +* reliably know when they exited. To do that, manually load +* liblttng-ust.so to increment the dynamic loader's internal refcount for +* this library so it never becomes zero, thus never gets unloaded from the +* address space of the process. Since we are already running in the +* constructor of the LTTNG_UST_LIB_SO_NAME library, calling dlopen will +* simply increment the refcount and no additionnal work is needed by the +* dynamic loader as the shared library is already loaded in the address +* space. As a safe guard, we use the RTLD_NODELETE flag to prevent +* unloading of the UST library if its refcount becomes zero (which should +* never happen). Do the return value check but discard the handle at the +* end of the function as it's not needed. +*/ + handle = dlopen(LTTNG_UST_LIB_SO_NAME, RTLD_LAZY | RTLD_NODELETE); + if (!handle) { + ERR("dlopen of liblttng-ust shared library (%s).", LTTNG_UST_LIB_SO_NAME); + } + + /* * We want precise control over the
[lttng-dev] [PATCH lttng-ust v2 0/6] Support provider duplicates and unloading
This patch set adds the support for duplicated probe providers and support for unloading probe providers using dlclose(). It allows to advance scenarios where probe providers can be upgraded during tracing. For example, during tracing the user could dlopen() a new version of a probe provider and dlclose() the previous one. All this without stop tracing. A patch set for lttng-tools project is necessary to take advantage of those changes. The lttng-tools changes can be found on this branch of my Github fork: https://github.com/frdeso/lttng-tools/commits/multi-lib-support Francis Deslauriers (5): Cleanup: Move version numbers in separate variables in configure script Add probe provider unregister function Manually dlopen() liblttng-ust.so to prevent unloading Rename lttng_ust_enum_get to lttng_ust_enum_get_from_desc Support unloading of probe providers Mathieu Desnoyers (1): Remove duplicate provider name checks configure.ac | 7 +- include/lttng/ust-events.h | 6 +- include/lttng/ust-tracepoint-event.h | 2 +- liblttng-ust-comm/lttng-ust-comm.c | 3 +- liblttng-ust/Makefile.am | 2 + liblttng-ust/lttng-events.c | 135 ++- liblttng-ust/lttng-probes.c | 28 ++-- liblttng-ust/lttng-ust-comm.c| 25 +++ liblttng-ust/tracepoint.c| 43 --- liblttng-ust/ust-core.c | 11 ++- 10 files changed, 199 insertions(+), 63 deletions(-) -- 2.7.4 ___ lttng-dev mailing list lttng-dev@lists.lttng.org https://lists.lttng.org/cgi-bin/mailman/listinfo/lttng-dev
[lttng-dev] [PATCH lttng-ust v2 5/6] Rename lttng_ust_enum_get to lttng_ust_enum_get_from_desc
Change the prototype to take a descriptor instead of a char *. Now that provider names can have duplicates enum names are not necessarily unique. Signed-off-by: Francis Deslauriers <francis.deslauri...@efficios.com> --- include/lttng/ust-events.h | 5 +++-- liblttng-ust-comm/lttng-ust-comm.c | 3 +-- liblttng-ust/lttng-events.c| 14 ++ liblttng-ust/ust-core.c| 11 +-- 4 files changed, 15 insertions(+), 18 deletions(-) diff --git a/include/lttng/ust-events.h b/include/lttng/ust-events.h index 019b0eb..8673350 100644 --- a/include/lttng/ust-events.h +++ b/include/lttng/ust-events.h @@ -731,8 +731,9 @@ int lttng_session_active(void); typedef int (*t_statedump_func_ptr)(struct lttng_session *session); void lttng_handle_pending_statedump(void *owner); struct cds_list_head *_lttng_get_sessions(void); -struct lttng_enum *lttng_ust_enum_get(struct lttng_session *session, - const char *enum_name); + +struct lttng_enum *lttng_ust_enum_get_from_desc(struct lttng_session *session, + const struct lttng_enum_desc *enum_desc); void lttng_ust_dl_update(void *ip); void lttng_ust_fixup_fd_tracker_tls(void); diff --git a/liblttng-ust-comm/lttng-ust-comm.c b/liblttng-ust-comm/lttng-ust-comm.c index 9fe6d28..d95e31d 100644 --- a/liblttng-ust-comm/lttng-ust-comm.c +++ b/liblttng-ust-comm/lttng-ust-comm.c @@ -874,8 +874,7 @@ int serialize_basic_type(struct lttng_session *session, if (session) { const struct lttng_enum *_enum; - _enum = lttng_ust_enum_get(session, - lbt->enumeration.desc->name); + _enum = lttng_ust_enum_get_from_desc(session, lbt->enumeration.desc); if (!_enum) return -EINVAL; ubt->enumeration.id = _enum->id; diff --git a/liblttng-ust/lttng-events.c b/liblttng-ust/lttng-events.c index 57eb6f7..e130ec6 100644 --- a/liblttng-ust/lttng-events.c +++ b/liblttng-ust/lttng-events.c @@ -257,21 +257,19 @@ int lttng_enum_create(const struct lttng_enum_desc *desc, const char *enum_name = desc->name; struct lttng_enum *_enum; struct cds_hlist_head *head; - struct cds_hlist_node *node; int ret = 0; size_t name_len = strlen(enum_name); uint32_t hash; int notify_socket; + /* Check if this enum is already registered for this session. */ hash = jhash(enum_name, name_len, 0); head = >enums_ht.table[hash & (LTTNG_UST_ENUM_HT_SIZE - 1)]; - cds_hlist_for_each_entry(_enum, node, head, hlist) { - assert(_enum->desc); - if (!strncmp(_enum->desc->name, desc->name, - LTTNG_UST_SYM_NAME_LEN - 1)) { - ret = -EEXIST; - goto exist; - } + + _enum = lttng_ust_enum_get_from_desc(session, desc); + if (_enum) { + ret = -EEXIST; + goto exist; } notify_socket = lttng_get_notify_socket(session->owner); diff --git a/liblttng-ust/ust-core.c b/liblttng-ust/ust-core.c index 5355f5c..76f729a 100644 --- a/liblttng-ust/ust-core.c +++ b/liblttng-ust/ust-core.c @@ -63,21 +63,20 @@ void lttng_transport_unregister(struct lttng_transport *transport) /* * Needed by comm layer. */ -struct lttng_enum *lttng_ust_enum_get(struct lttng_session *session, - const char *enum_name) +struct lttng_enum *lttng_ust_enum_get_from_desc(struct lttng_session *session, + const struct lttng_enum_desc *enum_desc) { struct lttng_enum *_enum; struct cds_hlist_head *head; struct cds_hlist_node *node; - size_t name_len = strlen(enum_name); + size_t name_len = strlen(enum_desc->name); uint32_t hash; - hash = jhash(enum_name, name_len, 0); + hash = jhash(enum_desc->name, name_len, 0); head = >enums_ht.table[hash & (LTTNG_UST_ENUM_HT_SIZE - 1)]; cds_hlist_for_each_entry(_enum, node, head, hlist) { assert(_enum->desc); - if (!strncmp(_enum->desc->name, enum_name, - LTTNG_UST_SYM_NAME_LEN - 1)) + if (_enum->desc == enum_desc) return _enum; } return NULL; -- 2.7.4 ___ lttng-dev mailing list lttng-dev@lists.lttng.org https://lists.lttng.org/cgi-bin/mailman/listinfo/lttng-dev
[lttng-dev] [PATCH lttng-ust v2 6/6] Support unloading of probe providers
With this commit, it's now possible to dlclose() a library containing an actively used probe provider. The destructor of such library will now iterate over all the sessions and over all probe definitions to unregister them from the respective callsites in the process. Signed-off-by: Francis Deslauriers <francis.deslauri...@efficios.com> --- v2: Coding style fixes. --- liblttng-ust/lttng-events.c | 2 +- liblttng-ust/lttng-probes.c | 5 - liblttng-ust/tracepoint.c | 43 ++- 3 files changed, 39 insertions(+), 11 deletions(-) diff --git a/liblttng-ust/lttng-events.c b/liblttng-ust/lttng-events.c index e130ec6..255c4b9 100644 --- a/liblttng-ust/lttng-events.c +++ b/liblttng-ust/lttng-events.c @@ -798,7 +798,7 @@ void lttng_probe_provider_unregister_events(struct lttng_probe_desc *provider_de struct lttng_session *session; struct cds_hlist_head *head; struct lttng_event *event; - int i; + unsigned int i, j; /* Get handle on list of sessions. */ sessionsp = _lttng_get_sessions(); diff --git a/liblttng-ust/lttng-probes.c b/liblttng-ust/lttng-probes.c index a09497f..862b19e 100644 --- a/liblttng-ust/lttng-probes.c +++ b/liblttng-ust/lttng-probes.c @@ -226,7 +226,10 @@ void lttng_probe_unregister(struct lttng_probe_desc *desc) cds_list_del(>head); else cds_list_del(>lazy_init_head); - DBG("just unregistered probe %s", desc->provider); + + lttng_probe_provider_unregister_events(desc); + DBG("just unregistered probes of provider %s", desc->provider); + ust_unlock(); } diff --git a/liblttng-ust/tracepoint.c b/liblttng-ust/tracepoint.c index 14b8231..2c25d46 100644 --- a/liblttng-ust/tracepoint.c +++ b/liblttng-ust/tracepoint.c @@ -107,8 +107,8 @@ struct tracepoint_entry { struct lttng_ust_tracepoint_probe *probes; int refcount; /* Number of times armed. 0 if disarmed. */ int callsite_refcount; /* how many libs use this tracepoint */ - const char *signature; - char name[0]; + char *signature; + char *name; }; struct tp_probes { @@ -132,6 +132,7 @@ struct callsite_entry { struct cds_hlist_node hlist;/* hash table node */ struct cds_list_head node; /* lib list of callsites node */ struct lttng_ust_tracepoint *tp; + bool tp_entry_callsite_ref; /* Has a tp_entry took a ref on this callsite */ }; /* coverity[+alloc] */ @@ -284,6 +285,8 @@ static struct tracepoint_entry *add_tracepoint(const char *name, struct cds_hlist_node *node; struct tracepoint_entry *e; size_t name_len = strlen(name); + size_t sig_len = strlen(signature); + size_t sig_off, name_off; uint32_t hash; if (name_len > LTTNG_UST_SYM_NAME_LEN - 1) { @@ -298,19 +301,29 @@ static struct tracepoint_entry *add_tracepoint(const char *name, return ERR_PTR(-EEXIST);/* Already there */ } } + /* -* Using zmalloc here to allocate a variable length element. Could -* cause some memory fragmentation if overused. +* Using zmalloc here to allocate a variable length elements: name and +* signature. Could cause some memory fragmentation if overused. */ - e = zmalloc(sizeof(struct tracepoint_entry) + name_len + 1); + name_off = sizeof(struct tracepoint_entry); + sig_off = name_off + name_len + 1; + + e = zmalloc(sizeof(struct tracepoint_entry) + name_len + 1 + sig_len + 1); if (!e) return ERR_PTR(-ENOMEM); - memcpy(>name[0], name, name_len + 1); + e->name = (char *) e + name_off; + memcpy(e->name, name, name_len + 1); e->name[name_len] = '\0'; + + e->signature = (char *) e + sig_off; + memcpy(e->signature, signature, sig_len + 1); + e->signature[sig_len] = '\0'; + e->probes = NULL; e->refcount = 0; e->callsite_refcount = 0; - e->signature = signature; + cds_hlist_add_head(>hlist, head); return e; } @@ -405,6 +418,7 @@ static void add_callsite(struct tracepoint_lib * lib, struct lttng_ust_tracepoin if (!tp_entry) return; tp_entry->callsite_refcount++; + e->tp_entry_callsite_ref = true; } /* @@ -417,7 +431,8 @@ static void remove_callsite(struct callsite_entry *e) tp_entry = get_tracepoint(e->tp->name); if (tp_entry) { - tp_entry->callsite_refcount--; + if (e->tp_entry_callsite_ref) + tp_entry->callsite_refcount--; if (tp_entry->callsite_refcount == 0) disable_tracepoint(e->tp); } @@ -453,10 +468,15 @@ static void tracepoint
[lttng-dev] [PATCH lttng-ust v2 1/6] Remove duplicate provider name checks
From: Mathieu Desnoyers <mathieu.desnoy...@efficios.com> It's now possible to register a probe provider with a name that has already been registered. This is useful when wanting to load a new version of a shared library on a already running process. Changes are necessary in the lttng-session daemon to support cases where the newly register event has a different probe payload. Taking a simple case where a probe provider is registered twice, the tracepoint call site will have two probes registered to it and thus will generate two events in the trace. Signed-off-by: Mathieu Desnoyers <mathieu.desnoy...@efficios.com> Signed-off-by: Francis Deslauriers <francis.deslauri...@efficios.com> --- include/lttng/ust-tracepoint-event.h | 2 +- liblttng-ust/lttng-events.c | 11 --- liblttng-ust/lttng-probes.c | 23 +-- 3 files changed, 2 insertions(+), 34 deletions(-) diff --git a/include/lttng/ust-tracepoint-event.h b/include/lttng/ust-tracepoint-event.h index 15399c7..ec292d2 100644 --- a/include/lttng/ust-tracepoint-event.h +++ b/include/lttng/ust-tracepoint-event.h @@ -1007,7 +1007,7 @@ _TP_COMBINE_TOKENS(__lttng_events_init__, TRACEPOINT_PROVIDER)(void) _TP_COMBINE_TOKENS(__tracepoint_provider_check_, TRACEPOINT_PROVIDER)(); ret = lttng_probe_register(&_TP_COMBINE_TOKENS(__probe_desc___, TRACEPOINT_PROVIDER)); if (ret) { - fprintf(stderr, "LTTng-UST: Error (%d) while registering tracepoint probe. Duplicate registration of tracepoint probes having the same name is not allowed.\n", ret); + fprintf(stderr, "LTTng-UST: Error (%d) while registering tracepoint probe.\n", ret); abort(); } } diff --git a/liblttng-ust/lttng-events.c b/liblttng-ust/lttng-events.c index bfdae4f..f4a7ccc 100644 --- a/liblttng-ust/lttng-events.c +++ b/liblttng-ust/lttng-events.c @@ -537,7 +537,6 @@ int lttng_event_create(const struct lttng_event_desc *desc, struct lttng_event *event; struct lttng_session *session = chan->session; struct cds_hlist_head *head; - struct cds_hlist_node *node; int ret = 0; size_t name_len = strlen(event_name); uint32_t hash; @@ -546,15 +545,6 @@ int lttng_event_create(const struct lttng_event_desc *desc, hash = jhash(event_name, name_len, 0); head = >session->events_ht.table[hash & (LTTNG_UST_EVENT_HT_SIZE - 1)]; - cds_hlist_for_each_entry(event, node, head, hlist) { - assert(event->desc); - if (!strncmp(event->desc->name, desc->name, - LTTNG_UST_SYM_NAME_LEN - 1) - && chan == event->chan) { - ret = -EEXIST; - goto exist; - } - } notify_socket = lttng_get_notify_socket(session->owner); if (notify_socket < 0) { @@ -623,7 +613,6 @@ sessiond_register_error: cache_error: create_enum_error: socket_error: -exist: return ret; } diff --git a/liblttng-ust/lttng-probes.c b/liblttng-ust/lttng-probes.c index 390265a..a09497f 100644 --- a/liblttng-ust/lttng-probes.c +++ b/liblttng-ust/lttng-probes.c @@ -148,20 +148,6 @@ struct cds_list_head *lttng_get_probe_list_head(void) } static -const struct lttng_probe_desc *find_provider(const char *provider) -{ - struct lttng_probe_desc *iter; - struct cds_list_head *probe_list; - - probe_list = lttng_get_probe_list_head(); - cds_list_for_each_entry(iter, probe_list, head) { - if (!strcmp(iter->provider, provider)) - return iter; - } - return NULL; -} - -static int check_provider_version(struct lttng_probe_desc *desc) { /* @@ -206,13 +192,6 @@ int lttng_probe_register(struct lttng_probe_desc *desc) ust_lock_nocheck(); - /* -* Check if the provider has already been registered. -*/ - if (find_provider(desc->provider)) { - ret = -EEXIST; - goto end; - } cds_list_add(>lazy_init_head, _probe_init); desc->lazy = 1; DBG("adding probe %s containing %u events to lazy registration list", @@ -224,7 +203,7 @@ int lttng_probe_register(struct lttng_probe_desc *desc) */ if (lttng_session_active()) fixup_lazy_probes(); -end: + ust_unlock(); return ret; } -- 2.7.4 ___ lttng-dev mailing list lttng-dev@lists.lttng.org https://lists.lttng.org/cgi-bin/mailman/listinfo/lttng-dev
Re: [lttng-dev] [PATCH lttng-ust 5/8] Fix: missing enum removal from the enum hashtable
2018-02-07 15:55 GMT-05:00 Mathieu Desnoyers <mathieu.desnoy...@efficios.com>: > - On Feb 2, 2018, at 2:48 PM, Francis Deslauriers > francis.deslauri...@efficios.com wrote: > > Is it a fix or a preparation step for a new feature ? Same thought process that with: cds_hlist_del(>hlist); Thanks, Francis > > Thanks, > > Mathieu > >> Signed-off-by: Francis Deslauriers <francis.deslauri...@efficios.com> >> --- >> liblttng-ust/lttng-events.c | 1 + >> 1 file changed, 1 insertion(+) >> >> diff --git a/liblttng-ust/lttng-events.c b/liblttng-ust/lttng-events.c >> index e8d4857..2b679b5 100644 >> --- a/liblttng-ust/lttng-events.c >> +++ b/liblttng-ust/lttng-events.c >> @@ -990,6 +990,7 @@ static >> void _lttng_enum_destroy(struct lttng_enum *_enum) >> { >> cds_list_del(&_enum->node); >> + cds_hlist_del(&_enum->hlist); >> free(_enum); >> } >> >> -- >> 2.7.4 > > -- > Mathieu Desnoyers > EfficiOS Inc. > http://www.efficios.com -- Francis Deslauriers Software developer EfficiOS inc. ___ lttng-dev mailing list lttng-dev@lists.lttng.org https://lists.lttng.org/cgi-bin/mailman/listinfo/lttng-dev
Re: [lttng-dev] [PATCH lttng-ust 2/8] Fix: missing event removal from the event hashtable
2018-02-07 15:50 GMT-05:00 Mathieu Desnoyers <mathieu.desnoy...@efficios.com>: > > > - On Feb 2, 2018, at 2:48 PM, Francis Deslauriers > francis.deslauri...@efficios.com wrote: > > Is this really a fix ? Or is it a preparation step in order to be able to > remove events before the end of the session lifetime ? It's not a fix in the sense that it was not causing issues because it was only called at session destruction. But it's a fix in the sense that the _lttng_event_destroy function was not doing all the work necessary to destroy an event passed as argument. Taken by itself, a call to this function would leave one of the hlists of the hash table in a incorrect state by freeing an element without cds_hlist_del() it from the hlist before. That was my thought process. What do you think? Thank you, Francis > Thanks, > > Mathieu > > >> Signed-off-by: Francis Deslauriers <francis.deslauri...@efficios.com> >> --- >> liblttng-ust/lttng-events.c | 4 >> 1 file changed, 4 insertions(+) >> >> diff --git a/liblttng-ust/lttng-events.c b/liblttng-ust/lttng-events.c >> index f4a7ccc..7419f78 100644 >> --- a/liblttng-ust/lttng-events.c >> +++ b/liblttng-ust/lttng-events.c >> @@ -883,7 +883,11 @@ void _lttng_event_destroy(struct lttng_event *event) >> { >> struct lttng_enabler_ref *enabler_ref, *tmp_enabler_ref; >> >> + /* Remove from event list. */ >> cds_list_del(>node); >> + /* Remove from event hash table. */ >> + cds_hlist_del(>hlist); >> + >> lttng_destroy_context(event->ctx); >> lttng_free_event_filter_runtime(event); >> /* Free event enabler refs */ >> -- >> 2.7.4 > > -- > Mathieu Desnoyers > EfficiOS Inc. > http://www.efficios.com -- Francis Deslauriers Software developer EfficiOS inc. ___ lttng-dev mailing list lttng-dev@lists.lttng.org https://lists.lttng.org/cgi-bin/mailman/listinfo/lttng-dev
Re: [lttng-dev] [PATCH lttng-ust 6/8] Manually dlopen() liblttng-ust.so to prevent unloading
2018-02-07 15:59 GMT-05:00 Mathieu Desnoyers <mathieu.desnoy...@efficios.com>: > - On Feb 2, 2018, at 2:48 PM, Francis Deslauriers > francis.deslauri...@efficios.com wrote: > >> dlopen() increments the refcount of the library thus preventing the >> refcount to reach zero in the case of dlclose; > > The changelog and comment do not explain _why_ this is needed. > > The scenario is: > > - an application is _not_ linked against liblttng-ust.so > - the application dlopen() a tracepoint probe, > - the tracepoint probe .so is linked against liblttng-ust, and this is what > ends up > getting lttng-ust loaded, > > Given that our goal is to allow dlclose() of tracepoint probes (new > features), we don't > want the side effect of this dlclose() to also try to unload liblttng-ust. > Because > liblttng-ust does _not_ support being dlclose'd, we need to "pin" it in > memory by > grabbing an extra reference on the library, with a NODELETE RTLD flag. > I agree, here is a revised version of the commit message and comment: Manually dlopen() liblttng-ust.so to prevent unloading The support of dlclose() allows for the following problematic scenario: - Application is not linked against the liblttng-ust.so - Application dlopen() a probe provider library that is linked against liblttng-ust.so - Application dlclose() the probe provider In this scenario, the probe provider has a dependency on liblttng-ust.so, so when it's loaded by the application, liblttng-ust.so is loaded too. The probe provider library now has the only reference to the liblttng-ust.so library. When the application calls dlclose() on it, all its references are dropped, thus triggering the unloading of both the probe provider library and liblttng-ust.so. This scenario is problematic because the probe provider needs the liblttng-ust.so library to complete its own unloading. As we can't control the order in which libraries are unloaded, we must ensure that liblttng-ust.so is not unloaded before the probe provider. To prevent that unloading, we pin it in memory by grabbing an extra reference on the library, with a RTLD_NODELETE flag. This will prevent the dynamic loader from ever removing the liblttng-ust.so library from the process' address space. Thank you, Francis > Thanks, > > Mathieu > > >> >> Signed-off-by: Francis Deslauriers <francis.deslauri...@efficios.com> >> --- >> configure.ac | 1 + >> liblttng-ust/Makefile.am | 2 ++ >> liblttng-ust/lttng-ust-comm.c | 22 ++ >> 3 files changed, 25 insertions(+) >> >> diff --git a/configure.ac b/configure.ac >> index b0b4157..4fc6f9c 100644 >> --- a/configure.ac >> +++ b/configure.ac >> @@ -25,6 +25,7 @@ m4_define([UST_LIB_V_MINOR], [0]) >> m4_define([UST_LIB_V_PATCH], [0]) >> >> AC_SUBST([LTTNG_UST_LIBRARY_VERSION], >> [UST_LIB_V_MAJOR:UST_LIB_V_MINOR:UST_LIB_V_PATCH]) >> +AC_SUBST([LTTNG_UST_LIBRARY_VERSION_MAJOR], [UST_LIB_V_MAJOR]) >> # note: remember to update tracepoint.h dlopen() to match this version >> # number. TODO: eventually automate by exporting the major number. >> >> diff --git a/liblttng-ust/Makefile.am b/liblttng-ust/Makefile.am >> index 982be69..a7edfd5 100644 >> --- a/liblttng-ust/Makefile.am >> +++ b/liblttng-ust/Makefile.am >> @@ -60,6 +60,8 @@ liblttng_ust_runtime_la_SOURCES = \ >> string-utils.c \ >> string-utils.h >> >> +liblttng_ust_runtime_la_CFLAGS = >> -DLTTNG_UST_LIBRARY_VERSION_MAJOR=\"$(LTTNG_UST_LIBRARY_VERSION_MAJOR)\" >> + >> if HAVE_PERF_EVENT >> liblttng_ust_runtime_la_SOURCES += \ >> lttng-context-perf-counters.c \ >> diff --git a/liblttng-ust/lttng-ust-comm.c b/liblttng-ust/lttng-ust-comm.c >> index 511b9cf..ed912b8 100644 >> --- a/liblttng-ust/lttng-ust-comm.c >> +++ b/liblttng-ust/lttng-ust-comm.c >> @@ -27,6 +27,7 @@ >> #include >> #include >> #include >> +#include >> #include >> #include >> #include >> @@ -59,6 +60,9 @@ >> #include "../libringbuffer/getcpu.h" >> #include "getenv.h" >> >> +/* Concatenate lttng ust shared library name with its major version number. >> */ >> +#define LTTNG_UST_LIB_SO_NAME "liblttng-ust.so." >> LTTNG_UST_LIBRARY_VERSION_MAJOR >> + >> /* >> * Has lttng ust comm constructor been called ? >> */ >> @@ -1648,6 +1652,7 @@ void __attribute__((constructor)) lttng_ust_init(void) >> pthread_attr_t thread_attr; >> int timeout_mode; >> int ret; >> + void *handle; >> >> if (uatomic_xchg(, 1)
Re: [lttng-dev] [PATCH lttng-ust 4/8] Add probe provider unregister function
2018-02-07 15:54 GMT-05:00 Mathieu Desnoyers <mathieu.desnoy...@efficios.com>: > > - On Feb 2, 2018, at 2:48 PM, Francis Deslauriers > francis.deslauri...@efficios.com wrote: > >> Signed-off-by: Francis Deslauriers <francis.deslauri...@efficios.com> >> --- >> include/lttng/ust-events.h | 1 + >> liblttng-ust/lttng-events.c | 89 >> + >> 2 files changed, 90 insertions(+) >> >> diff --git a/include/lttng/ust-events.h b/include/lttng/ust-events.h >> index caf7e63..019b0eb 100644 >> --- a/include/lttng/ust-events.h >> +++ b/include/lttng/ust-events.h >> @@ -656,6 +656,7 @@ void synchronize_trace(void); >> >> int lttng_probe_register(struct lttng_probe_desc *desc); >> void lttng_probe_unregister(struct lttng_probe_desc *desc); >> +void lttng_probe_provider_unregister_events(struct lttng_probe_desc *desc); >> int lttng_fix_pending_events(void); >> int lttng_probes_init(void); >> void lttng_probes_exit(void); >> diff --git a/liblttng-ust/lttng-events.c b/liblttng-ust/lttng-events.c >> index 7419f78..e8d4857 100644 >> --- a/liblttng-ust/lttng-events.c >> +++ b/liblttng-ust/lttng-events.c >> @@ -789,6 +789,95 @@ void lttng_create_event_if_missing(struct lttng_enabler >> *enabler) >> } >> >> /* >> + * Iterate over all the UST sessions to unregister and destroy all probes >> from >> + * the probe provider descriptor passed in arguments. Must me called with >> the > > passed in arguments -> received as argument > >> + * ust_lock held. >> + */ >> +void lttng_probe_provider_unregister_events(struct lttng_probe_desc >> *provider_desc) >> +{ >> + int i; > > move int i; to the last variable (shortest line). > >> + struct cds_list_head *sessionsp; >> + struct lttng_session *session; >> + struct cds_hlist_head *head; >> + struct cds_hlist_node *node; >> + struct lttng_event *event; >> + >> + /* Get handle on list of sessions. */ >> + sessionsp = _lttng_get_sessions(); >> + >> + /* >> + * Iterate over all events in the probe provider descriptions and >> sessions >> + * to queue the unregistration of the events. >> + */ >> + for (i = 0; i < provider_desc->nr_events; i++) { >> + const char *event_name; >> + uint32_t hash; >> + size_t name_len; >> + const struct lttng_event_desc *event_desc; > > same here about var definition layout. > >> + >> + event_desc = provider_desc->event_desc[i]; >> + event_name = event_desc->name; >> + name_len = strlen(event_name); >> + hash = jhash(event_name, name_len, 0); >> + >> + /* Iterate over all session to find the current event >> description. */ >> + cds_list_for_each_entry(session, sessionsp, node) { > > remove whiteline. > >> + >> + /* >> + * Get the list of events in the hashtable bucket and >> iterate to >> + * find the event matching this descriptor. >> + */ >> + head = >events_ht.table[hash & >> (LTTNG_UST_EVENT_HT_SIZE - 1)]; >> + cds_hlist_for_each_entry(event, node, head, hlist) { >> + if (event_desc == event->desc) { >> + >> + /* Queue the unregistration of this >> event. */ >> + _lttng_event_unregister(event); >> + break; >> + } >> + } >> + } >> + } >> + >> + /* Wait for grace period. */ >> + synchronize_trace(); >> + /* Prune the unregistration queue. */ >> + __tracepoint_probe_prune_release_queue(); >> + >> + /* >> + * It is now safe to destroy the events and remove them from the event >> list >> + * and hashtables. >> + */ >> + for (i = 0; i < provider_desc->nr_events; i++) { >> + const char *event_name; >> + uint32_t hash; >> + size_t name_len; >> + const struct lttng_event_desc *event_desc; > > same. > >> + >> + event_desc = provider_desc->event_desc[i]; >> + event_name = event_desc->name; >>
Re: [lttng-dev] [PATCH lttng-tools 2/5] Fix: should pass the reg_enum_lookup pointer directly
2018-02-07 15:48 GMT-05:00 Mathieu Desnoyers <mathieu.desnoy...@efficios.com>: > - On Feb 7, 2018, at 2:36 PM, Francis Deslauriers > francis.deslauri...@efficios.com wrote: > >> As the ht_hash_enum and ht_match_enum functions are not changing the >> pointer there is no need to pass the address of the pointer. > > The changelog seems too nice. The current situation is that the arguments > passed to the cds_lfht_lookup() function do not match the args expected by > ht_has_enum > and ht_match_enum, and by chance we probably always end up comparing with > garbage ? > > The changelog should better describe the current problem. Here is a revised version: Fix: calling ht_{hash, match}_enum with wrong argument ht_hash_enum and ht_match_enum are currently called with the address of the pointer to a ust_registry_enum rather than the expected pointer to a ust_registry_enum. This means that those function calls would end up using garbage for hashing and comparing. Thank you, Francis > > Thanks, > > Mathieu > >> >> Signed-off-by: Francis Deslauriers <francis.deslauri...@efficios.com> >> --- >> src/bin/lttng-sessiond/ust-registry.c | 4 ++-- >> 1 file changed, 2 insertions(+), 2 deletions(-) >> >> diff --git a/src/bin/lttng-sessiond/ust-registry.c >> b/src/bin/lttng-sessiond/ust-registry.c >> index e336b9e..cd6fdac 100644 >> --- a/src/bin/lttng-sessiond/ust-registry.c >> +++ b/src/bin/lttng-sessiond/ust-registry.c >> @@ -558,8 +558,8 @@ struct ust_registry_enum * >> struct lttng_ht_iter iter; >> >> cds_lfht_lookup(session->enums->ht, >> - ht_hash_enum((void *) _enum_lookup, lttng_ht_seed), >> - ht_match_enum, _enum_lookup, ); >> + ht_hash_enum((void *) reg_enum_lookup, lttng_ht_seed), >> + ht_match_enum, reg_enum_lookup, ); >> node = lttng_ht_iter_get_node_str(); >> if (!node) { >> goto end; >> -- >> 2.7.4 >> >> ___________ >> lttng-dev mailing list >> lttng-dev@lists.lttng.org >> https://lists.lttng.org/cgi-bin/mailman/listinfo/lttng-dev > > -- > Mathieu Desnoyers > EfficiOS Inc. > http://www.efficios.com -- Francis Deslauriers Software developer EfficiOS inc. ___ lttng-dev mailing list lttng-dev@lists.lttng.org https://lists.lttng.org/cgi-bin/mailman/listinfo/lttng-dev
Re: [lttng-dev] [PATCH lttng-tools 1/5] Fix: probes should not be compared by their names and callsite signatures
2018-02-07 15:43 GMT-05:00 Mathieu Desnoyers <mathieu.desnoy...@efficios.com>: > - On Feb 7, 2018, at 2:36 PM, Francis Deslauriers > francis.deslauri...@efficios.com wrote: > >> Events with different payloads but identical name and signatures could >> lead to corrupted trace as the Session Daemon would consider them >> identical and give them the same event ID. >> >> Events should be compared using the name, loglevel, fields and >> model_emf_uri to ensure that their serialized layout is the same. > > model_emf_uri has no impact on the serialized layout, but does have an > impact on what ends up in the metadata description for the event. The > changelog should be adapated to clarify this. I understand, how about this: Fix: probes should be compared strictly by events metadata Currently, events are compared using names and signatures. Events with different payloads but identical name and signatures could lead to corrupted trace as the Session Daemon would consider them identical and give them the same event ID. Events should be compared using the name, loglevel, fields and model_emf_uri to ensure that their respective metadata is the same. > >> >> Signed-off-by: Francis Deslauriers <francis.deslauri...@efficios.com> >> --- >> src/bin/lttng-sessiond/Makefile.am | 3 +- >> src/bin/lttng-sessiond/ust-field-utils.c | 261 >> +++ >> src/bin/lttng-sessiond/ust-field-utils.h | 29 >> src/bin/lttng-sessiond/ust-registry.c| 40 - >> tests/unit/Makefile.am | 1 + >> 5 files changed, 325 insertions(+), 9 deletions(-) >> create mode 100644 src/bin/lttng-sessiond/ust-field-utils.c >> create mode 100644 src/bin/lttng-sessiond/ust-field-utils.h >> >> diff --git a/src/bin/lttng-sessiond/Makefile.am >> b/src/bin/lttng-sessiond/Makefile.am >> index 413fe75..6fc1809 100644 >> --- a/src/bin/lttng-sessiond/Makefile.am >> +++ b/src/bin/lttng-sessiond/Makefile.am >> @@ -40,7 +40,8 @@ lttng_sessiond_SOURCES = utils.c utils.h \ >> if HAVE_LIBLTTNG_UST_CTL >> lttng_sessiond_SOURCES += trace-ust.c ust-registry.c ust-app.c \ >> ust-consumer.c ust-consumer.h ust-thread.c \ >> - ust-metadata.c ust-clock.h agent-thread.c >> agent-thread.h >> + ust-metadata.c ust-clock.h agent-thread.c >> agent-thread.h \ >> + ust-field-utils.h ust-field-utils.c >> endif >> >> # Add main.c at the end for compile order >> diff --git a/src/bin/lttng-sessiond/ust-field-utils.c >> b/src/bin/lttng-sessiond/ust-field-utils.c >> new file mode 100644 >> index 000..3c2da14 >> --- /dev/null >> +++ b/src/bin/lttng-sessiond/ust-field-utils.c >> @@ -0,0 +1,261 @@ >> +/* >> + * Copyright (C) 2018 - Francis Deslauriers >> <francis.deslauri...@efficios.com> >> + * >> + * This program is free software; you can redistribute it and/or modify it >> + * under the terms of the GNU General Public License, version 2 only, as >> + * published by the Free Software Foundation. >> + * >> + * This program is distributed in the hope that it will be useful, but >> WITHOUT >> + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or >> + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for >> + * more details. >> + * >> + * You should have received a copy of the GNU General Public License along >> with >> + * this program; if not, write to the Free Software Foundation, Inc., 51 >> + * Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. >> + */ >> + >> +#include >> +#include >> + >> +#include "ust-field-utils.h" >> + >> +/* >> + * The ustctl_field is made of a combinaison of C basic types > > combination Done. > >> + * ustctl_basic_type and _ustctl_basic_type. >> + * >> + * ustctl_basic_type contains an enumeration describing the abstract type. >> + * _ustctl_basic_type does _NOT_ contain an enumeration describing the >> + * abstract type. >> + * >> + * A layer is needed to use the same code for both structures. >> + * When dealing with _ustctl_basic_type, we need to use the abstract type of >> + * the ustctl_type struct. >> + */ >> + >> +/* >> + * Compare two ustctl_integer_type fields. >> + * Returns 1 if both are identical. >> + */ >> +static bool match_ustctl_field_integer(struct ustctl_integer_type *first, >> + struct ustctl_integer_type *second) >> +{ >> +
[lttng-dev] [PATCH lttng-tools 1/5] Fix: probes should not be compared by their names and callsite signatures
Events with different payloads but identical name and signatures could lead to corrupted trace as the Session Daemon would consider them identical and give them the same event ID. Events should be compared using the name, loglevel, fields and model_emf_uri to ensure that their serialized layout is the same. Signed-off-by: Francis Deslauriers <francis.deslauri...@efficios.com> --- src/bin/lttng-sessiond/Makefile.am | 3 +- src/bin/lttng-sessiond/ust-field-utils.c | 261 +++ src/bin/lttng-sessiond/ust-field-utils.h | 29 src/bin/lttng-sessiond/ust-registry.c| 40 - tests/unit/Makefile.am | 1 + 5 files changed, 325 insertions(+), 9 deletions(-) create mode 100644 src/bin/lttng-sessiond/ust-field-utils.c create mode 100644 src/bin/lttng-sessiond/ust-field-utils.h diff --git a/src/bin/lttng-sessiond/Makefile.am b/src/bin/lttng-sessiond/Makefile.am index 413fe75..6fc1809 100644 --- a/src/bin/lttng-sessiond/Makefile.am +++ b/src/bin/lttng-sessiond/Makefile.am @@ -40,7 +40,8 @@ lttng_sessiond_SOURCES = utils.c utils.h \ if HAVE_LIBLTTNG_UST_CTL lttng_sessiond_SOURCES += trace-ust.c ust-registry.c ust-app.c \ ust-consumer.c ust-consumer.h ust-thread.c \ - ust-metadata.c ust-clock.h agent-thread.c agent-thread.h + ust-metadata.c ust-clock.h agent-thread.c agent-thread.h \ + ust-field-utils.h ust-field-utils.c endif # Add main.c at the end for compile order diff --git a/src/bin/lttng-sessiond/ust-field-utils.c b/src/bin/lttng-sessiond/ust-field-utils.c new file mode 100644 index 000..3c2da14 --- /dev/null +++ b/src/bin/lttng-sessiond/ust-field-utils.c @@ -0,0 +1,261 @@ +/* + * Copyright (C) 2018 - Francis Deslauriers <francis.deslauri...@efficios.com> + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License, version 2 only, as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License along with + * this program; if not, write to the Free Software Foundation, Inc., 51 + * Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + */ + +#include +#include + +#include "ust-field-utils.h" + +/* + * The ustctl_field is made of a combinaison of C basic types + * ustctl_basic_type and _ustctl_basic_type. + * + * ustctl_basic_type contains an enumeration describing the abstract type. + * _ustctl_basic_type does _NOT_ contain an enumeration describing the + * abstract type. + * + * A layer is needed to use the same code for both structures. + * When dealing with _ustctl_basic_type, we need to use the abstract type of + * the ustctl_type struct. + */ + +/* + * Compare two ustctl_integer_type fields. + * Returns 1 if both are identical. + */ +static bool match_ustctl_field_integer(struct ustctl_integer_type *first, + struct ustctl_integer_type *second) +{ + bool match = true; + match &= first->size == second->size; + match &= first->alignment == second->alignment; + match &= first->signedness == second->signedness; + match &= first->encoding == second->encoding; + match &= first->base == second->base; + match &= first->reverse_byte_order == second->reverse_byte_order; + + return match; +} + +/* + * Compare two _ustctl_basic_type fields known to be of type integer. + * Returns 1 if both are identical. + */ +static bool match_ustctl_field_integer_from_raw_basic_type( + union _ustctl_basic_type *first, union _ustctl_basic_type *second) +{ + return match_ustctl_field_integer(>integer, >integer); +} + +/* + * Compare two _ustctl_basic_type fields known to be of type enum. + * Returns 1 if both are identical. + */ +static bool match_ustctl_field_enum_from_raw_basic_type( + union _ustctl_basic_type *first, union _ustctl_basic_type *second) +{ + /* +* Compare enumeration ID. Enumeration ID is provided to the application by +* the session daemon before event registration. +*/ + if (first->enumeration.id != second->enumeration.id) { + goto no_match; + } + + /* +* Sanity check of the name and container type. Those were already checked +* during enum registration. +*/ + if (strncmp(first->enumeration.name, second->enumeration.name, + LTTNG_UST_SYM_NAME_LEN)) { + goto no_match; + } + if (match_ustctl_fi
[lttng-dev] [PATCH lttng-tools 3/5] Tests: allow the use of regular expressions to match events
Signed-off-by: Francis Deslauriers <francis.deslauri...@efficios.com> --- tests/utils/utils.sh | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tests/utils/utils.sh b/tests/utils/utils.sh index e8dfcda..9bf1fcc 100644 --- a/tests/utils/utils.sh +++ b/tests/utils/utils.sh @@ -1457,7 +1457,7 @@ function validate_trace_exp() which $BABELTRACE_BIN >/dev/null skip $? -ne 0 "Babeltrace binary not found. Skipping trace validation" - traced=$($BABELTRACE_BIN $trace_path 2>/dev/null | grep ${event_exp} | wc -l) + traced=$($BABELTRACE_BIN $trace_path 2>/dev/null | grep --extended-regexp ${event_exp} | wc -l) if [ "$traced" -ne 0 ]; then pass "Validate trace for expression '${event_exp}', $traced events" else @@ -1476,7 +1476,7 @@ function validate_trace_only_exp() which $BABELTRACE_BIN >/dev/null skip $? -ne 0 "Babeltrace binary not found. Skipping trace matches" - local count=$($BABELTRACE_BIN $trace_path | grep ${event_exp} | wc -l) + local count=$($BABELTRACE_BIN $trace_path | grep --extended-regexp ${event_exp} | wc -l) local total=$($BABELTRACE_BIN $trace_path | wc -l) if [ "$count" -ne 0 ] && [ "$total" -eq "$count" ]; then -- 2.7.4 ___ lttng-dev mailing list lttng-dev@lists.lttng.org https://lists.lttng.org/cgi-bin/mailman/listinfo/lttng-dev
[lttng-dev] [PATCH lttng-tools 5/5] Tests: add duplicated providers tests
Signed-off-by: Francis Deslauriers <francis.deslauri...@efficios.com> --- configure.ac| 1 + tests/fast_regression | 1 + tests/regression/ust/multi-lib/Makefile.am | 114 +++ tests/regression/ust/multi-lib/README | 21 ++ tests/regression/ust/multi-lib/callsites.c | 34 +++ tests/regression/ust/multi-lib/callsites.h | 21 ++ tests/regression/ust/multi-lib/multi-lib-test.c | 251 +++ tests/regression/ust/multi-lib/probes.c | 18 ++ tests/regression/ust/multi-lib/probes.h | 195 ++ tests/regression/ust/multi-lib/test_multi_lib | 262 10 files changed, 918 insertions(+) create mode 100644 tests/regression/ust/multi-lib/Makefile.am create mode 100644 tests/regression/ust/multi-lib/README create mode 100644 tests/regression/ust/multi-lib/callsites.c create mode 100644 tests/regression/ust/multi-lib/callsites.h create mode 100644 tests/regression/ust/multi-lib/multi-lib-test.c create mode 100644 tests/regression/ust/multi-lib/probes.c create mode 100644 tests/regression/ust/multi-lib/probes.h create mode 100755 tests/regression/ust/multi-lib/test_multi_lib diff --git a/configure.ac b/configure.ac index b6ea39c..e22872c 100644 --- a/configure.ac +++ b/configure.ac @@ -1090,6 +1090,7 @@ AC_CONFIG_FILES([ tests/regression/ust/buffers-pid/Makefile tests/regression/ust/periodical-metadata-flush/Makefile tests/regression/ust/multi-session/Makefile + tests/regression/ust/multi-lib/Makefile tests/regression/ust/overlap/Makefile tests/regression/ust/overlap/demo/Makefile tests/regression/ust/linking/Makefile diff --git a/tests/fast_regression b/tests/fast_regression index bbce068..f76b53d 100644 --- a/tests/fast_regression +++ b/tests/fast_regression @@ -21,6 +21,7 @@ regression/tools/regen-statedump/test_ust regression/ust/before-after/test_before_after regression/ust/buffers-pid/test_buffers_pid regression/ust/multi-session/test_multi_session +regression/ust/multi-lib/test_multi_lib regression/ust/nprocesses/test_nprocesses regression/ust/overlap/test_overlap regression/ust/java-jul/test_java_jul diff --git a/tests/regression/ust/multi-lib/Makefile.am b/tests/regression/ust/multi-lib/Makefile.am new file mode 100644 index 000..f78ce7f --- /dev/null +++ b/tests/regression/ust/multi-lib/Makefile.am @@ -0,0 +1,114 @@ +noinst_SCRIPTS = test_multi_lib +noinst_PROGRAMS = exec-with-callsites exec-without-callsites + +exec_with_callsites_SOURCES = multi-lib-test.c callsites.c +exec_with_callsites_LDFLAGS = -ldl -lpopt +exec_with_callsites_CFLAGS = -DHAS_CALLSITES=1 + +exec_without_callsites_SOURCES = multi-lib-test.c +exec_without_callsites_LDFLAGS = -ldl -lpopt -llttng-ust +exec_without_callsites_LDADD = probes.o +exec_without_callsites_CFLAGS = -DHAS_CALLSITES=0 + +PROBES_SRC=probes.c probes.h +PROBES_LDF=-shared -module -llttng-ust -avoid-version -rpath $(abs_builddir)/.libs/ +PROBES_CF=-c -I$(srcdir)/ + +probes.o: probes.c probes.h + $(CC) $(PROBES_CF) -o $@ $< + +noinst_LTLIBRARIES = libprobes_a.la libprobes_a_prime.la \ + libprobes_b.la libprobes_c.la libprobes_c_prime.la \ + libprobes_d.la libprobes_e.la libprobes_f.la \ + libprobes_g.la libprobes_h.la libprobes_i.la \ + libprobes_j.la libprobes_k.la libprobes_l.la \ + libprobes_m.la libprobes_n.la libprobes_o.la \ + libprobes_p.la + +noinst_LTLIBRARIES += libcallsites_1.la libcallsites_2.la + +CALLSITES_SRC=callsites.c callsites.h +CALLSITES_LDF=-shared -module -llttng-ust -avoid-version -rpath $(abs_builddir)/.libs/ +CALLSITES_CF=-c -I. + +libprobes_a_la_SOURCES = $(PROBES_SRC) +libprobes_a_la_LDFLAGS = $(PROBES_LDF) +libprobes_a_la_CFLAGS = $(PROBES_CF) -DACTIVATE_PROBES_A + +libprobes_a_prime_la_SOURCES = $(PROBES_SRC) +libprobes_a_prime_la_LDFLAGS = $(PROBES_LDF) +libprobes_a_prime_la_CFLAGS = $(PROBES_CF) -DACTIVATE_PROBES_A + +libprobes_b_la_SOURCES = $(PROBES_SRC) +libprobes_b_la_LDFLAGS = $(PROBES_LDF) +libprobes_b_la_CFLAGS = $(PROBES_CF) -DACTIVATE_PROBES_B + +libprobes_c_la_SOURCES = $(PROBES_SRC) +libprobes_c_la_LDFLAGS = $(PROBES_LDF) +libprobes_c_la_CFLAGS = $(PROBES_CF) -DACTIVATE_PROBES_C + +libprobes_c_prime_la_SOURCES = $(PROBES_SRC) +libprobes_c_prime_la_LDFLAGS = $(PROBES_LDF) +libprobes_c_prime_la_CFLAGS = $(PROBES_CF) -DACTIVATE_PROBES_C + +libprobes_d_la_SOURCES = $(PROBES_SRC) +libprobes_d_la_LDFLAGS = $(PROBES_LDF) +libprobes_d_la_CFLAGS = $(PROBES_CF) -DACTIVATE_PROBES_D + +libprobes_e_la_SOURCES = $(PROBES_SRC) +libprobes_e_la_LDFLAGS = $(PROBES_LDF) +libprobes_e_la_CFLAGS = $(PROBES_CF) -DACTIVATE_PROBES_E + +libprobes_f_la_SOURCES = $(PROBES_SRC) +libprobes_f_la_LDFLAGS = $(PROBES_LDF) +libprobes_f_la_CFLAGS = $(PROBES_CF) -DACTIVATE
[lttng-dev] [PATCH lttng-tools 0/5] Support probes with the same name but different event payload
This patch set allows for multiple probes with the same name to be hooked on the same callsite. Right now, the Session Daemon only considers the name and signature of the events to determine if two events are identical. This could lead to trace corruptions when two probes would have the same name and signature but really different binary trace layouts. We now compare probes by doing a deep compare of every field. If two events are _exactly_ the same then the same event ID will be used, if they are different a new event ID is created. When used with this UST patch set[1], it is possible to dlclose probe provider and callsite libraries during tracing. This patch set also includes regression tests for both the deep comparaison and the newly added dlclose capability. [1]: https://github.com/frdeso/lttng-ust/tree/dlclose-support Francis Deslauriers (5): Fix: probes should not be compared by their names and callsite signatures Fix: should pass the reg_enum_lookup pointer directly Tests: allow the use of regular expressions to match events Tests: add function to validate the number of an event name in metadata Tests: add duplicated providers tests configure.ac| 1 + src/bin/lttng-sessiond/Makefile.am | 3 +- src/bin/lttng-sessiond/ust-field-utils.c| 261 +++ src/bin/lttng-sessiond/ust-field-utils.h| 29 +++ src/bin/lttng-sessiond/ust-registry.c | 44 +++- tests/fast_regression | 1 + tests/regression/ust/multi-lib/Makefile.am | 114 +++ tests/regression/ust/multi-lib/README | 21 ++ tests/regression/ust/multi-lib/callsites.c | 34 +++ tests/regression/ust/multi-lib/callsites.h | 21 ++ tests/regression/ust/multi-lib/multi-lib-test.c | 251 +++ tests/regression/ust/multi-lib/probes.c | 18 ++ tests/regression/ust/multi-lib/probes.h | 195 ++ tests/regression/ust/multi-lib/test_multi_lib | 262 tests/unit/Makefile.am | 1 + tests/utils/utils.sh| 27 ++- 16 files changed, 1270 insertions(+), 13 deletions(-) create mode 100644 src/bin/lttng-sessiond/ust-field-utils.c create mode 100644 src/bin/lttng-sessiond/ust-field-utils.h create mode 100644 tests/regression/ust/multi-lib/Makefile.am create mode 100644 tests/regression/ust/multi-lib/README create mode 100644 tests/regression/ust/multi-lib/callsites.c create mode 100644 tests/regression/ust/multi-lib/callsites.h create mode 100644 tests/regression/ust/multi-lib/multi-lib-test.c create mode 100644 tests/regression/ust/multi-lib/probes.c create mode 100644 tests/regression/ust/multi-lib/probes.h create mode 100755 tests/regression/ust/multi-lib/test_multi_lib -- 2.7.4 ___ lttng-dev mailing list lttng-dev@lists.lttng.org https://lists.lttng.org/cgi-bin/mailman/listinfo/lttng-dev
[lttng-dev] [PATCH lttng-tools 4/5] Tests: add function to validate the number of an event name in metadata
Signed-off-by: Francis Deslauriers <francis.deslauri...@efficios.com> --- tests/utils/utils.sh | 23 +++ 1 file changed, 23 insertions(+) diff --git a/tests/utils/utils.sh b/tests/utils/utils.sh index 9bf1fcc..60df376 100644 --- a/tests/utils/utils.sh +++ b/tests/utils/utils.sh @@ -1343,6 +1343,29 @@ function add_context_kernel_fail() add_context_lttng 1 -k "$@" } +function validate_metadata_event () +{ + local event_name=$1 + local nr_event_id=$2 + local trace_path=$3 + + local metadata_file=$(find $trace_path | grep metadata) + local metadata_path=$(dirname $metadata_file) + + which $BABELTRACE_BIN >/dev/null + skip $? -ne 0 "Babeltrace binary not found. Skipping trace matches" + + local count=$($BABELTRACE_BIN --output-format=ctf-metadata $metadata_path | grep $event_name | wc -l) + + if [ "$count" -ne "$nr_event_id" ]; then + fail "Metadata match with the metadata of $count event(s) named $event_name" + diag "$count matching event id found in metadata" + else + pass "Metadata match with the metadata of $count event(s) named $event_name" + fi + +} + function trace_matches () { local event_name=$1 -- 2.7.4 ___ lttng-dev mailing list lttng-dev@lists.lttng.org https://lists.lttng.org/cgi-bin/mailman/listinfo/lttng-dev
[lttng-dev] [PATCH lttng-ust 2/8] Fix: missing event removal from the event hashtable
Signed-off-by: Francis Deslauriers <francis.deslauri...@efficios.com> --- liblttng-ust/lttng-events.c | 4 1 file changed, 4 insertions(+) diff --git a/liblttng-ust/lttng-events.c b/liblttng-ust/lttng-events.c index f4a7ccc..7419f78 100644 --- a/liblttng-ust/lttng-events.c +++ b/liblttng-ust/lttng-events.c @@ -883,7 +883,11 @@ void _lttng_event_destroy(struct lttng_event *event) { struct lttng_enabler_ref *enabler_ref, *tmp_enabler_ref; + /* Remove from event list. */ cds_list_del(>node); + /* Remove from event hash table. */ + cds_hlist_del(>hlist); + lttng_destroy_context(event->ctx); lttng_free_event_filter_runtime(event); /* Free event enabler refs */ -- 2.7.4 ___ lttng-dev mailing list lttng-dev@lists.lttng.org https://lists.lttng.org/cgi-bin/mailman/listinfo/lttng-dev
[lttng-dev] [PATCH lttng-ust 6/8] Manually dlopen() liblttng-ust.so to prevent unloading
dlopen() increments the refcount of the library thus preventing the refcount to reach zero in the case of dlclose; Signed-off-by: Francis Deslauriers <francis.deslauri...@efficios.com> --- configure.ac | 1 + liblttng-ust/Makefile.am | 2 ++ liblttng-ust/lttng-ust-comm.c | 22 ++ 3 files changed, 25 insertions(+) diff --git a/configure.ac b/configure.ac index b0b4157..4fc6f9c 100644 --- a/configure.ac +++ b/configure.ac @@ -25,6 +25,7 @@ m4_define([UST_LIB_V_MINOR], [0]) m4_define([UST_LIB_V_PATCH], [0]) AC_SUBST([LTTNG_UST_LIBRARY_VERSION], [UST_LIB_V_MAJOR:UST_LIB_V_MINOR:UST_LIB_V_PATCH]) +AC_SUBST([LTTNG_UST_LIBRARY_VERSION_MAJOR], [UST_LIB_V_MAJOR]) # note: remember to update tracepoint.h dlopen() to match this version # number. TODO: eventually automate by exporting the major number. diff --git a/liblttng-ust/Makefile.am b/liblttng-ust/Makefile.am index 982be69..a7edfd5 100644 --- a/liblttng-ust/Makefile.am +++ b/liblttng-ust/Makefile.am @@ -60,6 +60,8 @@ liblttng_ust_runtime_la_SOURCES = \ string-utils.c \ string-utils.h +liblttng_ust_runtime_la_CFLAGS = -DLTTNG_UST_LIBRARY_VERSION_MAJOR=\"$(LTTNG_UST_LIBRARY_VERSION_MAJOR)\" + if HAVE_PERF_EVENT liblttng_ust_runtime_la_SOURCES += \ lttng-context-perf-counters.c \ diff --git a/liblttng-ust/lttng-ust-comm.c b/liblttng-ust/lttng-ust-comm.c index 511b9cf..ed912b8 100644 --- a/liblttng-ust/lttng-ust-comm.c +++ b/liblttng-ust/lttng-ust-comm.c @@ -27,6 +27,7 @@ #include #include #include +#include #include #include #include @@ -59,6 +60,9 @@ #include "../libringbuffer/getcpu.h" #include "getenv.h" +/* Concatenate lttng ust shared library name with its major version number. */ +#define LTTNG_UST_LIB_SO_NAME "liblttng-ust.so." LTTNG_UST_LIBRARY_VERSION_MAJOR + /* * Has lttng ust comm constructor been called ? */ @@ -1648,6 +1652,7 @@ void __attribute__((constructor)) lttng_ust_init(void) pthread_attr_t thread_attr; int timeout_mode; int ret; + void *handle; if (uatomic_xchg(, 1) == 1) return; @@ -1662,6 +1667,23 @@ void __attribute__((constructor)) lttng_ust_init(void) lttng_ust_loaded = 1; /* +* Manually load liblttng-ust.so to increment the dynamic loader's internal +* refcount for this library so it never becomes zero, thus never gets +* unloaded from the address space of the process. Since we are already +* running in the constructor of the LTTNG_UST_LIB_SO_NAME library, calling +* dlopen will simply increment the refcount and no additionnal work is +* needed by the dynamic loader as the shared library is already loaded in +* the address space. As a safe guard, we use the RTLD_NODELETE flag to +* prevent unloading of the UST library if its refcount becomes zero +* (which should never happen). Do the return value check but discard the +* handle at the end of the function as it's not needed. +*/ + handle = dlopen(LTTNG_UST_LIB_SO_NAME, RTLD_LAZY | RTLD_NODELETE); + if (!handle) { + ERR("dlopen of liblttng-ust shared library (%s).", LTTNG_UST_LIB_SO_NAME); + } + + /* * We want precise control over the order in which we construct * our sub-libraries vs starting to receive commands from * sessiond (otherwise leading to errors when trying to create -- 2.7.4 ___ lttng-dev mailing list lttng-dev@lists.lttng.org https://lists.lttng.org/cgi-bin/mailman/listinfo/lttng-dev
[lttng-dev] [PATCH lttng-ust 3/8] Cleanup: Move version numbers in separate variables in configure script
Signed-off-by: Francis Deslauriers <francis.deslauri...@efficios.com> --- configure.ac | 6 +- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/configure.ac b/configure.ac index fb2f278..b0b4157 100644 --- a/configure.ac +++ b/configure.ac @@ -20,7 +20,11 @@ AC_SUBST([PATCHLEVEL_VERSION], [V_PATCH]) # Following the numbering scheme proposed by libtool for the library version # http://www.gnu.org/software/libtool/manual/html_node/Updating-version-info.html # This is the library version of liblttng-ust. -AC_SUBST([LTTNG_UST_LIBRARY_VERSION], [0:0:0]) +m4_define([UST_LIB_V_MAJOR], [0]) +m4_define([UST_LIB_V_MINOR], [0]) +m4_define([UST_LIB_V_PATCH], [0]) + +AC_SUBST([LTTNG_UST_LIBRARY_VERSION], [UST_LIB_V_MAJOR:UST_LIB_V_MINOR:UST_LIB_V_PATCH]) # note: remember to update tracepoint.h dlopen() to match this version # number. TODO: eventually automate by exporting the major number. -- 2.7.4 ___ lttng-dev mailing list lttng-dev@lists.lttng.org https://lists.lttng.org/cgi-bin/mailman/listinfo/lttng-dev
[lttng-dev] [PATCH lttng-ust 0/8] Support provider duplicates and unloading
This patch set adds the support for duplicated probe providers and support for unloading probe providers using dlclose(). It allows to advance scenarios where probe providers can be upgraded during tracing. For example, during tracing the user could dlopen() a new version of a probe provider and dlclose() the previous one. All this without stop tracing. A patch set for lttng-tools project is necessary to take advantage of those changes. The lttng-tools changes can be found on this branch of my Github fork: https://github.com/frdeso/lttng-tools/commits/multi-lib-support Francis Deslauriers (7): Fix: missing event removal from the event hashtable Cleanup: Move version numbers in separate variables in configure script Add probe provider unregister function Fix: missing enum removal from the enum hashtable Manually dlopen() liblttng-ust.so to prevent unloading Rename lttng_ust_enum_get to lttng_ust_enum_get_from_desc Support unloading of probe providers Mathieu Desnoyers (1): Remove duplicate provider name checks configure.ac | 7 +- include/lttng/ust-events.h | 6 +- include/lttng/ust-tracepoint-event.h | 2 +- liblttng-ust-comm/lttng-ust-comm.c | 3 +- liblttng-ust/Makefile.am | 2 + liblttng-ust/lttng-events.c | 139 ++- liblttng-ust/lttng-probes.c | 28 ++- liblttng-ust/lttng-ust-comm.c| 22 ++ liblttng-ust/tracepoint.c| 43 --- liblttng-ust/ust-core.c | 11 ++- 10 files changed, 200 insertions(+), 63 deletions(-) -- 2.7.4 ___ lttng-dev mailing list lttng-dev@lists.lttng.org https://lists.lttng.org/cgi-bin/mailman/listinfo/lttng-dev
[lttng-dev] [PATCH lttng-ust 8/8] Support unloading of probe providers
With this commit, it's now possible to dlclose() a library containing an actively used probe provider. The destructor of such library will now iterate over all the sessions and over all probe definitions to unregister them from the respective callsites in the process. Signed-off-by: Francis Deslauriers <francis.deslauri...@efficios.com> --- liblttng-ust/lttng-events.c | 22 +- liblttng-ust/lttng-probes.c | 5 - liblttng-ust/tracepoint.c | 43 ++- 3 files changed, 59 insertions(+), 11 deletions(-) diff --git a/liblttng-ust/lttng-events.c b/liblttng-ust/lttng-events.c index 07385d7..698210c 100644 --- a/liblttng-ust/lttng-events.c +++ b/liblttng-ust/lttng-events.c @@ -793,7 +793,7 @@ void lttng_create_event_if_missing(struct lttng_enabler *enabler) */ void lttng_probe_provider_unregister_events(struct lttng_probe_desc *provider_desc) { - int i; + unsigned int i, j; struct cds_list_head *sessionsp; struct lttng_session *session; struct cds_hlist_head *head; @@ -867,7 +867,27 @@ void lttng_probe_provider_unregister_events(struct lttng_probe_desc *provider_de head = >events_ht.table[hash & (LTTNG_UST_EVENT_HT_SIZE - 1)]; cds_hlist_for_each_entry(event, node, head, hlist) { if (event_desc == event->desc) { + /* Destroy enums of the current event. */ + for (j = 0; j < event->desc->nr_fields; j++) { + const struct lttng_event_field *field; + const struct lttng_enum_desc *enum_desc; + struct lttng_enum *curr_enum; + + field = &(event->desc->fields[j]); + if (field->type.atype != atype_enum) { + continue; + } + + enum_desc = field->type.u.basic.enumeration.desc; + curr_enum = lttng_ust_enum_get_from_desc(session, enum_desc); + if (curr_enum) { + _lttng_enum_destroy(curr_enum); + } + } + + /* Destroy event. */ _lttng_event_destroy(event); + break; } } diff --git a/liblttng-ust/lttng-probes.c b/liblttng-ust/lttng-probes.c index a09497f..862b19e 100644 --- a/liblttng-ust/lttng-probes.c +++ b/liblttng-ust/lttng-probes.c @@ -226,7 +226,10 @@ void lttng_probe_unregister(struct lttng_probe_desc *desc) cds_list_del(>head); else cds_list_del(>lazy_init_head); - DBG("just unregistered probe %s", desc->provider); + + lttng_probe_provider_unregister_events(desc); + DBG("just unregistered probes of provider %s", desc->provider); + ust_unlock(); } diff --git a/liblttng-ust/tracepoint.c b/liblttng-ust/tracepoint.c index 14b8231..8c630a6 100644 --- a/liblttng-ust/tracepoint.c +++ b/liblttng-ust/tracepoint.c @@ -107,8 +107,8 @@ struct tracepoint_entry { struct lttng_ust_tracepoint_probe *probes; int refcount; /* Number of times armed. 0 if disarmed. */ int callsite_refcount; /* how many libs use this tracepoint */ - const char *signature; - char name[0]; + char *signature; + char *name; }; struct tp_probes { @@ -132,6 +132,7 @@ struct callsite_entry { struct cds_hlist_node hlist;/* hash table node */ struct cds_list_head node; /* lib list of callsites node */ struct lttng_ust_tracepoint *tp; + bool tp_entry_callsite_ref; /* Has a tp_entry took a ref on this callsite*/ }; /* coverity[+alloc] */ @@ -284,6 +285,8 @@ static struct tracepoint_entry *add_tracepoint(const char *name, struct cds_hlist_node *node; struct tracepoint_entry *e; size_t name_len = strlen(name); + size_t sig_len = strlen(signature); + size_t sig_off, name_off; uint32_t hash; if (name_len > LTTNG_UST_SYM_NAME_LEN - 1) { @@ -298,19 +301,29 @@ static struct tracepoint_entry *add_tracepoint(const char *name, return ERR_PTR(-EEXIST);/* Already there */ } } + /* -* Using zmalloc here to allocate a variable length element. Could -* cause some memory fra
[lttng-dev] [PATCH lttng-ust 5/8] Fix: missing enum removal from the enum hashtable
Signed-off-by: Francis Deslauriers <francis.deslauri...@efficios.com> --- liblttng-ust/lttng-events.c | 1 + 1 file changed, 1 insertion(+) diff --git a/liblttng-ust/lttng-events.c b/liblttng-ust/lttng-events.c index e8d4857..2b679b5 100644 --- a/liblttng-ust/lttng-events.c +++ b/liblttng-ust/lttng-events.c @@ -990,6 +990,7 @@ static void _lttng_enum_destroy(struct lttng_enum *_enum) { cds_list_del(&_enum->node); + cds_hlist_del(&_enum->hlist); free(_enum); } -- 2.7.4 ___ lttng-dev mailing list lttng-dev@lists.lttng.org https://lists.lttng.org/cgi-bin/mailman/listinfo/lttng-dev
[lttng-dev] [PATCH lttng-ust 1/8] Remove duplicate provider name checks
From: Mathieu Desnoyers <mathieu.desnoy...@efficios.com> It's now possible to register a probe provider with a name that has already been registered. This is useful when wanting to load a new version of a shared library on a already running process. Changes are necessary in the lttng-session daemon to support cases where the newly register event has a different probe payload. Taking a simple case where a probe provider is registered twice, the tracepoint call site will have two probes registered to it and thus will generate two events in the trace. Signed-off-by: Mathieu Desnoyers <mathieu.desnoy...@efficios.com> Signed-off-by: Francis Deslauriers <francis.deslauri...@efficios.com> --- include/lttng/ust-tracepoint-event.h | 2 +- liblttng-ust/lttng-events.c | 11 --- liblttng-ust/lttng-probes.c | 23 +-- 3 files changed, 2 insertions(+), 34 deletions(-) diff --git a/include/lttng/ust-tracepoint-event.h b/include/lttng/ust-tracepoint-event.h index 15399c7..ec292d2 100644 --- a/include/lttng/ust-tracepoint-event.h +++ b/include/lttng/ust-tracepoint-event.h @@ -1007,7 +1007,7 @@ _TP_COMBINE_TOKENS(__lttng_events_init__, TRACEPOINT_PROVIDER)(void) _TP_COMBINE_TOKENS(__tracepoint_provider_check_, TRACEPOINT_PROVIDER)(); ret = lttng_probe_register(&_TP_COMBINE_TOKENS(__probe_desc___, TRACEPOINT_PROVIDER)); if (ret) { - fprintf(stderr, "LTTng-UST: Error (%d) while registering tracepoint probe. Duplicate registration of tracepoint probes having the same name is not allowed.\n", ret); + fprintf(stderr, "LTTng-UST: Error (%d) while registering tracepoint probe.\n", ret); abort(); } } diff --git a/liblttng-ust/lttng-events.c b/liblttng-ust/lttng-events.c index bfdae4f..f4a7ccc 100644 --- a/liblttng-ust/lttng-events.c +++ b/liblttng-ust/lttng-events.c @@ -537,7 +537,6 @@ int lttng_event_create(const struct lttng_event_desc *desc, struct lttng_event *event; struct lttng_session *session = chan->session; struct cds_hlist_head *head; - struct cds_hlist_node *node; int ret = 0; size_t name_len = strlen(event_name); uint32_t hash; @@ -546,15 +545,6 @@ int lttng_event_create(const struct lttng_event_desc *desc, hash = jhash(event_name, name_len, 0); head = >session->events_ht.table[hash & (LTTNG_UST_EVENT_HT_SIZE - 1)]; - cds_hlist_for_each_entry(event, node, head, hlist) { - assert(event->desc); - if (!strncmp(event->desc->name, desc->name, - LTTNG_UST_SYM_NAME_LEN - 1) - && chan == event->chan) { - ret = -EEXIST; - goto exist; - } - } notify_socket = lttng_get_notify_socket(session->owner); if (notify_socket < 0) { @@ -623,7 +613,6 @@ sessiond_register_error: cache_error: create_enum_error: socket_error: -exist: return ret; } diff --git a/liblttng-ust/lttng-probes.c b/liblttng-ust/lttng-probes.c index 390265a..a09497f 100644 --- a/liblttng-ust/lttng-probes.c +++ b/liblttng-ust/lttng-probes.c @@ -148,20 +148,6 @@ struct cds_list_head *lttng_get_probe_list_head(void) } static -const struct lttng_probe_desc *find_provider(const char *provider) -{ - struct lttng_probe_desc *iter; - struct cds_list_head *probe_list; - - probe_list = lttng_get_probe_list_head(); - cds_list_for_each_entry(iter, probe_list, head) { - if (!strcmp(iter->provider, provider)) - return iter; - } - return NULL; -} - -static int check_provider_version(struct lttng_probe_desc *desc) { /* @@ -206,13 +192,6 @@ int lttng_probe_register(struct lttng_probe_desc *desc) ust_lock_nocheck(); - /* -* Check if the provider has already been registered. -*/ - if (find_provider(desc->provider)) { - ret = -EEXIST; - goto end; - } cds_list_add(>lazy_init_head, _probe_init); desc->lazy = 1; DBG("adding probe %s containing %u events to lazy registration list", @@ -224,7 +203,7 @@ int lttng_probe_register(struct lttng_probe_desc *desc) */ if (lttng_session_active()) fixup_lazy_probes(); -end: + ust_unlock(); return ret; } -- 2.7.4 ___ lttng-dev mailing list lttng-dev@lists.lttng.org https://lists.lttng.org/cgi-bin/mailman/listinfo/lttng-dev
[lttng-dev] [PATCH lttng-ust 4/8] Add probe provider unregister function
Signed-off-by: Francis Deslauriers <francis.deslauri...@efficios.com> --- include/lttng/ust-events.h | 1 + liblttng-ust/lttng-events.c | 89 + 2 files changed, 90 insertions(+) diff --git a/include/lttng/ust-events.h b/include/lttng/ust-events.h index caf7e63..019b0eb 100644 --- a/include/lttng/ust-events.h +++ b/include/lttng/ust-events.h @@ -656,6 +656,7 @@ void synchronize_trace(void); int lttng_probe_register(struct lttng_probe_desc *desc); void lttng_probe_unregister(struct lttng_probe_desc *desc); +void lttng_probe_provider_unregister_events(struct lttng_probe_desc *desc); int lttng_fix_pending_events(void); int lttng_probes_init(void); void lttng_probes_exit(void); diff --git a/liblttng-ust/lttng-events.c b/liblttng-ust/lttng-events.c index 7419f78..e8d4857 100644 --- a/liblttng-ust/lttng-events.c +++ b/liblttng-ust/lttng-events.c @@ -789,6 +789,95 @@ void lttng_create_event_if_missing(struct lttng_enabler *enabler) } /* + * Iterate over all the UST sessions to unregister and destroy all probes from + * the probe provider descriptor passed in arguments. Must me called with the + * ust_lock held. + */ +void lttng_probe_provider_unregister_events(struct lttng_probe_desc *provider_desc) +{ + int i; + struct cds_list_head *sessionsp; + struct lttng_session *session; + struct cds_hlist_head *head; + struct cds_hlist_node *node; + struct lttng_event *event; + + /* Get handle on list of sessions. */ + sessionsp = _lttng_get_sessions(); + + /* +* Iterate over all events in the probe provider descriptions and sessions +* to queue the unregistration of the events. +*/ + for (i = 0; i < provider_desc->nr_events; i++) { + const char *event_name; + uint32_t hash; + size_t name_len; + const struct lttng_event_desc *event_desc; + + event_desc = provider_desc->event_desc[i]; + event_name = event_desc->name; + name_len = strlen(event_name); + hash = jhash(event_name, name_len, 0); + + /* Iterate over all session to find the current event description. */ + cds_list_for_each_entry(session, sessionsp, node) { + + /* +* Get the list of events in the hashtable bucket and iterate to +* find the event matching this descriptor. +*/ + head = >events_ht.table[hash & (LTTNG_UST_EVENT_HT_SIZE - 1)]; + cds_hlist_for_each_entry(event, node, head, hlist) { + if (event_desc == event->desc) { + + /* Queue the unregistration of this event. */ + _lttng_event_unregister(event); + break; + } + } + } + } + + /* Wait for grace period. */ + synchronize_trace(); + /* Prune the unregistration queue. */ + __tracepoint_probe_prune_release_queue(); + + /* +* It is now safe to destroy the events and remove them from the event list +* and hashtables. +*/ + for (i = 0; i < provider_desc->nr_events; i++) { + const char *event_name; + uint32_t hash; + size_t name_len; + const struct lttng_event_desc *event_desc; + + event_desc = provider_desc->event_desc[i]; + event_name = event_desc->name; + name_len = strlen(event_name); + hash = jhash(event_name, name_len, 0); + + /* Iterate over all sessions to find the current event description. */ + cds_list_for_each_entry(session, sessionsp, node) { + + /* +* Get the list of events in the hashtable bucket and iterate to +* find the event matching this descriptor. +*/ + head = >events_ht.table[hash & (LTTNG_UST_EVENT_HT_SIZE - 1)]; + cds_hlist_for_each_entry(event, node, head, hlist) { + if (event_desc == event->desc) { + _lttng_event_destroy(event); + break; + } + } + } + } +} + +/* * Create events associated with an enabler (if not already present), * and add backward reference from the event to the enabler. */ -- 2.7.4 ___ lttng-dev mailing list lttng-dev@lists.lttng.org https://lists.lttng.org/cgi-bin/mailman/listinfo/lttng-dev
Re: [lttng-dev] How to user perf probes and module tracepoints in lttng
2017-10-12 9:50 GMT-04:00 avkumar <anilz...@gmail.com>: > Francis, > The suggestion you gave works, but the issue I was trying to solve was to be > able to peer into the structures passed to the function and get some > information from that. That is the reason I pulled out the variables in perf > probe. When I use the way you have suggested I am not able to figure out how > to get it to print the skb length and skb address. Is there a way to do it( > skb is passed into those functions?) Hi, LTTng doesn't currently support saving variables and function parameters on --probe (kprobe) and --function (kretprobe) events. Thank you, Francis > Reg the trace point compile error: > I figured that one out. I had to have the source files for the kernel to > get that to work. I could not do with only header file for the kernel. > Once I had the source files and set the KERNELDIR to the root of the source > files ( compiled) it worked. > > Thanks > > > > On Wed, Oct 11, 2017 at 4:49 PM, Francis Deslauriers > <francis.deslauri...@efficios.com> wrote: >> >> Hi, >> 2017-10-11 17:10 GMT-04:00 avkumar <anilz...@gmail.com>: >> > >> > Perf probes: >> > How can we add the dynamic trace points created by perf probe into >> > lttng? When I add the perf probe as kprobe type I get missing tracepoint >> > error, If I add the perf probe as tracepoint , Lttng does not complain but >> > it does not collect any data when the tracepoint is hit. >> > >> > perf probe -l >> > probe:tcp_gro(on tcp_gro_receive@net/ipv4/tcp_offload.c with >> > addr len) >> > >> > lttng enable-event -k --probe=tcp_gro >> >> First, you have to give your probe event a name. >> Second, tcp_gro has to be a kernel symbol. According to the Perf >> output above, the symbol name is `tcp_gro_receive` so the command you >> want to run is: >> lttng enable-event -k --probe=tcp_gro_receive EVENT_NAME >> >> > Error: Missing event name(s). >> > >> > When I add it as a trace point >> > >> > lttng enable-event -k probe:tcp_gro >> > Kernel event probe:tcp_gro created in channel channel0] >> > >> > it does not give any error but no data is collected >> >> It's expected if you don't have a kernel tracepoint named >> "probe:tcp_gro"(you probably don't) currently loaded in your kernel. >> There is no error because there is no way for the kernel tracer if the >> tracepoint is part of an not-yet-loaded kernel module or not. >> "probe:tcp_gro" is a Perf specific description of the kprobe you >> enabled. You can not directly reuse this description in the >> lttng-enable-event command. To use the `lttng enable-event -k >> TRACEPOINT`, try the `lttng list -k` command (with a lttng-sessiond >> running as root) to list the currently available tracepoints. >> >> > >> > >> > >> > Module tracepoints: >> > I created module tracepoints in the kernel and compiled the trace >> > points. The header file is in the driver module directory. When I write the >> > adaptation layer for lttng, it does not compile as it is not able to fien >> > the header file. I have given fill path name to the header file and still >> > it >> > does not work. >> >> Can you give us a bit more details. Could you send us a pastebin of >> the error you get? >> >> Thank you, >> Francis >> >> > >> > >> > Thanks >> > >> > >> > >> > >> > >> > ___ >> > lttng-dev mailing list >> > lttng-dev@lists.lttng.org >> > https://lists.lttng.org/cgi-bin/mailman/listinfo/lttng-dev >> > >> >> >> >> -- >> Francis Deslauriers >> Software developer >> EfficiOS inc. > > -- Francis Deslauriers Software developer EfficiOS inc. ___ lttng-dev mailing list lttng-dev@lists.lttng.org https://lists.lttng.org/cgi-bin/mailman/listinfo/lttng-dev
Re: [lttng-dev] How to user perf probes and module tracepoints in lttng
Hi, 2017-10-11 17:10 GMT-04:00 avkumar <anilz...@gmail.com>: > > Perf probes: > How can we add the dynamic trace points created by perf probe into lttng? > When I add the perf probe as kprobe type I get missing tracepoint error, If I > add the perf probe as tracepoint , Lttng does not complain but it does not > collect any data when the tracepoint is hit. > > perf probe -l > probe:tcp_gro(on tcp_gro_receive@net/ipv4/tcp_offload.c with addr > len) > > lttng enable-event -k --probe=tcp_gro First, you have to give your probe event a name. Second, tcp_gro has to be a kernel symbol. According to the Perf output above, the symbol name is `tcp_gro_receive` so the command you want to run is: lttng enable-event -k --probe=tcp_gro_receive EVENT_NAME > Error: Missing event name(s). > > When I add it as a trace point > > lttng enable-event -k probe:tcp_gro > Kernel event probe:tcp_gro created in channel channel0] > > it does not give any error but no data is collected It's expected if you don't have a kernel tracepoint named "probe:tcp_gro"(you probably don't) currently loaded in your kernel. There is no error because there is no way for the kernel tracer if the tracepoint is part of an not-yet-loaded kernel module or not. "probe:tcp_gro" is a Perf specific description of the kprobe you enabled. You can not directly reuse this description in the lttng-enable-event command. To use the `lttng enable-event -k TRACEPOINT`, try the `lttng list -k` command (with a lttng-sessiond running as root) to list the currently available tracepoints. > > > > Module tracepoints: > I created module tracepoints in the kernel and compiled the trace points. The > header file is in the driver module directory. When I write the adaptation > layer for lttng, it does not compile as it is not able to fien the header > file. I have given fill path name to the header file and still it does not > work. Can you give us a bit more details. Could you send us a pastebin of the error you get? Thank you, Francis > > > Thanks > > > > > > _______ > lttng-dev mailing list > lttng-dev@lists.lttng.org > https://lists.lttng.org/cgi-bin/mailman/listinfo/lttng-dev > -- Francis Deslauriers Software developer EfficiOS inc. ___ lttng-dev mailing list lttng-dev@lists.lttng.org https://lists.lttng.org/cgi-bin/mailman/listinfo/lttng-dev
[lttng-dev] [PATCH lttng-tools V2] Test: Replace test relying pselect6(2) man page ambiguity
The `pselect_fd_too_big` test is checking for the case where the `nfds` is larger than the number of open files allowed for this process (RLIMIT_NOFILE). According to the ERRORS section of the pselect6(2) kernel man page[1], if `nfds` > RLIMIT_NOFILE is evaluate to true the pselect6 syscall should return EINVAL but the BUGS section mentions that the current implementation ignores any FD larger than the highest numbered FD of the current process. This is in fact what happens, the Linux implementation of the pselect6 syscall[2] does not compare the `nfds` and RLIMIT_NOFILE but rather caps `nfds` to the highest numbered FD of the current process as the BUGS kernel man page mentionned. It was observed elsewhere that there is a discrepancy between the manual page and the implementation[3]. As a solution, replace the current testcase with one that checks the behaviour of the syscall when passed an invalid FD. [1]:http://man7.org/linux/man-pages/man2/pselect6.2.html [2]:https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/tree/fs/select.c#n619 [3]:https://patchwork.kernel.org/patch/9345805/ Signed-off-by: Francis Deslauriers <francis.deslauri...@efficios.com> Signed-off-by: Julien Desfossez <jdesfos...@efficios.com> --- tests/regression/kernel/select_poll_epoll.c| 39 +- tests/regression/kernel/test_select_poll_epoll | 6 ++-- .../kernel/validate_select_poll_epoll.py | 13 3 files changed, 33 insertions(+), 25 deletions(-) diff --git a/tests/regression/kernel/select_poll_epoll.c b/tests/regression/kernel/select_poll_epoll.c index 4b703b3..1d767b0 100644 --- a/tests/regression/kernel/select_poll_epoll.c +++ b/tests/regression/kernel/select_poll_epoll.c @@ -437,30 +437,38 @@ void ppoll_fds_ulong_max(void) } /* - * Select is limited to 1024 FDs, should output a pselect event - * with 0 FDs. + * Pass a invalid file descriptor to pselect6(). The syscall should return + * -EBADF. The recorded event should contain a ret=-EBADF (-9). */ -void pselect_fd_too_big(void) +void pselect_invalid_fd(void) { - long rfds[2048 / (sizeof(long) * CHAR_BIT)] = { 0 }; + fd_set rfds; int ret; - int fd2; + int fd; char buf[BUF_SIZE]; /* -* Test if nfds > 1024. -* Make sure ulimit is set correctly (ulimit -n 2048). +* Open a file, close it and use the closed FD in the pselect6 call */ - fd2 = dup2(wait_fd, 2047); - if (fd2 != 2047) { - perror("dup2"); - return; + + fd = open("/dev/null", O_RDONLY); + if (fd == -1) { + perror("open"); + goto error; } - FD_SET(fd2, (fd_set *) ); - ret = syscall(SYS_pselect6, fd2 + 1, , NULL, NULL, NULL, NULL); + ret = close(fd); if (ret == -1) { + perror("close"); + goto error; + } + + FD_ZERO(); + FD_SET(fd, ); + + ret = syscall(SYS_pselect6, fd + 1, , NULL, NULL, NULL, NULL); + if (ret == -1) { perror("# pselect()"); } else if (ret) { printf("# [pselect] data available\n"); @@ -471,7 +479,8 @@ void pselect_fd_too_big(void) } else { printf("# [pselect] timeout\n"); } - +error: + return; } /* @@ -892,7 +901,7 @@ int main(int argc, const char **argv) run_working_cases(); break; case 3: - pselect_fd_too_big(); + pselect_invalid_fd(); break; case 4: test_ppoll_big(); diff --git a/tests/regression/kernel/test_select_poll_epoll b/tests/regression/kernel/test_select_poll_epoll index e01866f..ec034e6 100755 --- a/tests/regression/kernel/test_select_poll_epoll +++ b/tests/regression/kernel/test_select_poll_epoll @@ -126,13 +126,13 @@ function test_timeout_cases() rm -rf $TRACE_PATH } -function test_big_pselect() +function test_pselect_invalid_fd() { TRACE_PATH=$(mktemp -d) SESSION_NAME="syscall_payload" SYSCALL_LIST="pselect6" - diag "pselect with a FD > 1023" + diag "pselect with invalid FD" create_lttng_session_ok $SESSION_NAME $TRACE_PATH @@ -384,7 +384,7 @@ skip $isroot "Root access is needed. Skipping all tests." $NUM_TESTS || test_working_cases test_timeout_cases - test_big_pselect + test_pselect_invalid_fd test_big_ppoll test_ppoll_overflow test_pselect_invalid_ptr diff --git a/tests/regression/kernel/validate_select_poll_epoll.py b/tests/regression/kernel/validate_select_poll_epoll.py index f4946e7..613cec3 100755 --- a/tests/regression/kernel/validate_select_poll_epoll.py +++ b/tests/regression/kernel/validate_select_poll_epo
[lttng-dev] [PATCH lttng-modules] Fix: Build ftrace probe on kernels prior to 4.12
Signed-off-by: Francis Deslauriers <francis.deslauri...@efficios.com> --- probes/Kbuild | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/probes/Kbuild b/probes/Kbuild index fe869d0..78bf3fb 100644 --- a/probes/Kbuild +++ b/probes/Kbuild @@ -267,8 +267,9 @@ ifneq ($(CONFIG_DYNAMIC_FTRACE),) echo "warn" ; \ exit ; \ fi; \ - echo "lttng-ftrace.o" ; \ -fi;) +fi; \ +echo "lttng-ftrace.o" ; \ +) ifeq ($(ftrace),warn) $(warning Files $(ftrace_dep) not found. Probe "ftrace" is disabled. Use full kernel source tree to enable it.) ftrace = -- 2.7.4 ___ lttng-dev mailing list lttng-dev@lists.lttng.org https://lists.lttng.org/cgi-bin/mailman/listinfo/lttng-dev
Re: [lttng-dev] tracing page_faults with lttng?
Hi Milian, Are you running on an x86 processor? The pagefault tracepoints are called : x86_exceptions_page_fault_user, x86_exceptions_page_fault_kernel Can you see those tracepoints when you run: lttng list --kernel Thank you, Francis 2017-05-24 12:00 GMT-04:00 Milian Wolff <milian.wo...@kdab.com>: > Hey all, > > when I trace with perf, I can see page_faults occurring. But when I do > something like the following with lttng: > > lttng create > lttng enable-channel kernel -k > lttng enable-event -c kernel -k -a > lttng start > # trigger page faults > lttng stop > > then I do not see any page faults in tracecompass/babeltrace. What do I > need > to do to see those too? I'm aware that lttng comes with its own set of > tracepoints - i.e. it's not using the same tracepoints that perf knows > about. > But googling shows me e.g. this: > > https://lists.lttng.org/pipermail/lttng-dev/2013-April/019954.html > https://lists.lttng.org/pipermail/lttng-dev/2016-May/026033.html > > Which sounds like the feature should be available in lttng too? > > I'm using the ArchLinux packages in AUR, i.e. version 2.9.2 of LTTng and > kernel 4.10.13-1. > > Thanks > -- > Milian Wolff | milian.wo...@kdab.com | Software Engineer > KDAB (Deutschland) GmbH KG, a KDAB Group company > Tel: +49-30-521325470 > KDAB - The Qt Experts > ___ > lttng-dev mailing list > lttng-dev@lists.lttng.org > https://lists.lttng.org/cgi-bin/mailman/listinfo/lttng-dev > > -- Francis Deslauriers Software developer EfficiOS inc. ___ lttng-dev mailing list lttng-dev@lists.lttng.org https://lists.lttng.org/cgi-bin/mailman/listinfo/lttng-dev
[lttng-dev] [PATCH lttng-modules] Fix: NULL pointer dereference of THIS_MODULE with built-in modules
THIS MODULE is defined to 0 when a module is built-in the kernel [1]. This caused NULL pointer dereference when booting a kernel with the lttng-modules built-in. To fix this issue, add #if guard around the wrapper_lttng_fixup_sig function checking if the MODULE macro is defined to confirm that this piece of code will end up in a module and not in the kernel itself. [1]: linux/include/linux/export.h:32 Fixes: #1107 Signed-off-by: Francis Deslauriers <francis.deslauri...@efficios.com> --- wrapper/tracepoint.h | 8 ++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/wrapper/tracepoint.h b/wrapper/tracepoint.h index 367cdf4..780f9a8 100644 --- a/wrapper/tracepoint.h +++ b/wrapper/tracepoint.h @@ -87,6 +87,10 @@ int wrapper_tracepoint_module_notify(struct notifier_block *nb, } } +#endif /* CONFIG_MODULE_SIG */ + +#if defined(CONFIG_MODULE_SIG) && defined(MODULE) + static inline int wrapper_lttng_fixup_sig(struct module *mod) { @@ -106,7 +110,7 @@ int wrapper_lttng_fixup_sig(struct module *mod) return ret; } -#else /* CONFIG_MODULE_SIG */ +#else /* #if defined(CONFIG_MODULE_SIG) && defined(MODULE) */ static inline int wrapper_lttng_fixup_sig(struct module *mod) @@ -114,6 +118,6 @@ int wrapper_lttng_fixup_sig(struct module *mod) return 0; } -#endif /* #else CONFIG_MODULE_SIG */ +#endif /*#else #if defined(CONFIG_MODULE_SIG) && defined(MODULE) */ #endif /* _LTTNG_WRAPPER_TRACEPOINT_H */ -- 2.7.4 ___ lttng-dev mailing list lttng-dev@lists.lttng.org https://lists.lttng.org/cgi-bin/mailman/listinfo/lttng-dev
[lttng-dev] [PATCH] Test: Replace test relying pselect6(2) man page error
The `pselect_fd_too_big` test is checking for the case where the `nfds` is larger than the number of open files allowed for this process (RLIMIT_NOFILE). According to the man page, if `nfds` > RLIMIT_NOFILE is evaluate to true the pselect6 syscall should return EINVAL. In fact, the Linux implementation of the pselect6 syscall[1] does not compare the `nfds` and RLIMIT_NOFILE but rather caps `nfds` to the highest numbered fd of the current process. It was observed elsewhere that there is a discrepancy between the manual page and the implementation [2]. As a solution, replace the current testcase with one that checks the behaviour of the syscall when passed an invalid FD. [1]:https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/tree/fs/select.c#n619 [2]:https://patchwork.kernel.org/patch/9345805/ Signed-off-by: Francis Deslauriers <francis.deslauri...@efficios.com> Signed-off-by: Julien Desfossez <jdesfos...@efficios.com> --- tests/regression/kernel/select_poll_epoll.c| 39 +- tests/regression/kernel/test_select_poll_epoll | 6 ++-- .../kernel/validate_select_poll_epoll.py | 13 3 files changed, 33 insertions(+), 25 deletions(-) diff --git a/tests/regression/kernel/select_poll_epoll.c b/tests/regression/kernel/select_poll_epoll.c index 4b703b3..1d767b0 100644 --- a/tests/regression/kernel/select_poll_epoll.c +++ b/tests/regression/kernel/select_poll_epoll.c @@ -437,30 +437,38 @@ void ppoll_fds_ulong_max(void) } /* - * Select is limited to 1024 FDs, should output a pselect event - * with 0 FDs. + * Pass a invalid file descriptor to pselect6(). The syscall should return + * -EBADF. The recorded event should contain a ret=-EBADF (-9). */ -void pselect_fd_too_big(void) +void pselect_invalid_fd(void) { - long rfds[2048 / (sizeof(long) * CHAR_BIT)] = { 0 }; + fd_set rfds; int ret; - int fd2; + int fd; char buf[BUF_SIZE]; /* -* Test if nfds > 1024. -* Make sure ulimit is set correctly (ulimit -n 2048). +* Open a file, close it and use the closed FD in the pselect6 call */ - fd2 = dup2(wait_fd, 2047); - if (fd2 != 2047) { - perror("dup2"); - return; + + fd = open("/dev/null", O_RDONLY); + if (fd == -1) { + perror("open"); + goto error; } - FD_SET(fd2, (fd_set *) ); - ret = syscall(SYS_pselect6, fd2 + 1, , NULL, NULL, NULL, NULL); + ret = close(fd); if (ret == -1) { + perror("close"); + goto error; + } + + FD_ZERO(); + FD_SET(fd, ); + + ret = syscall(SYS_pselect6, fd + 1, , NULL, NULL, NULL, NULL); + if (ret == -1) { perror("# pselect()"); } else if (ret) { printf("# [pselect] data available\n"); @@ -471,7 +479,8 @@ void pselect_fd_too_big(void) } else { printf("# [pselect] timeout\n"); } - +error: + return; } /* @@ -892,7 +901,7 @@ int main(int argc, const char **argv) run_working_cases(); break; case 3: - pselect_fd_too_big(); + pselect_invalid_fd(); break; case 4: test_ppoll_big(); diff --git a/tests/regression/kernel/test_select_poll_epoll b/tests/regression/kernel/test_select_poll_epoll index e01866f..ec034e6 100755 --- a/tests/regression/kernel/test_select_poll_epoll +++ b/tests/regression/kernel/test_select_poll_epoll @@ -126,13 +126,13 @@ function test_timeout_cases() rm -rf $TRACE_PATH } -function test_big_pselect() +function test_pselect_invalid_fd() { TRACE_PATH=$(mktemp -d) SESSION_NAME="syscall_payload" SYSCALL_LIST="pselect6" - diag "pselect with a FD > 1023" + diag "pselect with invalid FD" create_lttng_session_ok $SESSION_NAME $TRACE_PATH @@ -384,7 +384,7 @@ skip $isroot "Root access is needed. Skipping all tests." $NUM_TESTS || test_working_cases test_timeout_cases - test_big_pselect + test_pselect_invalid_fd test_big_ppoll test_ppoll_overflow test_pselect_invalid_ptr diff --git a/tests/regression/kernel/validate_select_poll_epoll.py b/tests/regression/kernel/validate_select_poll_epoll.py index f4946e7..613cec3 100755 --- a/tests/regression/kernel/validate_select_poll_epoll.py +++ b/tests/regression/kernel/validate_select_poll_epoll.py @@ -450,8 +450,8 @@ class Test2(TraceParser): class Test3(TraceParser): def __init__(self, trace, pid): super().__init__(trace, pid) -self.expect["select_too_big_in"] = 0 -self.expect["select_too_big_out"] = 0 +self.expect["se
[lttng-dev] [PATCH babeltrace v5] Build Python bindings with distutils for consistent installs
v5: Manually load shared objects used by the Babeltrace Python module This patch changes the build system used to compile and install the Python Bindings. Distutils is used to find the right install directory. When the install directory generated from the install prefix is not in the Python search path (PYTHONPATH), we print a warning explaining what can be done to include it. It uses Distutils which is part of the Python standard library. Signed-off-by: Francis Deslauriers <francis.deslauri...@efficios.com> --- .gitignore| 10 +++- bindings/python/Makefile.am | 57 +- bindings/python/babeltrace/Makefile.am| 30 ++ bindings/python/babeltrace/__init__.py.in | 25 bindings/python/setup.py.in | 84 +++ configure.ac | 14 +++-- m4/python_modules.m4 | 23 tests/bin/intersection/bt_python_helper.py.in | 17 +++--- 8 files changed, 195 insertions(+), 65 deletions(-) create mode 100644 bindings/python/babeltrace/__init__.py.in create mode 100644 bindings/python/setup.py.in delete mode 100644 m4/python_modules.m4 diff --git a/.gitignore b/.gitignore index a7c9e3c..9259b6f 100644 --- a/.gitignore +++ b/.gitignore @@ -47,8 +47,12 @@ converter/babeltrace-log core formats/ctf/metadata/ctf-parser.output stamp-h1 -bindings/python/babeltrace.i -bindings/python/babeltrace.py -bindings/python/babeltrace_wrap.c +bindings/python/setup.py +bindings/python/installed_files.txt +bindings/python/build +bindings/python/babeltrace/__init__.py +bindings/python/babeltrace/babeltrace.i +bindings/python/babeltrace/babeltrace.py +bindings/python/babeltrace/babeltrace_wrap.c babeltrace.pc babeltrace-ctf.pc diff --git a/bindings/python/Makefile.am b/bindings/python/Makefile.am index d6b3648..9e44127 100644 --- a/bindings/python/Makefile.am +++ b/bindings/python/Makefile.am @@ -1,3 +1,58 @@ if USE_PYTHON -SUBDIRS = babeltrace +SUBDIRS = babeltrace . + +INSTALLED_FILES=$(builddir)/installed_files.txt + +AM_CFLAGS = $(PACKAGE_CFLAGS) -I$(top_srcdir)/include -I$(srcdir)/babeltrace/ + +# Since the shared object used by the python bindings is not built with libtool +# we need to manually set the `rpath` during linkage +AM_LDFLAGS=-L$(top_builddir)/formats/ctf/.libs -L$(top_builddir)/lib/.libs +all-local: build-python-bindings.stamp + +$(builddir)/babeltrace/__init__.py: $(srcdir)/babeltrace/__init__.py.in + cd babeltrace && $(MAKE) __init__.py + +$(builddir)/babeltrace/babeltrace.i: $(srcdir)/babeltrace/babeltrace.i.in + cd babeltrace && $(MAKE) babeltrace.i + +BINDINGS_DEPS=setup.py \ + babeltrace/__init__.py \ + babeltrace/babeltrace.i \ + babeltrace/python-complements.c \ + babeltrace/python-complements.h + +BUILD_FLAGS=CC="$(CC)" \ + CFLAGS="$(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(GLIB_CFLAGS) $(AM_CFLAGS)" \ + CPPFLAGS="$(AM_CPPFLAGS) $(CPPFLAGS)" \ + LDFLAGS="$(AM_LDFLAGS) $(LDFLAGS)" + +build-python-bindings.stamp: $(BINDINGS_DEPS) + $(BUILD_FLAGS) $(PYTHON) $(builddir)/setup.py build_ext + $(BUILD_FLAGS) $(PYTHON) $(builddir)/setup.py build + touch $@ + +install-exec-local: build-python-bindings.stamp + @opts="--prefix=$(prefix) --record $(INSTALLED_FILES) --verbose --no-compile $(DISTSETUPOPTS)"; \ + if [ "$(DESTDIR)" != "" ]; then \ + opts="$$opts --root=$(DESTDIR)"; \ + fi; \ + $(PYTHON) $(builddir)/setup.py install $$opts; + +clean-local: + rm -rf $(builddir)/build + +# Distutils' setup.py does not include an uninstall target, we thus need to do +# it manually. We save the path of the files that were installed during the install target +# and delete them during the uninstallation. +uninstall-local: + if [ "$(DESTDIR)" != "" ]; then \ + $(SED) -i "s|^|$(DESTDIR)/|g" $(INSTALLED_FILES); \ + fi + cat $(INSTALLED_FILES) | xargs rm -rf || true + $(GREP) "__init__.py" $(INSTALLED_FILES) | xargs dirname | xargs rm -rf || true + rm -f $(INSTALLED_FILES) + +CLEANFILES = babeltrace/babeltrace_wrap.c babeltrace/babeltrace.py build-python-bindings.stamp +DISTCLEANFILES = setup.py endif diff --git a/bindings/python/babeltrace/Makefile.am b/bindings/python/babeltrace/Makefile.am index 11dcdf0..f612aa6 100644 --- a/bindings/python/babeltrace/Makefile.am +++ b/bindings/python/babeltrace/Makefile.am @@ -1,31 +1,9 @@ +if USE_PYTHON babeltrace.i: babeltrace.i.in sed "s/BABELTRACE_VERSION_STR/Babeltrace $(PACKAGE_VERSION)/g" < \ $(top_srcdir)/bindings/python/babeltrace/babeltrace.i.in > \ $(top_builddir)/bindings/pytho
[lttng-dev] [PATCH lttng-modules] Fix formatting in strutils_star_glob_match_char_cb explanation
Replace tabs for spaces in example scenario Signed-off-by: Francis Deslauriers <francis.deslauri...@efficios.com> --- lttng-string-utils.c | 108 +-- 1 file changed, 54 insertions(+), 54 deletions(-) diff --git a/lttng-string-utils.c b/lttng-string-utils.c index 94de1cf..7485380 100644 --- a/lttng-string-utils.c +++ b/lttng-string-utils.c @@ -145,139 +145,139 @@ retry: * Example: * * candidate: hi ev every onyx one -* ^ +*^ * pattern: hi*every*one -* ^ +*^ * * candidate: hi ev every onyx one -* ^ +* ^ * pattern: hi*every*one -* ^ +* ^ * * candidate: hi ev every onyx one -*^ +* ^ * pattern: hi*every*one -*^ +* ^ * * candidate: hi ev every onyx one -*^ +* ^ * pattern: hi*every*one -* ^ MISMATCH +* ^ MISMATCH * * candidate: hi ev every onyx one -* ^ +* ^ * pattern: hi*every*one -* ^ +* ^ * * candidate: hi ev every onyx one -* ^^ +* ^^ * pattern: hi*every*one -* ^^ +* ^^ * * candidate: hi ev every onyx one -* ^ ^ +* ^ ^ * pattern: hi*every*one -* ^ ^ MISMATCH +* ^ ^ MISMATCH * * candidate: hi ev every onyx one -* ^ +*^ * pattern: hi*every*one -* ^ MISMATCH +* ^ MISMATCH * * candidate: hi ev every onyx one -* ^ +* ^ * pattern: hi*every*one -* ^ MISMATCH +* ^ MISMATCH * * candidate: hi ev every onyx one -*^ +* ^ * pattern: hi*every*one -* ^ +* ^ * * candidate: hi ev every onyx one -*^^ +* ^^ * pattern: hi*every*one -* ^^ +* ^^ * * candidate: hi ev every onyx one -*^ ^ +* ^ ^ * pattern: hi*every*one -* ^ ^ +* ^ ^ * * candidate: hi ev every onyx one -*^ ^ +* ^ ^ * pattern: hi*every*one -* ^ ^ +* ^ ^ * * candidate: hi ev every onyx one -*^ ^ +* ^ ^ * pattern: hi*every*one -* ^ ^ +* ^ ^ * * candidate: hi ev every onyx one -* ^ +* ^ * pattern: hi*every*one -* ^ +*^ * * candidate: hi ev every onyx one -* ^ +* ^ * pattern: hi*every*one -* ^ MISMATCH +* ^ MISMATCH * * candidate: hi ev every onyx one -* ^ +*^ * pattern: hi*every*one -* ^ +* ^ * * candidate: hi ev every onyx one -* ^^ +*^^ * pattern: hi*every*one -* ^^ +* ^^ * * candidate: hi ev every onyx one -* ^ ^ +*^ ^ * pattern: hi*every*one -* ^ ^ MISMATCH +* ^ ^ MISMATCH * * candidate: hi ev every on
[lttng-dev] [PATCH lttng-ust] Fix formatting in strutils_star_glob_match explanation
Replace tabs for spaces in example scenario Signed-off-by: Francis Deslauriers <francis.deslauri...@efficios.com> --- liblttng-ust/string-utils.c | 108 ++-- 1 file changed, 54 insertions(+), 54 deletions(-) diff --git a/liblttng-ust/string-utils.c b/liblttng-ust/string-utils.c index d597da3..cc61038 100644 --- a/liblttng-ust/string-utils.c +++ b/liblttng-ust/string-utils.c @@ -124,139 +124,139 @@ retry: * Example: * * candidate: hi ev every onyx one -* ^ +*^ * pattern: hi*every*one -* ^ +*^ * * candidate: hi ev every onyx one -* ^ +* ^ * pattern: hi*every*one -* ^ +* ^ * * candidate: hi ev every onyx one -*^ +* ^ * pattern: hi*every*one -*^ +* ^ * * candidate: hi ev every onyx one -*^ +* ^ * pattern: hi*every*one -* ^ MISMATCH +* ^ MISMATCH * * candidate: hi ev every onyx one -* ^ +* ^ * pattern: hi*every*one -* ^ +* ^ * * candidate: hi ev every onyx one -* ^^ +* ^^ * pattern: hi*every*one -* ^^ +* ^^ * * candidate: hi ev every onyx one -* ^ ^ +* ^ ^ * pattern: hi*every*one -* ^ ^ MISMATCH +* ^ ^ MISMATCH * * candidate: hi ev every onyx one -* ^ +*^ * pattern: hi*every*one -* ^ MISMATCH +* ^ MISMATCH * * candidate: hi ev every onyx one -* ^ +* ^ * pattern: hi*every*one -* ^ MISMATCH +* ^ MISMATCH * * candidate: hi ev every onyx one -*^ +* ^ * pattern: hi*every*one -* ^ +* ^ * * candidate: hi ev every onyx one -*^^ +* ^^ * pattern: hi*every*one -* ^^ +* ^^ * * candidate: hi ev every onyx one -*^ ^ +* ^ ^ * pattern: hi*every*one -* ^ ^ +* ^ ^ * * candidate: hi ev every onyx one -*^ ^ +* ^ ^ * pattern: hi*every*one -* ^ ^ +* ^ ^ * * candidate: hi ev every onyx one -*^ ^ +* ^ ^ * pattern: hi*every*one -* ^ ^ +* ^ ^ * * candidate: hi ev every onyx one -* ^ +* ^ * pattern: hi*every*one -* ^ +*^ * * candidate: hi ev every onyx one -* ^ +* ^ * pattern: hi*every*one -* ^ MISMATCH +* ^ MISMATCH * * candidate: hi ev every onyx one -* ^ +*^ * pattern: hi*every*one -* ^ +* ^ * * candidate: hi ev every onyx one -* ^^ +*^^ * pattern: hi*every*one -* ^^ +* ^^ * * candidate: hi ev every onyx one -* ^ ^ +*^ ^ * pattern: hi*every*one -* ^ ^ MISMATCH +* ^ ^ MISMATCH * * candidate: hi ev every on
[lttng-dev] [PATCH lttng-modules] Fix: use of uninitialized ret value in lttng_abi_open_metadata_stream
Fixes the following compiler warning: lttng-abi.c: In function ‘lttng_metadata_ioctl’: lttng-abi.c:971:6: warning: ‘ret’ may be used uninitialized in this function [-Wmaybe-uninitialized] int ret; ^ Signed-off-by: Francis Deslauriers <francis.deslauri...@efficios.com> --- lttng-abi.c | 5 - 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/lttng-abi.c b/lttng-abi.c index e193f43..478a591 100644 --- a/lttng-abi.c +++ b/lttng-abi.c @@ -998,8 +998,11 @@ int lttng_abi_open_metadata_stream(struct file *channel_file) goto notransport; } - if (!lttng_kref_get(>metadata_cache->refcount)) + if (!lttng_kref_get(>metadata_cache->refcount)) { + ret = -EOVERFLOW; goto kref_error; + } + ret = lttng_abi_create_stream_fd(channel_file, stream_priv, _metadata_ring_buffer_file_operations); if (ret < 0) -- 2.7.4 ___ lttng-dev mailing list lttng-dev@lists.lttng.org https://lists.lttng.org/cgi-bin/mailman/listinfo/lttng-dev
[lttng-dev] [PATCH lttng-modules v3] Fix: atomic_add_unless() returns true/false rather than prior value
The previous implementation assumed that `atomic_add_unless` returned the prior value of the atomic counter when in fact it returned if the addition was performed (true) or not performed (false). Since `atomic_add_unless` can not return INT_MAX, the `lttng_kref_get` always returned that the call was successful. This issue had a low likelihood of being triggered since the two refcounts of the counters used with this call are both bounded by the maximum number of file descriptors on the system. Signed-off-by: Francis Deslauriers <francis.deslauri...@efficios.com> --- wrapper/kref.h | 6 +- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/wrapper/kref.h b/wrapper/kref.h index eedefbf..f30a9ae 100644 --- a/wrapper/kref.h +++ b/wrapper/kref.h @@ -36,11 +36,7 @@ */ static inline int lttng_kref_get(struct kref *kref) { - if (atomic_add_unless(>refcount, 1, INT_MAX) != INT_MAX) { - return 1; - } else { - return 0; - } + return atomic_add_unless(>refcount, 1, INT_MAX); } #endif /* _LTTNG_WRAPPER_KREF_H */ -- 2.7.4 ___ lttng-dev mailing list lttng-dev@lists.lttng.org https://lists.lttng.org/cgi-bin/mailman/listinfo/lttng-dev
[lttng-dev] [PATCH lttng-modules] Fix: atomic_add_unless() returns true/false rather than prior value
The previous implementation assumed that `atomic_add_unless` returned the prior value of the atomic counter when in fact it returned if addition was successful(true) or overflowed(false). Since `atomic_add_unless` can not return INT_MAX, the `lttng_kref_get` always returned that the call was successful. This issue had a low likelihood of being triggered since the two refcounts of the counters used with this call are both bounded by the maximum number of file descriptors on the system. Signed-off-by: Francis Deslauriers <francis.deslauri...@efficios.com> --- wrapper/kref.h | 6 +- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/wrapper/kref.h b/wrapper/kref.h index eedefbf..f30a9ae 100644 --- a/wrapper/kref.h +++ b/wrapper/kref.h @@ -36,11 +36,7 @@ */ static inline int lttng_kref_get(struct kref *kref) { - if (atomic_add_unless(>refcount, 1, INT_MAX) != INT_MAX) { - return 1; - } else { - return 0; - } + return atomic_add_unless(>refcount, 1, INT_MAX); } #endif /* _LTTNG_WRAPPER_KREF_H */ -- 2.7.4 ___ lttng-dev mailing list lttng-dev@lists.lttng.org https://lists.lttng.org/cgi-bin/mailman/listinfo/lttng-dev
[lttng-dev] [PATCH lttng-modules] Fix: kref changes for kernel 4.11
The underlying type of `struct kref` changed in kernel 4.11 from an atomic_t to a refcount_t. This change was introduced in kernel commit:10383ae. This commit also added a builtin overflow checks to `kref_get()` so we use it. Signed-off-by: Francis Deslauriers <francis.deslauri...@efficios.com> --- wrapper/kref.h | 8 1 file changed, 8 insertions(+) diff --git a/wrapper/kref.h b/wrapper/kref.h index f30a9ae..8db05b5 100644 --- a/wrapper/kref.h +++ b/wrapper/kref.h @@ -34,9 +34,17 @@ * * Return 1 if reference is taken, 0 otherwise (overflow). */ +#if (LINUX_VERSION_CODE >= KERNEL_VERSION(4,11,0)) +static inline int lttng_kref_get(struct kref *kref) +{ + kref_get(kref); + return 1; +} +#else /* #if (LINUX_VERSION_CODE >= KERNEL_VERSION(4,11,0)) */ static inline int lttng_kref_get(struct kref *kref) { return atomic_add_unless(>refcount, 1, INT_MAX); } +#endif /* #else #if (LINUX_VERSION_CODE >= KERNEL_VERSION(4,11,0)) */ #endif /* _LTTNG_WRAPPER_KREF_H */ -- 2.7.4 ___ lttng-dev mailing list lttng-dev@lists.lttng.org https://lists.lttng.org/cgi-bin/mailman/listinfo/lttng-dev
[lttng-dev] [PATCH lttng-modules] Fix: atomic_add_unless() already returns zero on overflow
Signed-off-by: Francis Deslauriers <francis.deslauri...@efficios.com> --- wrapper/kref.h | 6 +- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/wrapper/kref.h b/wrapper/kref.h index eedefbf..f30a9ae 100644 --- a/wrapper/kref.h +++ b/wrapper/kref.h @@ -36,11 +36,7 @@ */ static inline int lttng_kref_get(struct kref *kref) { - if (atomic_add_unless(>refcount, 1, INT_MAX) != INT_MAX) { - return 1; - } else { - return 0; - } + return atomic_add_unless(>refcount, 1, INT_MAX); } #endif /* _LTTNG_WRAPPER_KREF_H */ -- 2.7.4 ___ lttng-dev mailing list lttng-dev@lists.lttng.org https://lists.lttng.org/cgi-bin/mailman/listinfo/lttng-dev
[lttng-dev] [PATCH lttng-modules] Fix: timers cputime_t arguments replaced by ull in kernel 4.11
cputime_t was changed to ull in the kernel commit: 858cf3a Signed-off-by: Francis Deslauriers <francis.deslauri...@efficios.com> --- instrumentation/events/lttng-module/timer.h | 38 + 1 file changed, 38 insertions(+) diff --git a/instrumentation/events/lttng-module/timer.h b/instrumentation/events/lttng-module/timer.h index 9c02c96..d62fd25 100644 --- a/instrumentation/events/lttng-module/timer.h +++ b/instrumentation/events/lttng-module/timer.h @@ -248,6 +248,26 @@ LTTNG_TRACEPOINT_EVENT_INSTANCE_MAP(timer_hrtimer_class, hrtimer_cancel, * zero, otherwise it is started * @expires: the itimers expiry time */ +#if (LINUX_VERSION_CODE >= KERNEL_VERSION(4,11,0)) +LTTNG_TRACEPOINT_EVENT_MAP(itimer_state, + + timer_itimer_state, + + TP_PROTO(int which, const struct itimerval *const value, +unsigned long long expires), + + TP_ARGS(which, value, expires), + + TP_FIELDS( + ctf_integer(int, which, which) + ctf_integer(unsigned long long, expires, expires) + ctf_integer(long, value_sec, value->it_value.tv_sec) + ctf_integer(long, value_usec, value->it_value.tv_usec) + ctf_integer(long, interval_sec, value->it_interval.tv_sec) + ctf_integer(long, interval_usec, value->it_interval.tv_usec) + ) +) +#else /* if (LINUX_VERSION_CODE >= KERNEL_VERSION(4,11,0)) */ LTTNG_TRACEPOINT_EVENT_MAP(itimer_state, timer_itimer_state, @@ -266,6 +286,7 @@ LTTNG_TRACEPOINT_EVENT_MAP(itimer_state, ctf_integer(long, interval_usec, value->it_interval.tv_usec) ) ) +#endif /* #else (LINUX_VERSION_CODE >= KERNEL_VERSION(4,11,0)) */ /** * itimer_expire - called when itimer expires @@ -273,6 +294,22 @@ LTTNG_TRACEPOINT_EVENT_MAP(itimer_state, * @pid: pid of the process which owns the timer * @now: current time, used to calculate the latency of itimer */ +#if (LINUX_VERSION_CODE >= KERNEL_VERSION(4,11,0)) +LTTNG_TRACEPOINT_EVENT_MAP(itimer_expire, + + timer_itimer_expire, + + TP_PROTO(int which, struct pid *pid, unsigned long long now), + + TP_ARGS(which, pid, now), + + TP_FIELDS( + ctf_integer(int , which, which) + ctf_integer(pid_t, pid, pid_nr(pid)) + ctf_integer(unsigned long long, now, now) + ) +) +#else /* if (LINUX_VERSION_CODE >= KERNEL_VERSION(4,11,0)) */ LTTNG_TRACEPOINT_EVENT_MAP(itimer_expire, timer_itimer_expire, @@ -287,6 +324,7 @@ LTTNG_TRACEPOINT_EVENT_MAP(itimer_expire, ctf_integer(cputime_t, now, now) ) ) +#endif /* #else (LINUX_VERSION_CODE >= KERNEL_VERSION(4,11,0)) */ #endif /* LTTNG_TRACE_TIMER_H */ -- 2.7.4 ___ lttng-dev mailing list lttng-dev@lists.lttng.org https://lists.lttng.org/cgi-bin/mailman/listinfo/lttng-dev
[lttng-dev] [PATCH lttng-modules] Fix: update scsi instrumentation for kernel 4.11
Signed-off-by: Francis Deslauriers <francis.deslauri...@efficios.com> --- instrumentation/events/lttng-module/block.h | 154 ++-- 1 file changed, 146 insertions(+), 8 deletions(-) diff --git a/instrumentation/events/lttng-module/block.h b/instrumentation/events/lttng-module/block.h index 4373edf..152609c 100644 --- a/instrumentation/events/lttng-module/block.h +++ b/instrumentation/events/lttng-module/block.h @@ -10,6 +10,10 @@ #include #include +#if (LINUX_VERSION_CODE >= KERNEL_VERSION(4,11,0)) +#include +#endif /* (LINUX_VERSION_CODE >= KERNEL_VERSION(4,11,0)) */ + #ifndef _TRACE_BLOCK_DEF_ #define _TRACE_BLOCK_DEF_ @@ -164,6 +168,7 @@ LTTNG_TRACEPOINT_EVENT_INSTANCE(block_buffer, block_dirty_buffer, ) #endif +#if (LINUX_VERSION_CODE >= KERNEL_VERSION(4,11,0)) LTTNG_TRACEPOINT_EVENT_CLASS_CODE(block_rq_with_error, TP_PROTO(struct request_queue *q, struct request *rq), @@ -178,6 +183,50 @@ LTTNG_TRACEPOINT_EVENT_CLASS_CODE(block_rq_with_error, ), TP_code_pre( + if (blk_rq_is_scsi(rq)) { + struct scsi_request *scsi_rq = scsi_req(rq); + tp_locvar->sector = 0; + tp_locvar->nr_sector = 0; + tp_locvar->cmd = scsi_rq->cmd; + tp_locvar->cmd_len = scsi_rq->cmd_len; + } else { + tp_locvar->sector = blk_rq_pos(rq); + tp_locvar->nr_sector = blk_rq_sectors(rq); + tp_locvar->cmd = NULL; + tp_locvar->cmd_len = 0; + } + ), + + TP_FIELDS( + ctf_integer(dev_t, dev, + rq->rq_disk ? disk_devt(rq->rq_disk) : 0) + ctf_integer(sector_t, sector, tp_locvar->sector) + ctf_integer(unsigned int, nr_sector, tp_locvar->nr_sector) + ctf_integer(int, errors, rq->errors) + blk_rwbs_ctf_integer(unsigned int, rwbs, + lttng_req_op(rq), lttng_req_rw(rq), blk_rq_bytes(rq)) + ctf_sequence_hex(unsigned char, cmd, + tp_locvar->cmd, size_t, tp_locvar->cmd_len) + ), + + TP_code_post() +) +#else /* #if (LINUX_VERSION_CODE >= KERNEL_VERSION(4,11,0)) */ +LTTNG_TRACEPOINT_EVENT_CLASS_CODE(block_rq_with_error, + + TP_PROTO(struct request_queue *q, struct request *rq), + + TP_ARGS(q, rq), + + TP_locvar( + sector_t sector; + unsigned int nr_sector; + unsigned char *cmd; + size_t cmd_len; + ), + + TP_code_pre( + if (rq->cmd_type == REQ_TYPE_BLOCK_PC) { tp_locvar->sector = 0; tp_locvar->nr_sector = 0; @@ -205,6 +254,7 @@ LTTNG_TRACEPOINT_EVENT_CLASS_CODE(block_rq_with_error, TP_code_post() ) +#endif /* #else #if (LINUX_VERSION_CODE >= KERNEL_VERSION(4,11,0)) */ /** * block_rq_abort - abort block operation request @@ -239,14 +289,6 @@ LTTNG_TRACEPOINT_EVENT_INSTANCE(block_rq_with_error, block_rq_requeue, TP_ARGS(q, rq) ) -#if (LINUX_VERSION_CODE >= KERNEL_VERSION(3,14,5) \ - || LTTNG_KERNEL_RANGE(3,12,21, 3,13,0) \ - || LTTNG_KERNEL_RANGE(3,10,41, 3,11,0) \ - || LTTNG_KERNEL_RANGE(3,4,91, 3,5,0)\ - || LTTNG_KERNEL_RANGE(3,2,58, 3,3,0)\ - || LTTNG_UBUNTU_KERNEL_RANGE(3,13,11,28, 3,14,0,0) \ - || LTTNG_RHEL_KERNEL_RANGE(3,10,0,229,0,0, 3,11,0,0,0,0)) - /** * block_rq_complete - block IO operation completed by device driver * @q: queue containing the block operation request @@ -259,6 +301,52 @@ LTTNG_TRACEPOINT_EVENT_INSTANCE(block_rq_with_error, block_rq_requeue, * do for the request. If @rq->bio is non-NULL then there is * additional work required to complete the request. */ +#if (LINUX_VERSION_CODE >= KERNEL_VERSION(4,11,0)) +LTTNG_TRACEPOINT_EVENT_CODE(block_rq_complete, + + TP_PROTO(struct request_queue *q, struct request *rq, +unsigned int nr_bytes), + + TP_ARGS(q, rq, nr_bytes), + + TP_locvar( + unsigned char *cmd; + size_t cmd_len; + ), + + TP_code_pre( + if (blk_rq_is_scsi(rq)) { + struct scsi_request *scsi_rq = scsi_req(rq); + tp_locvar->cmd = scsi_rq->cmd; + tp_locvar->cmd_len = scsi_rq->cmd_len; + } else { + tp_locvar->cmd = NULL; + tp_locvar->cmd_len = 0; + } + ), + + TP_FIELDS( + ctf_integer(dev_t, dev, + rq->rq_disk ? disk_devt(rq->rq_disk) : 0) + ctf_integer(sector_t, sector, blk_rq_pos(rq)) +
[lttng-dev] [PATCH lttng-modules v2] Fix: changes to the vm_op fault cb prototype in libringbuffer
Signed-off-by: Francis Deslauriers <francis.deslauri...@efficios.com> --- lib/ringbuffer/ring_buffer_mmap.c | 15 ++- 1 file changed, 14 insertions(+), 1 deletion(-) diff --git a/lib/ringbuffer/ring_buffer_mmap.c b/lib/ringbuffer/ring_buffer_mmap.c index 35d30e7..4b1b7b3 100644 --- a/lib/ringbuffer/ring_buffer_mmap.c +++ b/lib/ringbuffer/ring_buffer_mmap.c @@ -32,7 +32,7 @@ /* * fault() vm_op implementation for ring buffer file mapping. */ -static int lib_ring_buffer_fault(struct vm_area_struct *vma, struct vm_fault *vmf) +static int lib_ring_buffer_fault_compat(struct vm_area_struct *vma, struct vm_fault *vmf) { struct lib_ring_buffer *buf = vma->vm_private_data; struct channel *chan = buf->backend.chan; @@ -65,6 +65,19 @@ static int lib_ring_buffer_fault(struct vm_area_struct *vma, struct vm_fault *vm return 0; } +#if (LINUX_VERSION_CODE >= KERNEL_VERSION(4,11,0)) +static int lib_ring_buffer_fault(struct vm_fault *vmf) +{ + struct vm_area_struct *vma = vmf->vma; + return lib_ring_buffer_fault_compat(vma, vmf); +} +#else /* #if (LINUX_VERSION_CODE >= KERNEL_VERSION(4,11,0)) */ +static int lib_ring_buffer_fault(struct vm_area_struct *vma, struct vm_fault *vmf) +{ + return lib_ring_buffer_fault_compat(vma, vmf); +} +#endif /* #else #if (LINUX_VERSION_CODE >= KERNEL_VERSION(4,11,0)) */ + /* * vm_ops for ring buffer file mappings. */ -- 2.7.4 ___ lttng-dev mailing list lttng-dev@lists.lttng.org https://lists.lttng.org/cgi-bin/mailman/listinfo/lttng-dev
[lttng-dev] [PATCH lttng-modules] Fix: changes to the vm_op fault cb prototype in libringbuffer
Signed-off-by: Francis Deslauriers <francis.deslauri...@efficios.com> --- lib/ringbuffer/ring_buffer_mmap.c | 6 ++ 1 file changed, 6 insertions(+) diff --git a/lib/ringbuffer/ring_buffer_mmap.c b/lib/ringbuffer/ring_buffer_mmap.c index 35d30e7..1ca45a7 100644 --- a/lib/ringbuffer/ring_buffer_mmap.c +++ b/lib/ringbuffer/ring_buffer_mmap.c @@ -32,8 +32,14 @@ /* * fault() vm_op implementation for ring buffer file mapping. */ +#if (LINUX_VERSION_CODE >= KERNEL_VERSION(4,11,0)) +static int lib_ring_buffer_fault(struct vm_fault *vmf) +{ + struct vm_area_struct *vma = vmf->vma; +#else /* #if (LINUX_VERSION_CODE >= KERNEL_VERSION(4,11,0)) */ static int lib_ring_buffer_fault(struct vm_area_struct *vma, struct vm_fault *vmf) { +#endif /* #else #if (LINUX_VERSION_CODE >= KERNEL_VERSION(4,11,0)) */ struct lib_ring_buffer *buf = vma->vm_private_data; struct channel *chan = buf->backend.chan; const struct lib_ring_buffer_config *config = >backend.config; -- 2.7.4 ___ lttng-dev mailing list lttng-dev@lists.lttng.org https://lists.lttng.org/cgi-bin/mailman/listinfo/lttng-dev
[lttng-dev] [PATCH lttng-modules] Fix: update btrfs instrumentation for kernel 4.11
Signed-off-by: Francis Deslauriers <francis.deslauri...@efficios.com> --- instrumentation/events/lttng-module/btrfs.h | 9 + 1 file changed, 9 insertions(+) diff --git a/instrumentation/events/lttng-module/btrfs.h b/instrumentation/events/lttng-module/btrfs.h index cc7ba50..2955e28 100644 --- a/instrumentation/events/lttng-module/btrfs.h +++ b/instrumentation/events/lttng-module/btrfs.h @@ -87,9 +87,18 @@ LTTNG_TRACEPOINT_EVENT_INSTANCE(btrfs__inode, btrfs_inode_evict, LTTNG_TRACEPOINT_EVENT(btrfs_get_extent, +#if (LINUX_VERSION_CODE >= KERNEL_VERSION(4,11,0)) + + TP_PROTO(struct btrfs_root *root, struct btrfs_inode *inode, + struct extent_map *map), + +#else /* #if (LINUX_VERSION_CODE >= KERNEL_VERSION(4,11,0)) */ + TP_PROTO(struct btrfs_root *root, struct inode *inode, struct extent_map *map), +#endif /* #else #if (LINUX_VERSION_CODE >= KERNEL_VERSION(4,11,0)) */ + TP_ARGS(root, inode, map), TP_FIELDS( -- 2.7.4 ___ lttng-dev mailing list lttng-dev@lists.lttng.org https://lists.lttng.org/cgi-bin/mailman/listinfo/lttng-dev
[lttng-dev] [PATCH lttng-modules] Fix: update mm_vmscan instrumentation for kernel 4.11
Signed-off-by: Francis Deslauriers <francis.deslauri...@efficios.com> --- instrumentation/events/lttng-module/mm_vmscan.h | 62 - 1 file changed, 60 insertions(+), 2 deletions(-) diff --git a/instrumentation/events/lttng-module/mm_vmscan.h b/instrumentation/events/lttng-module/mm_vmscan.h index 36ebd5c..5def917 100644 --- a/instrumentation/events/lttng-module/mm_vmscan.h +++ b/instrumentation/events/lttng-module/mm_vmscan.h @@ -281,8 +281,36 @@ LTTNG_TRACEPOINT_EVENT_MAP(mm_shrink_slab_end, #endif /* #else #if (LINUX_VERSION_CODE >= KERNEL_VERSION(3,16,0)) */ #endif -#if (LINUX_VERSION_CODE >= KERNEL_VERSION(4,8,0)) +#if (LINUX_VERSION_CODE >= KERNEL_VERSION(4,11,0)) +LTTNG_TRACEPOINT_EVENT(mm_vmscan_lru_isolate, + + TP_PROTO(int classzone_idx, + int order, + unsigned long nr_requested, + unsigned long nr_scanned, + unsigned long nr_skipped, + unsigned long nr_taken, + isolate_mode_t isolate_mode, + int lru + ), + TP_ARGS(classzone_idx, order, nr_requested, nr_scanned, nr_skipped, + nr_taken, isolate_mode, lru + ), + + TP_FIELDS( + ctf_integer(int, classzone_idx, classzone_idx) + ctf_integer(int, order, order) + ctf_integer(unsigned long, nr_requested, nr_requested) + ctf_integer(unsigned long, nr_scanned, nr_scanned) + ctf_integer(unsigned long, nr_skipped, nr_skipped) + ctf_integer(unsigned long, nr_taken, nr_taken) + ctf_integer(isolate_mode_t, isolate_mode, isolate_mode) + ctf_integer(int, lru, lru) + ) +) + +#elif (LINUX_VERSION_CODE >= KERNEL_VERSION(4,8,0)) LTTNG_TRACEPOINT_EVENT_CLASS(mm_vmscan_lru_isolate_template, TP_PROTO(int classzone_idx, @@ -485,7 +513,37 @@ LTTNG_TRACEPOINT_EVENT(mm_vmscan_writepage, ) #endif -#if (LINUX_VERSION_CODE >= KERNEL_VERSION(4,8,0)) +#if (LINUX_VERSION_CODE >= KERNEL_VERSION(4,11,0)) +LTTNG_TRACEPOINT_EVENT(mm_vmscan_lru_shrink_inactive, + + TP_PROTO(int nid, + unsigned long nr_scanned, unsigned long nr_reclaimed, + unsigned long nr_dirty, unsigned long nr_writeback, + unsigned long nr_congested, unsigned long nr_immediate, + unsigned long nr_activate, unsigned long nr_ref_keep, + unsigned long nr_unmap_fail, + int priority, int file), + + TP_ARGS(nid, nr_scanned, nr_reclaimed, nr_dirty, nr_writeback, + nr_congested, nr_immediate, nr_activate, nr_ref_keep, + nr_unmap_fail, priority, file), + + TP_FIELDS( + ctf_integer(int, nid, nid) + ctf_integer(unsigned long, nr_scanned, nr_scanned) + ctf_integer(unsigned long, nr_reclaimed, nr_reclaimed) + ctf_integer(unsigned long, nr_dirty, nr_dirty) + ctf_integer(unsigned long, nr_writeback, nr_writeback) + ctf_integer(unsigned long, nr_congested, nr_congested) + ctf_integer(unsigned long, nr_immediate, nr_immediate) + ctf_integer(unsigned long, nr_activate, nr_activate) + ctf_integer(unsigned long, nr_ref_keep, nr_ref_keep) + ctf_integer(unsigned long, nr_unmap_fail, nr_unmap_fail) + ctf_integer(int, priority, priority) + ctf_integer(int, reclaim_flags, trace_shrink_flags(file)) + ) +) +#elif (LINUX_VERSION_CODE >= KERNEL_VERSION(4,8,0)) LTTNG_TRACEPOINT_EVENT(mm_vmscan_lru_shrink_inactive, TP_PROTO(int nid, -- 2.7.4 ___ lttng-dev mailing list lttng-dev@lists.lttng.org https://lists.lttng.org/cgi-bin/mailman/listinfo/lttng-dev
[lttng-dev] [PATCH lttng-modules] Fix: section mismatch warning caused by __exit annotation
lttng_logger_exit is used in a non-exit function so it can not be annotated with `__exit` Signed-off-by: Francis Deslauriers <francis.deslauri...@efficios.com> --- probes/lttng.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/probes/lttng.c b/probes/lttng.c index 58aa515..8810fa2 100644 --- a/probes/lttng.c +++ b/probes/lttng.c @@ -129,7 +129,7 @@ error: return ret; } -void __exit lttng_logger_exit(void) +void lttng_logger_exit(void) { __lttng_events_exit__lttng(); if (lttng_logger_dentry) -- 2.7.4 ___ lttng-dev mailing list lttng-dev@lists.lttng.org https://lists.lttng.org/cgi-bin/mailman/listinfo/lttng-dev
[lttng-dev] [PATCH babeltrace v4] Build Python bindings with distutils for consistent installs
v4: Fix DESTDIR behaviour on (un)install targets. This patch changes the build system used to compile and install the Python Bindings. Distutils is used to find the right install directory. When the install directory generated from the install prefix is not in the Python search path (PYTHONPATH), we print a warning explaining what can be done to include it. It uses Distutils which is part of the Python standard library. Signed-off-by: Francis Deslauriers <francis.deslauri...@efficios.com> --- .gitignore| 10 +++- bindings/python/Makefile.am | 58 +- bindings/python/babeltrace/Makefile.am| 30 ++ bindings/python/babeltrace/__init__.py.in | 25 bindings/python/setup.py.in | 84 +++ configure.ac | 14 +++-- m4/python_modules.m4 | 23 tests/bin/intersection/bt_python_helper.py.in | 8 +-- 8 files changed, 187 insertions(+), 65 deletions(-) create mode 100644 bindings/python/babeltrace/__init__.py.in create mode 100644 bindings/python/setup.py.in delete mode 100644 m4/python_modules.m4 diff --git a/.gitignore b/.gitignore index a7c9e3c..9259b6f 100644 --- a/.gitignore +++ b/.gitignore @@ -47,8 +47,12 @@ converter/babeltrace-log core formats/ctf/metadata/ctf-parser.output stamp-h1 -bindings/python/babeltrace.i -bindings/python/babeltrace.py -bindings/python/babeltrace_wrap.c +bindings/python/setup.py +bindings/python/installed_files.txt +bindings/python/build +bindings/python/babeltrace/__init__.py +bindings/python/babeltrace/babeltrace.i +bindings/python/babeltrace/babeltrace.py +bindings/python/babeltrace/babeltrace_wrap.c babeltrace.pc babeltrace-ctf.pc diff --git a/bindings/python/Makefile.am b/bindings/python/Makefile.am index d6b3648..0009546 100644 --- a/bindings/python/Makefile.am +++ b/bindings/python/Makefile.am @@ -1,3 +1,59 @@ if USE_PYTHON -SUBDIRS = babeltrace +SUBDIRS = babeltrace . + +INSTALLED_FILES=$(builddir)/installed_files.txt + +AM_CFLAGS = $(PACKAGE_CFLAGS) -I$(top_srcdir)/include -I$(srcdir)/babeltrace/ + +# Since the shared object used by the python bindings is not built with libtool +# we need to manually set the `rpath` during linkage +AM_LDFLAGS=-L$(top_builddir)/formats/ctf/.libs -L$(top_builddir)/lib/.libs -Wl,-rpath,$(prefix)/lib + +all-local: build-python-bindings.stamp + +$(builddir)/babeltrace/__init__.py: $(srcdir)/babeltrace/__init__.py.in + cd babeltrace && $(MAKE) __init__.py + +$(builddir)/babeltrace/babeltrace.i: $(srcdir)/babeltrace/babeltrace.i.in + cd babeltrace && $(MAKE) babeltrace.i + +BINDINGS_DEPS=setup.py \ + babeltrace/__init__.py \ + babeltrace/babeltrace.i \ + babeltrace/python-complements.c \ + babeltrace/python-complements.h + +BUILD_FLAGS=CC="$(CC)" \ + CFLAGS="$(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(GLIB_CFLAGS) $(AM_CFLAGS)" \ + CPPFLAGS="$(AM_CPPFLAGS) $(CPPFLAGS)" \ + LDFLAGS="$(AM_LDFLAGS) $(LDFLAGS)" + +build-python-bindings.stamp: $(BINDINGS_DEPS) + $(BUILD_FLAGS) $(PYTHON) $(builddir)/setup.py build_ext + $(BUILD_FLAGS) $(PYTHON) $(builddir)/setup.py build + touch $@ + +install-exec-local: build-python-bindings.stamp + @opts="--prefix=$(prefix) --record $(INSTALLED_FILES) --verbose --no-compile $(DISTSETUPOPTS)"; \ + if [ "$(DESTDIR)" != "" ]; then \ + opts="$$opts --root=$(DESTDIR)"; \ + fi; \ + $(PYTHON) $(builddir)/setup.py install $$opts; + +clean-local: + rm -rf $(builddir)/build + +# Distutils' setup.py does not include an uninstall target, we thus need to do +# it manually. We save the path of the files that were installed during the install target +# and delete them during the uninstallation. +uninstall-local: + if [ "$(DESTDIR)" != "" ]; then \ + $(SED) -i "s|^|$(DESTDIR)/|g" $(INSTALLED_FILES); \ + fi + cat $(INSTALLED_FILES) | xargs rm -rf || true + $(GREP) "__init__.py" $(INSTALLED_FILES) | xargs dirname | xargs rm -rf || true + rm -f $(INSTALLED_FILES) + +CLEANFILES = babeltrace/babeltrace_wrap.c babeltrace/babeltrace.py build-python-bindings.stamp +DISTCLEANFILES = setup.py endif diff --git a/bindings/python/babeltrace/Makefile.am b/bindings/python/babeltrace/Makefile.am index 11dcdf0..f612aa6 100644 --- a/bindings/python/babeltrace/Makefile.am +++ b/bindings/python/babeltrace/Makefile.am @@ -1,31 +1,9 @@ +if USE_PYTHON babeltrace.i: babeltrace.i.in sed "s/BABELTRACE_VERSION_STR/Babeltrace $(PACKAGE_VERSION)/g" < \ $(top_srcdir)/bindings/python/babeltrace/babeltrace.i.in > \ $(top_builddir)/
[lttng-dev] [PATCH lttng-ust v2] Fix: (un)install targets of Python agent
This Makefile was using Distutils' setup.py to install the Python agent but was using the Autoconf's $pkgpythondir variable for the uninstall process. The two folders can be different on some distributions which made the uninstall attempting to delete a non-existant folder and effectively not uninstalling. We now run a phony installation of the bindings in a temporary directory and use the tree structure of the install folder to infere the location of the files on the system to delete them. Also, we print a warning if the install directory is not included in the PYTHONPATH variable. Signed-off-by: Francis Deslauriers <francis.deslauri...@efficios.com> --- python-lttngust/Makefile.am | 38 --- python-lttngust/setup.py.in | 64 + 2 files changed, 77 insertions(+), 25 deletions(-) diff --git a/python-lttngust/Makefile.am b/python-lttngust/Makefile.am index cc28989..c5bb167 100644 --- a/python-lttngust/Makefile.am +++ b/python-lttngust/Makefile.am @@ -1,7 +1,6 @@ # Use setup.py for the installation instead of Autoconf. # This ease the installation process and assure a *pythonic* # installation. -agent_path=lttngust all-local: $(PYTHON) setup.py build --verbose @@ -13,13 +12,34 @@ install-exec-local: $(PYTHON) setup.py install $$opts; clean-local: - rm -rf build + rm -rf $(builddir)/build -uninstall-local: - rm -rf $(DESTDIR)$(pkgpythondir) - -EXTRA_DIST=$(agent_path) +# Distutils' setup.py does not include an uninstall target, we thus need to do +# it manually. We fake an install in a temporary folder and use the generated +# tree structure to infere the actual location within the install prefix. +# 1. Create temporary file and folder +# 2. Set the root install folder for a temporary folder +# 3. Install in that temporary folder and record all the files installed +# 4. If DESTDIR is set, prepend it to the paths of the install files +# 5. Remove the installed files and the Python package folder +# 6. Remove the files created by this target -# Remove automake generated file before dist -dist-hook: - rm -rf $(distdir)/$(agent_path)/__init__.py +uninstall-local: + $(eval TMP_INSTALLED_FILES:=$(shell mktemp $(builddir)/tmp-installed-files-XX)) + $(eval TMP_INSTALL_DIR:=$(shell mktemp -d $(builddir)/tmp-install-dir-XX)) + $(eval TMP_BUILD_DIR:=$(shell mktemp -d $(builddir)/tmp-build-dir-XX)) + @opts="--root=$(TMP_INSTALL_DIR) --prefix=$(prefix) --record $(TMP_INSTALLED_FILES) --no-compile $(DISTSETUPOPTS)"; \ + if [ "$(DESTDIR)" != "" ]; then \ + opts="$$opts --root=$(DESTDIR)"; \ + else \ + opts="$$opts --root=$(TMP_INSTALL_DIR)"; \ + fi; \ + $(PYTHON) setup.py build --build-base $(TMP_BUILD_DIR) install $$opts ; \ + if [ "$(DESTDIR)" != "" ]; then \ + $(SED) -i "s|^|$(DESTDIR)/|g" $(TMP_INSTALLED_FILES); \ + fi; \ + cat $(TMP_INSTALLED_FILES) | xargs rm -rf + $(GREP) "__init__.py" $(TMP_INSTALLED_FILES) | xargs dirname | xargs rm -rf + rm -f $(TMP_INSTALLED_FILES) + rm -rf $(TMP_INSTALL_DIR) + rm -rf $(TMP_BUILD_DIR) diff --git a/python-lttngust/setup.py.in b/python-lttngust/setup.py.in index 370fd61..303d624 100644 --- a/python-lttngust/setup.py.in +++ b/python-lttngust/setup.py.in @@ -15,22 +15,54 @@ # along with this library; if not, write to the Free Software Foundation, Inc., # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +import os +import sys + from distutils.core import setup, Extension +PY_PATH_WARN_MSG = """ +-WARNING +The install directory used:\n ({0})\nis not included in your PYTHONPATH. + +To add this directory to your Python search path permanently you can add the +following command to your .bashrc/.zshrc: +export PYTHONPATH="${{PYTHONPATH}}:{0}" + +""" + +def main(): +dist = setup(name='lttngust', +version='@PACKAGE_VERSION@', +description='LTTng-UST Python agent', +packages=['lttngust'], +package_dir={'lttngust': 'lttngust'}, +options={'build': {'build_base': 'build'}}, +url='http://lttng.org', +license='LGPL-2.1', +classifiers=[ +'Development Status :: 5 - Production/Stable', +'Intended Audience :: Developers', +'License :: OSI Approved :: GNU Lesser General Public License v2 (LGPLv2)', +'Programming Language :: Python :: 2.7', +'Programming Language :: Python :: 3' +'Topic :: System :: Logging', +]) + +#
[lttng-dev] [PATCH lttng-ust] Fix: (un)install targets of Python agent
This Makefile was using Distutils' setup.py to install the Python agent but was using the Autoconf's $pkgpythondir variable for the uninstall process. The two folders can be different on some distributions which made the uninstall attempting to delete a non-existant folder and effectively not uninstalling. We now save the paths of the installed files and use this information during the uninstallation. Also, we print a warning if the install directory is not included in the PYTHONPATH variable. Signed-off-by: Francis Deslauriers <francis.deslauri...@efficios.com> --- .gitignore | 1 + python-lttngust/Makefile.am | 22 python-lttngust/setup.py.in | 62 + 3 files changed, 59 insertions(+), 26 deletions(-) diff --git a/.gitignore b/.gitignore index 0d322b1..fe43230 100644 --- a/.gitignore +++ b/.gitignore @@ -86,3 +86,4 @@ python-lttngust/lttngust/__init__.py python-lttngust/**/*.pyc python-lttngust/build python-lttngust/setup.py +python-lttngust/installed_files.txt diff --git a/python-lttngust/Makefile.am b/python-lttngust/Makefile.am index cc28989..d7c2071 100644 --- a/python-lttngust/Makefile.am +++ b/python-lttngust/Makefile.am @@ -1,25 +1,27 @@ # Use setup.py for the installation instead of Autoconf. # This ease the installation process and assure a *pythonic* # installation. -agent_path=lttngust +INSTALLED_FILES=$(builddir)/installed_files.txt all-local: $(PYTHON) setup.py build --verbose +# This target installs the Python package and saves the path of all the +# installed files in the INSTALLED_FILES text file to be used during this +# uninstallation install-exec-local: - @opts="--prefix=$(prefix) --verbose --no-compile $(DISTSETUPOPTS)"; \ + @opts="--prefix=$(prefix) --verbose --record $(INSTALLED_FILES) --no-compile $(DISTSETUPOPTS)"; \ if [ "$(DESTDIR)" != "" ]; then \ opts="$$opts --root=$(DESTDIR)"; \ fi; \ $(PYTHON) setup.py install $$opts; clean-local: - rm -rf build + rm -rf $(builddir)/build +# Distutils' setup.py does not include an uninstall target, we thus need to do +# it manually. We use the INSTALLED_FILES file produced during the install to +# clean up the install folder and delete the folder it self. uninstall-local: - rm -rf $(DESTDIR)$(pkgpythondir) - -EXTRA_DIST=$(agent_path) - -# Remove automake generated file before dist -dist-hook: - rm -rf $(distdir)/$(agent_path)/__init__.py + cat $(INSTALLED_FILES) | xargs rm -rf + cat $(INSTALLED_FILES) | $(GREP) "__init__.py" | xargs dirname | xargs rmdir + rm -f $(INSTALLED_FILES) diff --git a/python-lttngust/setup.py.in b/python-lttngust/setup.py.in index 370fd61..89cd5f0 100644 --- a/python-lttngust/setup.py.in +++ b/python-lttngust/setup.py.in @@ -15,22 +15,52 @@ # along with this library; if not, write to the Free Software Foundation, Inc., # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +import sys + from distutils.core import setup, Extension +PY_PATH_WARN_MSG = """ +-WARNING +The install directory used:\n ({})\nis not included in your PYTHONPATH. + +To add this directory to your Python search path permanently you can add the +following command to your .bashrc/.zshrc: +export PYTHONPATH="${{PYTHONPATH}}:{}" + +""" + +def main(): +dist = setup(name='lttngust', +version='@PACKAGE_VERSION@', +description='LTTng-UST Python agent', +packages=['lttngust'], +package_dir={'lttngust': 'lttngust'}, +options={'build': {'build_base': 'build'}}, +url='http://lttng.org', +license='LGPL-2.1', +classifiers=[ +'Development Status :: 5 - Production/Stable', +'Intended Audience :: Developers', +'License :: OSI Approved :: GNU Lesser General Public License v2 (LGPLv2)', +'Programming Language :: Python :: 2.7', +'Programming Language :: Python :: 3' +'Topic :: System :: Logging', +]) + +# After the installation, we check that the install directory is included in +# the Python search path and we print a warning message when it's not. We need +# to do this because Python search path differs depending on the distro and +# some distros don't include any `/usr/local/` (the default install prefix) in +# the search path. This is also useful for out-of-tree installs and tests. It's +# only relevant to make this check on the `install` command. + +if 'install' in dist.command_obj: +install_dir = dist.command_obj['install'].install_libbase +
[lttng-dev] [PATCH babeltrace v3] Build Python bindings with distutils for consistent installs
v3: changes PYTHON_PATH -> PYTHONPATH in commit message and warning message. This patch changes the build system used to compile and install the Python Bindings. Distutils is used to find the right install directory. When the install directory generated from the install prefix is not in the Python search path (PYTHONPATH), we print a warning explaining what can be done to include it. It uses Distutils which is part of the Python standard library. Signed-off-by: Francis Deslauriers <francis.deslauri...@efficios.com> --- .gitignore| 10 +++- bindings/python/Makefile.am | 58 +- bindings/python/babeltrace/Makefile.am| 30 ++ bindings/python/babeltrace/__init__.py.in | 25 bindings/python/setup.py.in | 85 +++ configure.ac | 13 ++-- m4/python_modules.m4 | 23 tests/bin/intersection/bt_python_helper.py.in | 8 +-- 8 files changed, 187 insertions(+), 65 deletions(-) create mode 100644 bindings/python/babeltrace/__init__.py.in create mode 100644 bindings/python/setup.py.in delete mode 100644 m4/python_modules.m4 diff --git a/.gitignore b/.gitignore index a7c9e3c..9259b6f 100644 --- a/.gitignore +++ b/.gitignore @@ -47,8 +47,12 @@ converter/babeltrace-log core formats/ctf/metadata/ctf-parser.output stamp-h1 -bindings/python/babeltrace.i -bindings/python/babeltrace.py -bindings/python/babeltrace_wrap.c +bindings/python/setup.py +bindings/python/installed_files.txt +bindings/python/build +bindings/python/babeltrace/__init__.py +bindings/python/babeltrace/babeltrace.i +bindings/python/babeltrace/babeltrace.py +bindings/python/babeltrace/babeltrace_wrap.c babeltrace.pc babeltrace-ctf.pc diff --git a/bindings/python/Makefile.am b/bindings/python/Makefile.am index d6b3648..37ae14e 100644 --- a/bindings/python/Makefile.am +++ b/bindings/python/Makefile.am @@ -1,3 +1,59 @@ if USE_PYTHON -SUBDIRS = babeltrace +SUBDIRS = babeltrace . + +AM_CFLAGS = $(PACKAGE_CFLAGS) -I$(top_srcdir)/include -I$(srcdir)/babeltrace/ + +# Since the shared object used by the python bindings is not built with libtool +# we need to manually set the `rpath` during linkage +AM_LDFLAGS=-L$(top_builddir)/formats/ctf/.libs -L$(top_builddir)/lib/.libs -Wl,-rpath,$(prefix)/lib + +INSTALLED_FILES=installed_files.txt + +all-local: build-python-bindings.stamp + +$(builddir)/babeltrace/__init__.py: $(srcdir)/babeltrace/__init__.py.in + cd babeltrace && $(MAKE) __init__.py + +$(builddir)/babeltrace/babeltrace.i: $(srcdir)/babeltrace/babeltrace.i.in + cd babeltrace && $(MAKE) babeltrace.i + +BINDINGS_DEPS=setup.py \ + babeltrace/__init__.py \ + babeltrace/babeltrace.i \ + babeltrace/python-complements.c \ + babeltrace/python-complements.h + +BUILD_FLAGS=CC="$(CC)" \ + CFLAGS="$(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(GLIB_CFLAGS) $(AM_CFLAGS)" \ + CPPFLAGS="$(AM_CPPFLAGS) $(CPPFLAGS)" \ + LDFLAGS="$(AM_LDFLAGS) $(LDFLAGS)" + +build-python-bindings.stamp: $(BINDINGS_DEPS) + $(BUILD_FLAGS) $(PYTHON) $(builddir)/setup.py build_ext + $(BUILD_FLAGS) $(PYTHON) $(builddir)/setup.py build + touch $@ + +# This target installs the Python package and saves the path of all the +# installed files in the INSTALLED_FILES text file to be used during this +# uninstallation +install-exec-local: + @opts="--prefix=$(prefix) --verbose --record $(INSTALLED_FILES) --no-compile $(DISTSETUPOPTS)"; \ + if [ "$(DESTDIR)" != "" ]; then \ + opts="$$opts --root=$(DESTDIR)"; \ + fi; \ + $(PYTHON) $(builddir)/setup.py install $$opts; + +clean-local: + rm -rf $(builddir)/build + +# Distutils' setup.py does not include an uninstall target, we thus need to do it +# manually. We use the INSTALLED_FILES file produced during the install to +# clean up the install folder and delete the folder it self. +uninstall-local: + cat $(builddir)/$(INSTALLED_FILES) | xargs rm -rf + cat $(builddir)/$(INSTALLED_FILES) | $(GREP) "__init__.py" | xargs dirname | xargs rmdir + rm -f $(builddir)/$(INSTALLED_FILES) + +CLEANFILES = babeltrace/babeltrace_wrap.c babeltrace/babeltrace.py build-python-bindings.stamp +DISTCLEANFILES = setup.py endif diff --git a/bindings/python/babeltrace/Makefile.am b/bindings/python/babeltrace/Makefile.am index 11dcdf0..f612aa6 100644 --- a/bindings/python/babeltrace/Makefile.am +++ b/bindings/python/babeltrace/Makefile.am @@ -1,31 +1,9 @@ +if USE_PYTHON babeltrace.i: babeltrace.i.in sed "s/BABELTRACE_VERSION_STR/Babeltrace $(PACKAGE_VERSION)/g" < \ $(top_srcdir)/bindings/python/babeltrace/babeltrace.i.in >
[lttng-dev] [PATCH babeltrace] Set the minimum Python version to 3.0
To be applied on Babeltrace v1.5 Signed-off-by: Francis Deslauriers <francis.deslauri...@efficios.com> --- configure.ac | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/configure.ac b/configure.ac index fd80fd9..7d9b66e 100644 --- a/configure.ac +++ b/configure.ac @@ -239,7 +239,7 @@ AM_CONDITIONAL([USE_PYTHON], [test "x${enable_python:-yes}" = xyes]) if test "x${enable_python:-yes}" = xyes; then AX_PKG_SWIG($swig_version, [], [ AC_MSG_ERROR([SWIG $swig_version or newer is needed]) ]) - AM_PATH_PYTHON + AM_PATH_PYTHON([3.0], [], [ AC_MSG_ERROR([Python 3.0 or newer is needed]) ]) AC_ARG_VAR([PYTHON_INCLUDE], [Include flags for python, bypassing python-config]) AC_ARG_VAR([PYTHON_CONFIG], [Path to python-config]) -- 2.7.4 ___ lttng-dev mailing list lttng-dev@lists.lttng.org https://lists.lttng.org/cgi-bin/mailman/listinfo/lttng-dev
[lttng-dev] [PATCH babeltrace v2] Build Python bindings with distutils for consistent installs
This patch changes the build system used to compile and install the Python Bindings. Distutils is used to find the right install directory. When the install directory generated from the install prefix is not in the Python search path (PYTHON_PATH), we print a warning explaining what can be done to include it. It uses Distutils which is part of the Python standard library. To be applied on Babeltrace v1.5 Signed-off-by: Francis Deslauriers <francis.deslauri...@efficios.com> --- .gitignore| 10 +++- bindings/python/Makefile.am | 58 +- bindings/python/babeltrace/Makefile.am| 30 ++ bindings/python/babeltrace/__init__.py.in | 25 bindings/python/setup.py.in | 85 +++ configure.ac | 13 ++-- m4/python_modules.m4 | 23 tests/bin/intersection/bt_python_helper.py.in | 8 +-- 8 files changed, 187 insertions(+), 65 deletions(-) create mode 100644 bindings/python/babeltrace/__init__.py.in create mode 100644 bindings/python/setup.py.in delete mode 100644 m4/python_modules.m4 diff --git a/.gitignore b/.gitignore index a7c9e3c..9259b6f 100644 --- a/.gitignore +++ b/.gitignore @@ -47,8 +47,12 @@ converter/babeltrace-log core formats/ctf/metadata/ctf-parser.output stamp-h1 -bindings/python/babeltrace.i -bindings/python/babeltrace.py -bindings/python/babeltrace_wrap.c +bindings/python/setup.py +bindings/python/installed_files.txt +bindings/python/build +bindings/python/babeltrace/__init__.py +bindings/python/babeltrace/babeltrace.i +bindings/python/babeltrace/babeltrace.py +bindings/python/babeltrace/babeltrace_wrap.c babeltrace.pc babeltrace-ctf.pc diff --git a/bindings/python/Makefile.am b/bindings/python/Makefile.am index d6b3648..37ae14e 100644 --- a/bindings/python/Makefile.am +++ b/bindings/python/Makefile.am @@ -1,3 +1,59 @@ if USE_PYTHON -SUBDIRS = babeltrace +SUBDIRS = babeltrace . + +AM_CFLAGS = $(PACKAGE_CFLAGS) -I$(top_srcdir)/include -I$(srcdir)/babeltrace/ + +# Since the shared object used by the python bindings is not built with libtool +# we need to manually set the `rpath` during linkage +AM_LDFLAGS=-L$(top_builddir)/formats/ctf/.libs -L$(top_builddir)/lib/.libs -Wl,-rpath,$(prefix)/lib + +INSTALLED_FILES=installed_files.txt + +all-local: build-python-bindings.stamp + +$(builddir)/babeltrace/__init__.py: $(srcdir)/babeltrace/__init__.py.in + cd babeltrace && $(MAKE) __init__.py + +$(builddir)/babeltrace/babeltrace.i: $(srcdir)/babeltrace/babeltrace.i.in + cd babeltrace && $(MAKE) babeltrace.i + +BINDINGS_DEPS=setup.py \ + babeltrace/__init__.py \ + babeltrace/babeltrace.i \ + babeltrace/python-complements.c \ + babeltrace/python-complements.h + +BUILD_FLAGS=CC="$(CC)" \ + CFLAGS="$(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(GLIB_CFLAGS) $(AM_CFLAGS)" \ + CPPFLAGS="$(AM_CPPFLAGS) $(CPPFLAGS)" \ + LDFLAGS="$(AM_LDFLAGS) $(LDFLAGS)" + +build-python-bindings.stamp: $(BINDINGS_DEPS) + $(BUILD_FLAGS) $(PYTHON) $(builddir)/setup.py build_ext + $(BUILD_FLAGS) $(PYTHON) $(builddir)/setup.py build + touch $@ + +# This target installs the Python package and saves the path of all the +# installed files in the INSTALLED_FILES text file to be used during this +# uninstallation +install-exec-local: + @opts="--prefix=$(prefix) --verbose --record $(INSTALLED_FILES) --no-compile $(DISTSETUPOPTS)"; \ + if [ "$(DESTDIR)" != "" ]; then \ + opts="$$opts --root=$(DESTDIR)"; \ + fi; \ + $(PYTHON) $(builddir)/setup.py install $$opts; + +clean-local: + rm -rf $(builddir)/build + +# Distutils' setup.py does not include an uninstall target, we thus need to do it +# manually. We use the INSTALLED_FILES file produced during the install to +# clean up the install folder and delete the folder it self. +uninstall-local: + cat $(builddir)/$(INSTALLED_FILES) | xargs rm -rf + cat $(builddir)/$(INSTALLED_FILES) | $(GREP) "__init__.py" | xargs dirname | xargs rmdir + rm -f $(builddir)/$(INSTALLED_FILES) + +CLEANFILES = babeltrace/babeltrace_wrap.c babeltrace/babeltrace.py build-python-bindings.stamp +DISTCLEANFILES = setup.py endif diff --git a/bindings/python/babeltrace/Makefile.am b/bindings/python/babeltrace/Makefile.am index 11dcdf0..f612aa6 100644 --- a/bindings/python/babeltrace/Makefile.am +++ b/bindings/python/babeltrace/Makefile.am @@ -1,31 +1,9 @@ +if USE_PYTHON babeltrace.i: babeltrace.i.in sed "s/BABELTRACE_VERSION_STR/Babeltrace $(PACKAGE_VERSION)/g" < \ $(top_srcdir)/bindings/python/babeltrace/babeltrace.i.in > \ $(top_builddir)/bindings/python/bab
Re: [lttng-dev] [PATCH babeltrace] Build Python bindings with distutils for consistent installs
I noticed some shortcomings for this patch. I will send an updated version shortly. Francis 2017-02-17 15:59 GMT-05:00 Francis Deslauriers <francis.deslauri...@efficios.com>: > This patch changes the build system used to compile and install the > Python Bindings. Distutils is used to find the right install directory. > When the install directory generated from the install prefix is not in > the Python search path (PYTHON_PATH), we print a warning explaining what > can be done to include it. > It uses Distutils which is part of the Python standard library. > > To be applied on top of 1.5. > > Signed-off-by: Francis Deslauriers <francis.deslauri...@efficios.com> > --- > .gitignore| 10 +++-- > bindings/python/Makefile.am | 39 +++- > bindings/python/babeltrace/Makefile.am| 31 - > bindings/python/babeltrace/__init__.py.in | 25 +++ > bindings/python/setup.py.in | 75 > +++ > configure.ac | 14 +++--- > m4/python_modules.m4 | 23 -- > 7 files changed, 153 insertions(+), 64 deletions(-) > delete mode 100644 bindings/python/babeltrace/Makefile.am > create mode 100644 bindings/python/babeltrace/__init__.py.in > create mode 100644 bindings/python/setup.py.in > delete mode 100644 m4/python_modules.m4 > > diff --git a/.gitignore b/.gitignore > index a7c9e3c..9259b6f 100644 > --- a/.gitignore > +++ b/.gitignore > @@ -47,8 +47,12 @@ converter/babeltrace-log > core > formats/ctf/metadata/ctf-parser.output > stamp-h1 > -bindings/python/babeltrace.i > -bindings/python/babeltrace.py > -bindings/python/babeltrace_wrap.c > +bindings/python/setup.py > +bindings/python/installed_files.txt > +bindings/python/build > +bindings/python/babeltrace/__init__.py > +bindings/python/babeltrace/babeltrace.i > +bindings/python/babeltrace/babeltrace.py > +bindings/python/babeltrace/babeltrace_wrap.c > babeltrace.pc > babeltrace-ctf.pc > diff --git a/bindings/python/Makefile.am b/bindings/python/Makefile.am > index d6b3648..ab75a3a 100644 > --- a/bindings/python/Makefile.am > +++ b/bindings/python/Makefile.am > @@ -1,3 +1,40 @@ > if USE_PYTHON > -SUBDIRS = babeltrace > + > +SUBDIRS = . > + > +AM_CFLAGS = $(PACKAGE_CFLAGS) -I$(top_srcdir)/include -I$(srcdir)/babeltrace/ > + > +# Since the shared object used by the python bindings is not built with > libtool > +# we need to manually set the `rpath` during linkage > +AM_LDFLAGS=-L$(top_builddir)/formats/ctf/.libs -L$(top_builddir)/lib/.libs > -Wl,-rpath,$(prefix)/lib > + > +INSTALLED_FILES=installed_files.txt > + > +all-local: > + CC="$(CC)" CFLAGS="$(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) > $(GLIB_CFLAGS) $(AM_CFLAGS)" CPPFLAGS="$(AM_CPPFLAGS) $(CPPFLAGS)" > LDFLAGS="$(AM_LDFLAGS) $(LDFLAGS)" $(PYTHON) $(builddir)/setup.py build_ext > --swig-opts="-Wall -I$(top_srcdir)" > + $(PYTHON) $(builddir)/setup.py build > + > +# This target installs the Python package and saves the path of all the > +# installed files in the INSTALLED_FILES text file to be used during this > +# uninstallation > +install-exec-local: > + @opts="--prefix=$(prefix) --verbose --record $(INSTALLED_FILES) > --no-compile $(DISTSETUPOPTS)"; \ > + if [ "$(DESTDIR)" != "" ]; then \ > + opts="$$opts --root=$(DESTDIR)"; \ > + fi; \ > + $(PYTHON) $(builddir)/setup.py install $$opts; > + > +clean-local: > + rm -rf $(builddir)/build > + > +# Distutils' setup.py does not include an uninstall target, we thus need to > do it > +# manually. We use the INSTALLED_FILES file produced during the install to > +# clean up the install folder and delete the folder it self. > +uninstall-local: > + cat $(INSTALLED_FILES) | xargs rm -rf > + cat $(INSTALLED_FILES) | $(GREP) "__init__.py" | xargs dirname | > xargs rmdir > + rm -f $(INSTALLED_FILES) > + > +CLEANFILES = babeltrace/babeltrace_wrap.c babeltrace/babeltrace.py > +DISTCLEANFILES = babeltrace/__init__.py babeltrace/babeltrace.i > endif > diff --git a/bindings/python/babeltrace/Makefile.am > b/bindings/python/babeltrace/Makefile.am > deleted file mode 100644 > index 11dcdf0..000 > --- a/bindings/python/babeltrace/Makefile.am > +++ /dev/null > @@ -1,31 +0,0 @@ > -babeltrace.i: babeltrace.i.in > - sed "s/BABELTRACE_VERSION_STR/Babeltrace $(PACKAGE_VERSION)/g" < \ > - $(top_srcdir)/bindings/python/babeltrace/babeltrace.i.in > \ > -
[lttng-dev] [PATCH babeltrace] Build Python bindings with distutils for consistent installs
This patch changes the build system used to compile and install the Python Bindings. Distutils is used to find the right install directory. When the install directory generated from the install prefix is not in the Python search path (PYTHON_PATH), we print a warning explaining what can be done to include it. It uses Distutils which is part of the Python standard library. To be applied on top of 1.5. Signed-off-by: Francis Deslauriers <francis.deslauri...@efficios.com> --- .gitignore| 10 +++-- bindings/python/Makefile.am | 39 +++- bindings/python/babeltrace/Makefile.am| 31 - bindings/python/babeltrace/__init__.py.in | 25 +++ bindings/python/setup.py.in | 75 +++ configure.ac | 14 +++--- m4/python_modules.m4 | 23 -- 7 files changed, 153 insertions(+), 64 deletions(-) delete mode 100644 bindings/python/babeltrace/Makefile.am create mode 100644 bindings/python/babeltrace/__init__.py.in create mode 100644 bindings/python/setup.py.in delete mode 100644 m4/python_modules.m4 diff --git a/.gitignore b/.gitignore index a7c9e3c..9259b6f 100644 --- a/.gitignore +++ b/.gitignore @@ -47,8 +47,12 @@ converter/babeltrace-log core formats/ctf/metadata/ctf-parser.output stamp-h1 -bindings/python/babeltrace.i -bindings/python/babeltrace.py -bindings/python/babeltrace_wrap.c +bindings/python/setup.py +bindings/python/installed_files.txt +bindings/python/build +bindings/python/babeltrace/__init__.py +bindings/python/babeltrace/babeltrace.i +bindings/python/babeltrace/babeltrace.py +bindings/python/babeltrace/babeltrace_wrap.c babeltrace.pc babeltrace-ctf.pc diff --git a/bindings/python/Makefile.am b/bindings/python/Makefile.am index d6b3648..ab75a3a 100644 --- a/bindings/python/Makefile.am +++ b/bindings/python/Makefile.am @@ -1,3 +1,40 @@ if USE_PYTHON -SUBDIRS = babeltrace + +SUBDIRS = . + +AM_CFLAGS = $(PACKAGE_CFLAGS) -I$(top_srcdir)/include -I$(srcdir)/babeltrace/ + +# Since the shared object used by the python bindings is not built with libtool +# we need to manually set the `rpath` during linkage +AM_LDFLAGS=-L$(top_builddir)/formats/ctf/.libs -L$(top_builddir)/lib/.libs -Wl,-rpath,$(prefix)/lib + +INSTALLED_FILES=installed_files.txt + +all-local: + CC="$(CC)" CFLAGS="$(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(GLIB_CFLAGS) $(AM_CFLAGS)" CPPFLAGS="$(AM_CPPFLAGS) $(CPPFLAGS)" LDFLAGS="$(AM_LDFLAGS) $(LDFLAGS)" $(PYTHON) $(builddir)/setup.py build_ext --swig-opts="-Wall -I$(top_srcdir)" + $(PYTHON) $(builddir)/setup.py build + +# This target installs the Python package and saves the path of all the +# installed files in the INSTALLED_FILES text file to be used during this +# uninstallation +install-exec-local: + @opts="--prefix=$(prefix) --verbose --record $(INSTALLED_FILES) --no-compile $(DISTSETUPOPTS)"; \ + if [ "$(DESTDIR)" != "" ]; then \ + opts="$$opts --root=$(DESTDIR)"; \ + fi; \ + $(PYTHON) $(builddir)/setup.py install $$opts; + +clean-local: + rm -rf $(builddir)/build + +# Distutils' setup.py does not include an uninstall target, we thus need to do it +# manually. We use the INSTALLED_FILES file produced during the install to +# clean up the install folder and delete the folder it self. +uninstall-local: + cat $(INSTALLED_FILES) | xargs rm -rf + cat $(INSTALLED_FILES) | $(GREP) "__init__.py" | xargs dirname | xargs rmdir + rm -f $(INSTALLED_FILES) + +CLEANFILES = babeltrace/babeltrace_wrap.c babeltrace/babeltrace.py +DISTCLEANFILES = babeltrace/__init__.py babeltrace/babeltrace.i endif diff --git a/bindings/python/babeltrace/Makefile.am b/bindings/python/babeltrace/Makefile.am deleted file mode 100644 index 11dcdf0..000 --- a/bindings/python/babeltrace/Makefile.am +++ /dev/null @@ -1,31 +0,0 @@ -babeltrace.i: babeltrace.i.in - sed "s/BABELTRACE_VERSION_STR/Babeltrace $(PACKAGE_VERSION)/g" < \ - $(top_srcdir)/bindings/python/babeltrace/babeltrace.i.in > \ - $(top_builddir)/bindings/python/babeltrace/babeltrace.i - -AM_CFLAGS = $(PYTHON_INCLUDE) -I$(top_srcdir)/include/ \ - -I$(top_srcdir)/bindings/python/babeltrace - -EXTRA_DIST = babeltrace.i.in -nodist_python_PYTHON = babeltrace.py -pyexec_LTLIBRARIES = _babeltrace.la - -MAINTAINERCLEANFILES = babeltrace_wrap.c babeltrace.py - -nodist__babeltrace_la_SOURCES = babeltrace_wrap.c -_babeltrace_la_SOURCES = python-complements.h python-complements.c -_babeltrace_la_LDFLAGS = -module - -_babeltrace_la_CFLAGS = $(GLIB_CFLAGS) $(AM_CFLAGS) - -_babeltrace_la_LIBS = $(GLIB_LIBS) - -_babeltrace_la_LIBADD = $(top_builddir)/formats/ctf/libbabeltrace-ctf.la \ - $(top_builddir)/formats/ctf-text/libbabeltrace-ctf-text.
[lttng-dev] [PATCH lttng-tools] Fix: support for older versions of Babeltrace in test script
A new context field was introduced in version LTTng 2.8 that is printed by Babeltrace prior to v1.2.5. This regex thus fails to match the output. Since the context fields are not used by the script, we create a non-capturing group for these fields that matches on both old and new Babeltrace. This is causing problems on Ubuntu 14.04 Trusty when building lttng-tools from source and using the Babeltrace package from the official repository (v1.2.1) to run the test suite. Also, this patch removes commented and used code in the function but keeps the names of non-capturing groups for readability. Signed-off-by: Francis Deslauriers <francis.deslauri...@efficios.com> CC: Philippe Proulx <ppro...@efficios.com> --- tests/utils/babelstats.pl | 31 +-- 1 file changed, 9 insertions(+), 22 deletions(-) diff --git a/tests/utils/babelstats.pl b/tests/utils/babelstats.pl index 37a9b06..16766ba 100755 --- a/tests/utils/babelstats.pl +++ b/tests/utils/babelstats.pl @@ -141,31 +141,18 @@ my @events; while (<>) { - my $timestamp = '\[(.*)\]'; - my $elapsed = '\((.*)\)'; - my $hostname= '.*'; - my $pname = '.*'; - my $pinfo = '.*'; - my $pid = '\d+'; - my $tp_event= '.*'; - my $cpu_info= '{\scpu_id\s=\s(\d+)\s\}'; - my $fields = '{(.*)}'; + my $timestamp = '\[(?:.*)\]'; + my $elapsed = '\((?:.*)\)'; + my $hostname= '(?:.*)'; + my $tp_event= '(.*)'; + my $pkt_context = '(?:\{[^}]*\},\s)*'; + my $fields = '\{(.*)\}$'; # Parse babeltrace text output format - if (/$timestamp\s$elapsed\s($pinfo)\s($tp_event):\s$cpu_info,\s$fields/) { + if (/$timestamp\s$elapsed\s$hostname\s$tp_event:\s$pkt_context$fields/) { my %event_hash; - $event_hash{'timestamp'} = $1; - $event_hash{'elapsed'} = $2; - $event_hash{'pinfo'} = $3; - -# my @split_pinfo = split(':', $3); -# $event_hash{'hostname'}= $split_pinfo[0]; -# $event_hash{'pname'} = defined($split_pinfo[1]) ? $split_pinfo[1] : undef; -# $event_hash{'pid'} = defined($split_pinfo[2]) ? $split_pinfo[2] : undef; - - $event_hash{'tp_event'}= $4; - $event_hash{'cpu_id'} = $5; - $event_hash{'fields'} = parse_fields($6); + $event_hash{'tp_event'}= $1; + $event_hash{'fields'} = parse_fields($2); push @events, \%event_hash; } -- 2.7.4 ___ lttng-dev mailing list lttng-dev@lists.lttng.org https://lists.lttng.org/cgi-bin/mailman/listinfo/lttng-dev
[lttng-dev] [PATCH lttng-tools] Fix: add missing refcount of loaded modules
Signed-off-by: Francis Deslauriers <francis.deslauri...@efficios.com> --- src/bin/lttng-sessiond/modprobe.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/bin/lttng-sessiond/modprobe.c b/src/bin/lttng-sessiond/modprobe.c index 0502740..03545ef 100644 --- a/src/bin/lttng-sessiond/modprobe.c +++ b/src/bin/lttng-sessiond/modprobe.c @@ -343,7 +343,7 @@ static int modprobe_lttng(struct kern_modules_param *modules, } } else { DBG("Modprobe successfully %s", modules[i].name); - modules[i].loaded; + modules[i].loaded = true; } } -- 2.7.4 ___ lttng-dev mailing list lttng-dev@lists.lttng.org https://lists.lttng.org/cgi-bin/mailman/listinfo/lttng-dev
[lttng-dev] [PATCH lttng-tools v3] Fix: test cases now rely on explicit workloads
Run a process explicitly in the tracing session to generate the enabled events rather than relying on the events generated by the lttng CLI. --- tests/regression/kernel/test_all_events | 6 ++ tests/regression/kernel/test_event_basic | 14 -- 2 files changed, 18 insertions(+), 2 deletions(-) diff --git a/tests/regression/kernel/test_all_events b/tests/regression/kernel/test_all_events index 50002f4..713c717 100755 --- a/tests/regression/kernel/test_all_events +++ b/tests/regression/kernel/test_all_events @@ -21,6 +21,8 @@ CURDIR=$(dirname $0)/ TESTDIR=$CURDIR/../.. NUM_TESTS=8 +TESTCMD="/bin/true" + source $TESTDIR/utils/utils.sh function test_all_event() @@ -33,6 +35,10 @@ function test_all_event() lttng_enable_kernel_event $SESSION_NAME start_lttng_tracing_ok + + # Running a process and waiting for its completion forces the triggering of a + # sched_switch event + eval ${TESTCMD} stop_lttng_tracing_ok validate_trace "sched_switch" $TRACE_PATH diff --git a/tests/regression/kernel/test_event_basic b/tests/regression/kernel/test_event_basic index aeca02b..1a10a2c 100755 --- a/tests/regression/kernel/test_event_basic +++ b/tests/regression/kernel/test_event_basic @@ -21,6 +21,8 @@ CURDIR=$(dirname $0)/ TESTDIR=$CURDIR/../.. NUM_TESTS=20 +TESTCMD="/bin/true" + source $TESTDIR/utils/utils.sh function test_event_basic() @@ -32,14 +34,18 @@ function test_event_basic() lttng_enable_kernel_event $SESSION_NAME "sched_switch" lttng_enable_kernel_event $SESSION_NAME "sched_process_exit" - lttng_enable_kernel_event $SESSION_NAME "sched_process_free" + lttng_enable_kernel_event $SESSION_NAME "sched_process_fork" start_lttng_tracing_ok + + # Running a process and waiting for its completion forces the triggering of + # fork, sched_switch and exit events + eval ${TESTCMD} stop_lttng_tracing_ok validate_trace "sched_switch" $TRACE_PATH validate_trace "sched_process_exit" $TRACE_PATH - validate_trace "sched_process_free" $TRACE_PATH + validate_trace "sched_process_fork" $TRACE_PATH destroy_lttng_session_ok $SESSION_NAME @@ -57,6 +63,10 @@ function test_enable_after_start() start_lttng_tracing_ok lttng_enable_kernel_event $SESSION_NAME "sched_process_exit" + + # Running a process and waiting for its completion forces the triggering of + # sched_switch and exit events + eval ${TESTCMD} stop_lttng_tracing_ok validate_trace "sched_switch" $TRACE_PATH -- 2.7.4 ___ lttng-dev mailing list lttng-dev@lists.lttng.org https://lists.lttng.org/cgi-bin/mailman/listinfo/lttng-dev
Re: [lttng-dev] [PATCH lttng-tools v2] Fix: test cases now rely on explicit workloads
Agreed. Let me send this in a final version of this patch. Thanks, Francis 2016-11-08 16:07 GMT-05:00 Mathieu Desnoyers <mathieu.desnoy...@efficios.com >: > - On Nov 8, 2016, at 3:46 PM, Francis Deslauriers < > francis.deslauri...@efficios.com> wrote: > > 2016-11-08 15:06 GMT-05:00 Nathan Lynch <nathan_ly...@mentor.com>: > >> On 11/08/2016 01:49 PM, Francis Deslauriers wrote: >> > Run a process explicitly in the tracing session to generate the enabled >> events >> > rather than relying on the events generated by the lttng CLI. >> >> [...] >> >> > diff --git a/tests/regression/kernel/test_all_events >> b/tests/regression/kernel/test_all_events >> > index 50002f4..80a8020 100755 >> > --- a/tests/regression/kernel/test_all_events >> > +++ b/tests/regression/kernel/test_all_events >> > @@ -21,6 +21,8 @@ CURDIR=$(dirname $0)/ >> > TESTDIR=$CURDIR/../.. >> > NUM_TESTS=8 >> > >> > +TESTCMD="grep -V -q > /dev/null" >> > + >> >> What was wrong with /bin/true, as in v1 of this patch? > > I used grep because the configure script looks for it already > At the moment, we don't check if /bin/true is installed on the machine > using the configure script. > > >> FYI, Busybox grep doesn't know -V: >> >> # grep -V -q >/dev/null >> grep: invalid option -- 'V' >> BusyBox v1.24.1 (2016-11-08 12:59:13 CST) multi-call binary. >> >> Usage: grep [-HhnlLoqvsriwFE] [-m N] [-A/B/C N] PATTERN/-e PATTERN.../-f >> FILE [FILE]... >> >> # echo $? >> 1 >> >> It looks like the testcases don't care about the exit status of TESTCMD, >> but you may want to redirect stderr to /dev/null as well. >> > Good point. > I could do: grep "foo" /dev/null > > > utils/utils.sh:45:# We set the default lttng-sessiond path to /bin/true to > prevent the spawning > utils/utils.sh:49:export LTTNG_SESSIOND_PATH="/bin/true" > > already used. > > So unless anyone complain about it, let's use it. > > If someone complains, then we need to fix the configure detection. > > Thanks, > > Mathieu > > > Thank you, > -- > Francis Deslauriers > Software developer > EfficiOS inc. > >> >> ___________ >> lttng-dev mailing list >> lttng-dev@lists.lttng.org >> https://lists.lttng.org/cgi-bin/mailman/listinfo/lttng-dev >> > > > > > > ___ > lttng-dev mailing list > lttng-dev@lists.lttng.org > https://lists.lttng.org/cgi-bin/mailman/listinfo/lttng-dev > > > -- > Mathieu Desnoyers > EfficiOS Inc. > http://www.efficios.com > -- Francis Deslauriers Software developer EfficiOS inc. ___ lttng-dev mailing list lttng-dev@lists.lttng.org https://lists.lttng.org/cgi-bin/mailman/listinfo/lttng-dev
Re: [lttng-dev] [PATCH lttng-tools v2] Fix: test cases now rely on explicit workloads
2016-11-08 15:06 GMT-05:00 Nathan Lynch <nathan_ly...@mentor.com>: > On 11/08/2016 01:49 PM, Francis Deslauriers wrote: > > Run a process explicitly in the tracing session to generate the enabled > events > > rather than relying on the events generated by the lttng CLI. > > [...] > > > diff --git a/tests/regression/kernel/test_all_events > b/tests/regression/kernel/test_all_events > > index 50002f4..80a8020 100755 > > --- a/tests/regression/kernel/test_all_events > > +++ b/tests/regression/kernel/test_all_events > > @@ -21,6 +21,8 @@ CURDIR=$(dirname $0)/ > > TESTDIR=$CURDIR/../.. > > NUM_TESTS=8 > > > > +TESTCMD="grep -V -q > /dev/null" > > + > > What was wrong with /bin/true, as in v1 of this patch? I used grep because the configure script looks for it already At the moment, we don't check if /bin/true is installed on the machine using the configure script. > FYI, Busybox grep doesn't know -V: > > # grep -V -q >/dev/null > grep: invalid option -- 'V' > BusyBox v1.24.1 (2016-11-08 12:59:13 CST) multi-call binary. > > Usage: grep [-HhnlLoqvsriwFE] [-m N] [-A/B/C N] PATTERN/-e PATTERN.../-f > FILE [FILE]... > > # echo $? > 1 > > It looks like the testcases don't care about the exit status of TESTCMD, > but you may want to redirect stderr to /dev/null as well. > Good point. I could do: grep "foo" /dev/null Thank you, -- Francis Deslauriers Software developer EfficiOS inc. > > ___ > lttng-dev mailing list > lttng-dev@lists.lttng.org > https://lists.lttng.org/cgi-bin/mailman/listinfo/lttng-dev > ___ lttng-dev mailing list lttng-dev@lists.lttng.org https://lists.lttng.org/cgi-bin/mailman/listinfo/lttng-dev
[lttng-dev] [PATCH lttng-tools v2] Fix: test cases now rely on explicit workloads
Run a process explicitly in the tracing session to generate the enabled events rather than relying on the events generated by the lttng CLI. Signed-off-by: Francis Deslauriers <francis.deslauri...@efficios.com> --- tests/regression/kernel/test_all_events | 6 ++ tests/regression/kernel/test_event_basic | 14 -- 2 files changed, 18 insertions(+), 2 deletions(-) diff --git a/tests/regression/kernel/test_all_events b/tests/regression/kernel/test_all_events index 50002f4..80a8020 100755 --- a/tests/regression/kernel/test_all_events +++ b/tests/regression/kernel/test_all_events @@ -21,6 +21,8 @@ CURDIR=$(dirname $0)/ TESTDIR=$CURDIR/../.. NUM_TESTS=8 +TESTCMD="grep -V -q > /dev/null" + source $TESTDIR/utils/utils.sh function test_all_event() @@ -33,6 +35,10 @@ function test_all_event() lttng_enable_kernel_event $SESSION_NAME start_lttng_tracing_ok + + # Running a process and waiting for its completion forces the triggering of a + # sched_switch event + eval ${TESTCMD} stop_lttng_tracing_ok validate_trace "sched_switch" $TRACE_PATH diff --git a/tests/regression/kernel/test_event_basic b/tests/regression/kernel/test_event_basic index aeca02b..43c4fda 100755 --- a/tests/regression/kernel/test_event_basic +++ b/tests/regression/kernel/test_event_basic @@ -21,6 +21,8 @@ CURDIR=$(dirname $0)/ TESTDIR=$CURDIR/../.. NUM_TESTS=20 +TESTCMD="grep -V -q > /dev/null" + source $TESTDIR/utils/utils.sh function test_event_basic() @@ -32,14 +34,18 @@ function test_event_basic() lttng_enable_kernel_event $SESSION_NAME "sched_switch" lttng_enable_kernel_event $SESSION_NAME "sched_process_exit" - lttng_enable_kernel_event $SESSION_NAME "sched_process_free" + lttng_enable_kernel_event $SESSION_NAME "sched_process_fork" start_lttng_tracing_ok + + # Running a process and waiting for its completion forces the triggering of + # fork, sched_switch and exit events + eval ${TESTCMD} stop_lttng_tracing_ok validate_trace "sched_switch" $TRACE_PATH validate_trace "sched_process_exit" $TRACE_PATH - validate_trace "sched_process_free" $TRACE_PATH + validate_trace "sched_process_fork" $TRACE_PATH destroy_lttng_session_ok $SESSION_NAME @@ -57,6 +63,10 @@ function test_enable_after_start() start_lttng_tracing_ok lttng_enable_kernel_event $SESSION_NAME "sched_process_exit" + + # Running a process and waiting for its completion forces the triggering of + # sched_switch and exit events + eval ${TESTCMD} stop_lttng_tracing_ok validate_trace "sched_switch" $TRACE_PATH -- 2.7.4 ___ lttng-dev mailing list lttng-dev@lists.lttng.org https://lists.lttng.org/cgi-bin/mailman/listinfo/lttng-dev
[lttng-dev] [PATCH lttng-tools] Fix: test cases now rely on explicit workloads
Run a process explicitly in the tracing session to generate the enabled events rather than relying on the events generated by the lttng CLI. Signed-off-by: Francis Deslauriers <francis.deslauri...@efficios.com> --- tests/regression/kernel/test_all_events | 6 ++ tests/regression/kernel/test_event_basic | 14 -- 2 files changed, 18 insertions(+), 2 deletions(-) diff --git a/tests/regression/kernel/test_all_events b/tests/regression/kernel/test_all_events index 50002f4..713c717 100755 --- a/tests/regression/kernel/test_all_events +++ b/tests/regression/kernel/test_all_events @@ -21,6 +21,8 @@ CURDIR=$(dirname $0)/ TESTDIR=$CURDIR/../.. NUM_TESTS=8 +TESTCMD="/bin/true" + source $TESTDIR/utils/utils.sh function test_all_event() @@ -33,6 +35,10 @@ function test_all_event() lttng_enable_kernel_event $SESSION_NAME start_lttng_tracing_ok + + # Running a process and waiting for its completion forces the triggering of a + # sched_switch event + eval ${TESTCMD} stop_lttng_tracing_ok validate_trace "sched_switch" $TRACE_PATH diff --git a/tests/regression/kernel/test_event_basic b/tests/regression/kernel/test_event_basic index aeca02b..1a10a2c 100755 --- a/tests/regression/kernel/test_event_basic +++ b/tests/regression/kernel/test_event_basic @@ -21,6 +21,8 @@ CURDIR=$(dirname $0)/ TESTDIR=$CURDIR/../.. NUM_TESTS=20 +TESTCMD="/bin/true" + source $TESTDIR/utils/utils.sh function test_event_basic() @@ -32,14 +34,18 @@ function test_event_basic() lttng_enable_kernel_event $SESSION_NAME "sched_switch" lttng_enable_kernel_event $SESSION_NAME "sched_process_exit" - lttng_enable_kernel_event $SESSION_NAME "sched_process_free" + lttng_enable_kernel_event $SESSION_NAME "sched_process_fork" start_lttng_tracing_ok + + # Running a process and waiting for its completion forces the triggering of + # fork, sched_switch and exit events + eval ${TESTCMD} stop_lttng_tracing_ok validate_trace "sched_switch" $TRACE_PATH validate_trace "sched_process_exit" $TRACE_PATH - validate_trace "sched_process_free" $TRACE_PATH + validate_trace "sched_process_fork" $TRACE_PATH destroy_lttng_session_ok $SESSION_NAME @@ -57,6 +63,10 @@ function test_enable_after_start() start_lttng_tracing_ok lttng_enable_kernel_event $SESSION_NAME "sched_process_exit" + + # Running a process and waiting for its completion forces the triggering of + # sched_switch and exit events + eval ${TESTCMD} stop_lttng_tracing_ok validate_trace "sched_switch" $TRACE_PATH -- 2.7.4 ___ lttng-dev mailing list lttng-dev@lists.lttng.org https://lists.lttng.org/cgi-bin/mailman/listinfo/lttng-dev
Re: [lttng-dev] [PATCH lttng-tools] Fix: test case can not rely on sched_process_free, use _fork instead
Please omit this patch. I am preparing a more generic one. Thank you, -- Francis Deslauriers Software developer EfficiOS inc. 2016-11-08 11:05 GMT-05:00 Francis Deslauriers < francis.deslauri...@efficios.com>: > sched_process_free may not be called during the tracing session if there > is very little activity on the machine the test is run on. We change > this validate to sched_process_fork since we are sure there will be > atleast one generated by the final lttng stop. > > Signed-off-by: Francis Deslauriers <francis.deslauri...@efficios.com> > --- > tests/regression/kernel/test_event_basic | 4 ++-- > 1 file changed, 2 insertions(+), 2 deletions(-) > > diff --git a/tests/regression/kernel/test_event_basic > b/tests/regression/kernel/test_event_basic > index aeca02b..584bfc8 100755 > --- a/tests/regression/kernel/test_event_basic > +++ b/tests/regression/kernel/test_event_basic > @@ -32,14 +32,14 @@ function test_event_basic() > > lttng_enable_kernel_event $SESSION_NAME "sched_switch" > lttng_enable_kernel_event $SESSION_NAME "sched_process_exit" > - lttng_enable_kernel_event $SESSION_NAME "sched_process_free" > + lttng_enable_kernel_event $SESSION_NAME "sched_process_fork" > > start_lttng_tracing_ok > stop_lttng_tracing_ok > > validate_trace "sched_switch" $TRACE_PATH > validate_trace "sched_process_exit" $TRACE_PATH > - validate_trace "sched_process_free" $TRACE_PATH > + validate_trace "sched_process_fork" $TRACE_PATH > > destroy_lttng_session_ok $SESSION_NAME > > -- > 2.7.4 > > ___ lttng-dev mailing list lttng-dev@lists.lttng.org https://lists.lttng.org/cgi-bin/mailman/listinfo/lttng-dev
[lttng-dev] [PATCH lttng-tools] Fix: test case can not rely on sched_process_free, use _fork instead
sched_process_free may not be called during the tracing session if there is very little activity on the machine the test is run on. We change this validate to sched_process_fork since we are sure there will be atleast one generated by the final lttng stop. Signed-off-by: Francis Deslauriers <francis.deslauri...@efficios.com> --- tests/regression/kernel/test_event_basic | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tests/regression/kernel/test_event_basic b/tests/regression/kernel/test_event_basic index aeca02b..584bfc8 100755 --- a/tests/regression/kernel/test_event_basic +++ b/tests/regression/kernel/test_event_basic @@ -32,14 +32,14 @@ function test_event_basic() lttng_enable_kernel_event $SESSION_NAME "sched_switch" lttng_enable_kernel_event $SESSION_NAME "sched_process_exit" - lttng_enable_kernel_event $SESSION_NAME "sched_process_free" + lttng_enable_kernel_event $SESSION_NAME "sched_process_fork" start_lttng_tracing_ok stop_lttng_tracing_ok validate_trace "sched_switch" $TRACE_PATH validate_trace "sched_process_exit" $TRACE_PATH - validate_trace "sched_process_free" $TRACE_PATH + validate_trace "sched_process_fork" $TRACE_PATH destroy_lttng_session_ok $SESSION_NAME -- 2.7.4 ___ lttng-dev mailing list lttng-dev@lists.lttng.org https://lists.lttng.org/cgi-bin/mailman/listinfo/lttng-dev
[lttng-dev] LTTng User Survey 2016
Hi all, I recently joined the LTTng community and I am curious to better understand what crowd is forming this community. So I had the idea of putting together a small survey. This information is also useful for maintainers when deciding what trade offs users are willing to take. This is a really short survey of 7 multiple choices questions. I would really appreciate it if you took a little bit of your time to fill it up. https://goo.gl/forms/mqbAGSU2TIVZEySk1 I will keep it opened for two weeks and then reply to this message with a summary of the results. Thank you, -- Francis Deslauriers Software developer EfficiOS inc. ___ lttng-dev mailing list lttng-dev@lists.lttng.org https://lists.lttng.org/cgi-bin/mailman/listinfo/lttng-dev
Re: [lttng-dev] Beginner question: how to inspect scheduling of multi-threaded user application?
Hi David, If you specifically want to trace the scheduling of the threads of your app, you don't need custom tracepoints. Enabling the sched_switch kernel event will give you both of cpu id and thread id. Look at the cpu_id and next_tid fields. You can enable the sched_switch event using : lttng enable-event -k sched_switch Cheers, Francis 2016-08-24 3:17 GMT-04:00 David Aldrich: > Hi > > > > I am new to tracing in Linux and to lttng. I have a multi-threaded user > application and I want to see: > > > > 1) When the threads are scheduled to run > > 2) Which cores the threads are running on. > > > > I have installed lttng on Ubuntu 14.04 LTS. I am expecting to visualise > the trace using TraceCompass. > > > > I have read the following doc section: > > > > http://lttng.org/docs/#doc-tracing-your-own-user-application > > > > In order to collect my trace, must I define custom tracepoint definitions ( in > a tracepoint provider header file ), and insert tracepoints into my user > application, or is there a simpler way of achieving my goal? > > > > Best regards > > > > David > > > > ___ > lttng-dev mailing list > lttng-dev@lists.lttng.org > https://lists.lttng.org/cgi-bin/mailman/listinfo/lttng-dev > > ___ lttng-dev mailing list lttng-dev@lists.lttng.org https://lists.lttng.org/cgi-bin/mailman/listinfo/lttng-dev
Re: [lttng-dev] 答复:答复: Can lttng support kernel function tracer
You can use the snapshot feature to start recording whenever you witness a significant latency[1]. You can use the system() function to trigger a record from your app. e.g. system(lttng snapshot record); [1] http://lttng.org/docs/#doc-taking-a-snapshot I hope it helps. Francis On Wed, Feb 18, 2015 at 1:29 AM, zhenyu.ren zhenyu@aliyun.com wrote: I think that might be a usecase for a profiler rather than a usecase for a tracer I am sorry that I have misled you.Not all write instances(a chance in a million) take 100ms+ to complete.So I have to trace all write instances to capture the deviant ones. Thanks zhenyu.ren -- 发件人:Francis Deslauriers francis.deslauri...@mail.utoronto.ca 发送时间:2015年2月17日(星期二) 23:09 收件人:zhenyu.ren zhenyu@aliyun.com 抄 送:lttng-dev@lists.lttng.org lttng-dev@lists.lttng.org 主 题:Re: 答复:[lttng-dev] Can lttng support kernel function tracer CCing lttng-dev back in the thread. I might be wrong but I think that might be a usecase for a profiler rather than a usecase for a tracer. Can someone else confirm? To do that kind of work, you could compile your kernel with gprof support. Thanks, Francis On Tue, Feb 17, 2015 at 3:38 AM, zhenyu.ren zhenyu@aliyun.com wrote: Hi,Francis In fact, I want to trace all kernel functions related to some behavior.For example,I write() and it returns 100ms later ,so I want to know which kernel function is too slow. In this case,I can use function tracer to trace all kernel function in the write() time window.However,I want to know is it possible that lttng can be useful in this case. Thanks zhenyu.ren -- 发件人:Francis Deslauriers francis.deslauri...@mail.utoronto.ca 发送时间:2015年2月17日(星期二) 00:53 收件人:zhenyu.ren zhenyu@aliyun.com 抄 送:lttng-dev lttng-dev@lists.lttng.org 主 题:Re: [lttng-dev] Can lttng support kernel function tracer Hi Zhenyu, If I understandd your question correctly, I can think of two ways to trace an arbitrary kernel function. First, you can hook the tracer on a dynamic probe[1] using something like this: lttng enable-event customEventName -k --probe kernelFunctionName. You can also hook the tracer on both entry and exit of a function using --function instead of --probe. To list your kernel symbols use cat /proc/kallsyms Second, you can create custom kernel tracepoints and compile them in you kernel. Have a look at the online documentation [2]. Don't hesitate to explain further if this doesn't answer your question. Cheers! Francis [1] http://git.lttng.org/?p=lttng-tools.git;a=blob;f=doc/quickstart.txt;h=018c27b2b939ef7cd075255fd01bcfd8b2b21b1e;hb=HEAD#l93 [2] http://lttng.org/docs/#doc-instrumenting-linux-kernel-itself On Thu, Feb 12, 2015 at 7:49 PM, zhenyu.ren zhenyu@aliyun.com wrote: Hi, It's well known that lttng can make use of kernel tracepoints to do block tracing ,system call tracing etc.Is it possible that lttng can produce anything like kernel function tracer does? Thanks zhenyu.ren ___ lttng-dev mailing list lttng-dev@lists.lttng.org http://lists.lttng.org/cgi-bin/mailman/listinfo/lttng-dev ___ lttng-dev mailing list lttng-dev@lists.lttng.org http://lists.lttng.org/cgi-bin/mailman/listinfo/lttng-dev
Re: [lttng-dev] 答复: Can lttng support kernel function tracer
CCing lttng-dev back in the thread. I might be wrong but I think that might be a usecase for a profiler rather than a usecase for a tracer. Can someone else confirm? To do that kind of work, you could compile your kernel with gprof support. Thanks, Francis On Tue, Feb 17, 2015 at 3:38 AM, zhenyu.ren zhenyu@aliyun.com wrote: Hi,Francis In fact, I want to trace all kernel functions related to some behavior.For example,I write() and it returns 100ms later ,so I want to know which kernel function is too slow. In this case,I can use function tracer to trace all kernel function in the write() time window.However,I want to know is it possible that lttng can be useful in this case. Thanks zhenyu.ren -- 发件人:Francis Deslauriers francis.deslauri...@mail.utoronto.ca 发送时间:2015年2月17日(星期二) 00:53 收件人:zhenyu.ren zhenyu@aliyun.com 抄 送:lttng-dev lttng-dev@lists.lttng.org 主 题:Re: [lttng-dev] Can lttng support kernel function tracer Hi Zhenyu, If I understandd your question correctly, I can think of two ways to trace an arbitrary kernel function. First, you can hook the tracer on a dynamic probe[1] using something like this: lttng enable-event customEventName -k --probe kernelFunctionName. You can also hook the tracer on both entry and exit of a function using --function instead of --probe. To list your kernel symbols use cat /proc/kallsyms Second, you can create custom kernel tracepoints and compile them in you kernel. Have a look at the online documentation [2]. Don't hesitate to explain further if this doesn't answer your question. Cheers! Francis [1] http://git.lttng.org/?p=lttng-tools.git;a=blob;f=doc/quickstart.txt;h=018c27b2b939ef7cd075255fd01bcfd8b2b21b1e;hb=HEAD#l93 [2] http://lttng.org/docs/#doc-instrumenting-linux-kernel-itself On Thu, Feb 12, 2015 at 7:49 PM, zhenyu.ren zhenyu@aliyun.com wrote: Hi, It's well known that lttng can make use of kernel tracepoints to do block tracing ,system call tracing etc.Is it possible that lttng can produce anything like kernel function tracer does? Thanks zhenyu.ren ___ lttng-dev mailing list lttng-dev@lists.lttng.org http://lists.lttng.org/cgi-bin/mailman/listinfo/lttng-dev ___ lttng-dev mailing list lttng-dev@lists.lttng.org http://lists.lttng.org/cgi-bin/mailman/listinfo/lttng-dev