lttng-ust.git
4 years agoAdd compile time assertion that array and sequence have integer elements
Francis Deslauriers [Fri, 24 Apr 2020 16:30:22 +0000 (12:30 -0400)] 
Add compile time assertion that array and sequence have integer elements

Currently, LTTng-UST only supports ctf_arrays(and ctf_sequences) of
integers and chars but there is nothing preventing the user of compiling
an array of double. This is problematic because the resulting metadata
for that array will end up being erroneous.

This commit adds a new stage in the probe building process that asserts
that the element type of arrays or sequences are supported. This stage
adds a compile time static assertion, so the probes won't build if the
type is not supported.

Here is the error message the user will get when compiling with a C99
compiler:
  gcc -c -sdt=c99 -I. tp.c
    In file included from /usr/local/include/lttng/tracepoint-event.h:58:0,
       from tp.h:77,
       from tp.c:4:
    ././tp.h:71:9: error: size of array ‘lttng_static_assert_Non_integer_type__my_array__not_supported_as_element_of_CTF_ARRAY_or_CTF_SEQUENCE’ is negative
    ctf_array(double, my_array_for_double, my_array_for_double, 3)

Here is the error message the user will get when compiling with a C++ or
C11 compiler or above:
  g++ -c -std=c11 -I. tp.c
    In file included from /usr/local/include/lttng/tracepoint-event.h:58:0,
         from tp.h:77,
         from tp.c:4:
    ././tp.h:71:9: error: static assertion failed: Non-integer type `my_array` not supported as element of CTF_ARRAY or CTF_SEQUENCE
    ctf_array(double, my_array, my_array_for_double, 3)

Signed-off-by: Francis Deslauriers <francis.deslauriers@efficios.com>
Signed-off-by: Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
Change-Id: Ie958635a8dc6262793d45c5f7458d50a0fecf7ab

4 years agoImplement compile time assertion macro wrapper
Francis Deslauriers [Fri, 24 Apr 2020 19:58:26 +0000 (15:58 -0400)] 
Implement compile time assertion macro wrapper

Starting from C++11[1] and C11[2] both C++ and C standards implement the
`static_assert()` macro that allows the compile time evaluation of an
expression and emitting of a compiler error when the expression
evaluates to false.

This commit implements a wrapper for compile time assertions on C
compilers implementing C standards prior C11.

On such compilers, we emulate a static assert by typedef'ing an array of
negative size in case of predicate failure.

The downside of this method is that error messages are a bit cryptic as
it mentions the negative-sized array. We overcome this issue by using a
user-provided message as part of variable name that gets printed on
error. For this reason, we decide to require 2 different messages in
addition of the predicate.

Here is the signature of the macro:
  #define lttng_static_assert(predicate, msg, c_identifier_msg)

The first message, `msg`, is the used with C++/C11 compilers can be any
string. The second message, `c_identifier_msg`, is used with older
standards and MUST be a valid C identifier as it's will be concatenated
to a typedef name.

For example:
If the user uses the macro such as:
  lttng_static_assert(false, "My assert message", MY_ASSERT_MSG);

The C99 user will get an error looking like this:
 error: size of array ‘lttng_static_assert_MY_ASSERT_MSG’ is negative

The C11 or C++ user will get an error looking like this:
  error: static assertion failed: "My assert message"

[1] https://en.cppreference.com/w/cpp/language/static_assert
[2] https://en.cppreference.com/w/c/language/_Static_assert

Signed-off-by: Francis Deslauriers <francis.deslauriers@efficios.com>
Signed-off-by: Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
Change-Id: I725f6e77f1858b8d88ffae781b648ac5b5c64b28

4 years agoFix: agent: read: end of loop condition should exclude 0
Mathieu Desnoyers [Thu, 23 Apr 2020 16:51:40 +0000 (12:51 -0400)] 
Fix: agent: read: end of loop condition should exclude 0

Causes the agent to hang endlessly waiting for completion of the
loop.

Signed-off-by: Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
4 years agofix: Java examples CLASSPATH override
Michael Jeanson [Wed, 22 Apr 2020 20:32:51 +0000 (16:32 -0400)] 
fix: Java examples CLASSPATH override

Variables provided to make as arguments, called 'command variables' can't
be reassigned a new value in the Makefile. Since the CLASSPATH is now
passed this way in the glue between automake and the example makefiles,
use different names for the internal variables.

Change-Id: Id6289273f211f544a66d933a96f06df75243415f
Signed-off-by: Michael Jeanson <mjeanson@efficios.com>
Signed-off-by: Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
4 years agoAdd missing files to .gitignore
Michael Jeanson [Wed, 22 Apr 2020 18:07:46 +0000 (14:07 -0400)] 
Add missing files to .gitignore

Signed-off-by: Michael Jeanson <mjeanson@efficios.com>
Signed-off-by: Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
Change-Id: I5050772c58342d3eb956e0cbd56983fbb1ed3b70

4 years agofix: Add CLASSPATH to autoconf precious variables
Michael Jeanson [Wed, 22 Apr 2020 18:37:55 +0000 (14:37 -0400)] 
fix: Add CLASSPATH to autoconf precious variables

This will record the value of CLASSPATH in the autoconf cache and ensure
it's used when calling make even if it's not exported to the
environment.

Signed-off-by: Michael Jeanson <mjeanson@efficios.com>
Signed-off-by: Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
Change-Id: Ia06070dd352f9d3b6956a1ec0f4eb1d024f73179

4 years agoFix: Java agent: close session daemon socket on error
Mathieu Desnoyers [Wed, 22 Apr 2020 18:05:41 +0000 (14:05 -0400)] 
Fix: Java agent: close session daemon socket on error

When catching an error, close the socket used to communicate with the
session daemon rather than leaking it, before retrying to connect.

Also, when sleep is interrupted, there is no point in printing
out the stack trace. Just retry connection immediately.

Signed-off-by: Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
4 years agoJava agent: Use inequality for read bound check
Mathieu Desnoyers [Wed, 22 Apr 2020 18:14:36 +0000 (14:14 -0400)] 
Java agent: Use inequality for read bound check

Don't continue looping if bytesLeft becomes negative for unforeseen
reasons.

Signed-off-by: Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
4 years agoFix: Java agent: handle partial payload read
Mathieu Desnoyers [Wed, 22 Apr 2020 17:30:40 +0000 (13:30 -0400)] 
Fix: Java agent: handle partial payload read

When reading from a TCP socket, there is no guarantee that the
read will return all the requested data. We need to loop and continue
reading until we gather all the expected data.

This fixes flakiness of the lttng-ust-java-tests.

Signed-off-by: Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
4 years agoFix: incorrect field accounting for dynamic type
Mathieu Desnoyers [Wed, 22 Apr 2020 16:22:19 +0000 (12:22 -0400)] 
Fix: incorrect field accounting for dynamic type

Two field accounting issues were introduced by
commit 218deb69baab "tracepoint: Refactor representation of nested
types" which affect the dynamic types used by Java application contexts.

The structure types should account 1 for the structure per se, in
addition to the nested fields.

The atype_dynamic includes an implicit enumeration, which now has two
fields instead of 1.

This was causing memory corruption issues in the lttng-ust-java-tests.

Signed-off-by: Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
4 years agoust-compiler.h: Allocate compound literals on heap with gcc <= 4.8
Mathieu Desnoyers [Mon, 20 Apr 2020 18:27:31 +0000 (14:27 -0400)] 
ust-compiler.h: Allocate compound literals on heap with gcc <= 4.8

g++ 4.8 and prior do not support C99 compound literals. Therefore,
force allocating those on the heap with these C++ compilers.

Signed-off-by: Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
4 years agoRequire C++11 for building probe providers with C++ compiler
Mathieu Desnoyers [Mon, 20 Apr 2020 18:12:51 +0000 (14:12 -0400)] 
Require C++11 for building probe providers with C++ compiler

The __LTTNG_COMPOUND_LITERAL(), in C++, requires either that the
compiler supports C99 compound literals (which is not the case for
g++ 4.8), or that LTTNG_ALLOCATE_COMPOUND_LITERAL_ON_HEAP is
defined so the compiler allocates the compound literal on the
heap with "new", which is available since c++11.

Signed-off-by: Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
4 years agofilter: bytecode already in the list should go before
Francis Deslauriers [Thu, 16 Apr 2020 23:44:06 +0000 (19:44 -0400)] 
filter: bytecode already in the list should go before

Background
==========
This `seqnum` (sequence number) feature is currently unused. It was
designed so that the session daemon could tell the tracer the order in
which the bytecode should be run.

Issue
=====
The current implementation of the session daemon doesn't use this
feature so there is only ever a single bytecode to execute per callsite.

During work on an upcoming feature uses this `seqnum` became useful and
it was realized that the current bytecode linking code would reverse the
order in which the bytecode were executed when all bytecodes have the
same `seqnum` value.

This is due to the fact that the `cds_list_for_each_entry_reverse` loops
until it finds a `seqnum` smaller than the new one.

So if all bytecodes have the same `seqnum`, the new bytecode will be
added at the beginning of the list.

This is not technically a problem since it's the session daemon's job to
set the sequence number if it wants a particular ordering. Even
considering that, we found it counterintuitive that new bytecodes are
added at the beginning of the list in those cases.

Solution
========
This commit makes it so that on equality, the insertion is done after
the existing bytecodes.

Signed-off-by: Francis Deslauriers <francis.deslauriers@efficios.com>
Signed-off-by: Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
Change-Id: Ie323b3ff5df346f222e22abfb9bbad6c5b7e4a27

4 years agoBump LTTNG_UST_ABI version from 8.1 to 9.0
Mathieu Desnoyers [Thu, 2 Apr 2020 20:57:48 +0000 (16:57 -0400)] 
Bump LTTNG_UST_ABI version from 8.1 to 9.0

Ensure an older liblttng-ust communicating with a newer liblttng-ust
will refuse the handshake, so older session daemon do not get to
interact with more recent lttng-ust which implements nested arrays and
sequences.

Introduce LTTNG_UST_ABI_MAJOR_VERSION_OLDEST_COMPATIBLE to allow
liblttng-ust to be backward compatible with a range of major versions.
In this case, liblttng-ust ABI 9.0 is fully backward compatible with
8.x, given that none of the existing ABI in 8.x has changed in 9.0.

Signed-off-by: Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
4 years agotracepoint: Refactor representation of nested types
Mathieu Desnoyers [Thu, 2 Apr 2020 17:37:17 +0000 (13:37 -0400)] 
tracepoint: Refactor representation of nested types

Refactor enumeration, sequence, array, structure, and variant types.

Implement internal data structures to support nested types.

All probe providers using ctf_enum(), ctf_array*() and ctf_sequence*()
are switched to this new binary layout, and the prior enum, array and
sequence abstract types are kept only for backward compatibility with
probe providers generated by older lttng-ust headers.

Each of sequence, array, struct and variant gain a "alignment" property,
which is a feature which was needed in lttng-modules to express
alignment for an array or sequence of bits.

The ust-ctl protocol with session daemon is extended to support those
new types.

Signed-off-by: Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
4 years agoRemove has_strcpy check following probe provider version bump
Mathieu Desnoyers [Thu, 2 Apr 2020 20:38:58 +0000 (16:38 -0400)] 
Remove has_strcpy check following probe provider version bump

Bumping the probe provider major version from 1 to 2 allows us to
remove a dynamic check within ctf_string() in the probe providers.

Signed-off-by: Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
4 years agoBump LTTNG_UST_PROVIDER_MAJOR from 1 to 2
Mathieu Desnoyers [Thu, 2 Apr 2020 20:32:15 +0000 (16:32 -0400)] 
Bump LTTNG_UST_PROVIDER_MAJOR from 1 to 2

The introduction of nested arrays and sequences requires to bump the
provider major version from 1 to 2. Newer lttng-ust are backward
compatible with older probes, but newer probes cannot be used by
older lttng-ust versions.

Signed-off-by: Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
4 years agoust-compiler.h: Implement __LTTNG_COMPOUND_LITERAL
Mathieu Desnoyers [Thu, 2 Apr 2020 17:29:45 +0000 (13:29 -0400)] 
ust-compiler.h: Implement __LTTNG_COMPOUND_LITERAL

Implement __LTTNG_COMPOUND_LITERAL to allow defining a compound literal
with static storage.

Compound literals with static storage are needed by LTTng to implement
nested arrays and sequences in TRACEPOINT_EVENT.

Compound literals are part of the C99 and C11 standards, but not
part of the C++ standards. However, those are supported by both g++ and
clang as C99 extensions when compiling C++ code.

Strict C++11 compliance can be obtained by defining
LTTNG_ALLOCATE_COMPOUND_LITERAL_ON_HEAP before including this header
to allocate those on the heap in C++.

Signed-off-by: Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
4 years agoDocument dependency on liburcu >= 0.12
Mathieu Desnoyers [Thu, 9 Apr 2020 19:02:57 +0000 (15:02 -0400)] 
Document dependency on liburcu >= 0.12

Signed-off-by: Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
4 years agoconfigure: add check for DEFINE_URCU_TLS_INIT
Mathieu Desnoyers [Thu, 9 Apr 2020 15:40:55 +0000 (11:40 -0400)] 
configure: add check for DEFINE_URCU_TLS_INIT

Signed-off-by: Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
4 years agoCleanup: use DEFINE_URCU_TLS_INIT for all CONFIG_RCU_TLS configurations
Mathieu Desnoyers [Thu, 9 Apr 2020 15:33:48 +0000 (11:33 -0400)] 
Cleanup: use DEFINE_URCU_TLS_INIT for all CONFIG_RCU_TLS configurations

Introduce a dependency on DEFINE_URCU_TLS_INIT for all CONFIG_RCU_TLS
configurations.

Signed-off-by: Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
4 years agoFix: namespace contexts !CONFIG_RCU_TLS variable initialization
Mathieu Desnoyers [Thu, 9 Apr 2020 15:29:18 +0000 (11:29 -0400)] 
Fix: namespace contexts !CONFIG_RCU_TLS variable initialization

The namespace contexts introduced in lttng-ust 2.12 require to
initialize TLS variable to nonzero values. However, in !CONFIG_RCU_TLS
(compatibility mode using pthread setspecific), this initialization
does not build.

Use the new DEFINE_URCU_TLS_INIT from liburcu when building
!CONFIG_RCU_TLS to fix this issue. Since this requires a dependency on
a new liburcu version, only !CONFIG_RCU_TLS adds this dependency in the
fix. A followup cleanup patch will use DEFINE_URCU_TLS_INIT as we add
a strict version dependency.

Signed-off-by: Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
4 years agoRecord event as soon as one filters evaluates to TRUE
Francis Deslauriers [Fri, 20 Mar 2020 14:52:21 +0000 (10:52 -0400)] 
Record event as soon as one filters evaluates to TRUE

This is a tiny optimization but it can reduce tracing cost in cases
where multiple filters are attached to a probe.

Since we want to trace the event if any of its filter expressions
evaluates to TRUE, there is no need to keep on evaluating expression
once one is found to be TRUE.

Signed-off-by: Francis Deslauriers <francis.deslauriers@efficios.com>
Signed-off-by: Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
Change-Id: I2bb8fafb3052fce02b10f541e025a9a74ffa1895

4 years agoCleanup: ust-tracepoint-event.h: extract `__num_fields` in a variable
Francis Deslauriers [Wed, 18 Mar 2020 21:29:36 +0000 (17:29 -0400)] 
Cleanup: ust-tracepoint-event.h: extract `__num_fields` in a variable

This makes it easier to understand what the `_TP_ARRAY_SIZE()` macro
expands to in this context.

Signed-off-by: Francis Deslauriers <francis.deslauriers@efficios.com>
Signed-off-by: Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
Change-Id: I6b44e1e444df1dab0496282af4cea260ae895ca0

4 years agoFix: v.u.d might be uninitialized
Jonathan Rajotte [Mon, 9 Mar 2020 23:24:07 +0000 (19:24 -0400)] 
Fix: v.u.d might be uninitialized

lttng-filter-interpreter.c:301:17: warning: ‘v.u.d’ may be used uninitialized in this function [-Wmaybe-uninitialized]
   ptr->u.d = v.u.d;

Indeed it seems that the value is never fetched if we compare to other
call sites and the dynamic call site further below.

Signed-off-by: Jonathan Rajotte <jonathan.rajotte-julien@efficios.com>
Signed-off-by: Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
Change-Id: I542d6db7514a2c39afe3613228577f34f194d672

4 years agoFix: Add missing vtracelog demo to make dist
Mathieu Desnoyers [Wed, 4 Mar 2020 16:33:26 +0000 (11:33 -0500)] 
Fix: Add missing vtracelog demo to make dist

Signed-off-by: Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
4 years agoFix: Add missing vtracef demo to make dist
Mathieu Desnoyers [Wed, 4 Mar 2020 16:32:52 +0000 (11:32 -0500)] 
Fix: Add missing vtracef demo to make dist

Signed-off-by: Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
4 years agoIntroduce vtracelog
Maxime Roussin-Belanger [Tue, 3 Mar 2020 23:10:31 +0000 (18:10 -0500)] 
Introduce vtracelog

vtracelog works the same as vtracef, but takes a log level
as a parameter and has the same limitations.

Signed-off-by: Maxime Roussin-Belanger <maxime.roussinbelanger@gmail.com>
Signed-off-by: Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
4 years agoIntroduce vtracef
Maxime Roussin-Belanger [Tue, 3 Mar 2020 23:10:30 +0000 (18:10 -0500)] 
Introduce vtracef

vtracef accepts a va_list argument to simplify
tracing functions which use a va_list

Here's an example from wpa_supplicant that I wanted to
trace:

void wpa_debug(int level, const char* fmt, ...)
{
va_list ap;
va_start(ap, fmt);

...
// The call I want to easily trace with vtracef
vprintf(fmt, ap);

...
va_end(ap);
}

wpa_debug is used a fair amount and it would be annoying to
replace all the wpa_debug calls with tracef.

With vtracef, it simplifies the find and replace effort by
only changing it at one place.

Signed-off-by: Maxime Roussin-Belanger <maxime.roussinbelanger@gmail.com>
Signed-off-by: Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
4 years agoFix: set FD_CLOEXEC on incoming FDs.
Jonathan Rajotte [Mon, 2 Mar 2020 19:21:33 +0000 (14:21 -0500)] 
Fix: set FD_CLOEXEC on incoming FDs.

The stream shm FDs are allocated by the consumer process, and then
passed to the applications over unix sockets. When opening those
file descriptors on reception, the FD_CLOEXEC flag is not set.

In a fork + exec scenario, parent process streams shm FDs and channel
wake FDs are present in the resulting child process.

Set FD_CLOEXEC on reception (ustcomm_recv_fds_unix_sock) to
prevent such scenario.

Change-Id: Id58077b272be9c1ab239846639ffd8103b3d50f1
Signed-off-by: Jonathan Rajotte <jonathan.rajotte-julien@efficios.com>
Signed-off-by: Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
4 years agoFix: tracepoint.h: Disable address sanitizer on pointer array section variables
Mathieu Desnoyers [Tue, 18 Feb 2020 00:25:01 +0000 (19:25 -0500)] 
Fix: tracepoint.h: Disable address sanitizer on pointer array section variables

The tracepoint header declares pointer global variables meant to be
placed contiguously within the __tracepoints_ptrs section, and then used
as an array of pointers when loading an executable or shared object.

Clang Address Sanitizer adds redzones around each variable, thus leading to
detection of a global buffer overflow.

Those redzones should not be placed within this section, because it
defeats its purpose. Therefore, teach asan not to add redzones
around those variables with an attribute.

Note that there does not appear to be any issue with gcc (tested with
gcc-8 with address sanitization enabled), and gcc ignores the
no_sanitize_address attribute when applied to a global variable.

Fixes: #1238
Signed-off-by: Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
4 years agoFix: jhash.h: remove out-of-bound reads
Mathieu Desnoyers [Tue, 18 Feb 2020 00:31:41 +0000 (19:31 -0500)] 
Fix: jhash.h: remove out-of-bound reads

jhash.h implements "special" code for valgrind because it reads memory
out-of-bound (and then applies a mask) when reading strings.

Considering that lttng-ust does not use jhash.h in a fast-path, remove
this "optimization" and use the verifiable VALGRIND code instead. This
fixes an ASan splat.

Fixes: #1238
Signed-off-by: Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
4 years agoFix: generation of man pages with multiple refnames
Simon Marchi [Thu, 6 Feb 2020 15:06:45 +0000 (10:06 -0500)] 
Fix: generation of man pages with multiple refnames

In this proposed patch [1], we're trying to make a man page with two
command names in the NAME section, like this:

  tracef, vtracef - LTTng-UST printf(3)-like interface

Doing so causes the intermediary XML (what asciidoc outputs) to contain
this:

    <refnamediv>
      <refname>tracef, vtracef</refname>
      <refpurpose>LTTng-UST printf(3)-like interface</refpurpose>
    </refnamediv>

The refname is used by the docbook XSL to determine the output
filename.  This therefore results in an output file named
`tracef,_vtracef.3`, which is not desirable.

The problem is in the asciidoc pass, more specifically the part of
asciidoc.conf removed by this patch.  Is is there to override the
`source`, `version` and `manual` fields, but it also inadvertently
affects the refname generation.

Instead of playing with the asciidoc output template, this patch sets
the same `source`, `version` and `manual` attributes on the asciidoc
command line.  With the present patch applied, the XML output contains:

    <refnamediv>
        <refname>tracef</refname>
        <refname>vtracef</refname>
        <refpurpose>LTTng-UST printf(3)-like interface</refpurpose>
    </refnamediv>

The xmlto pass (docbook XML -> man page) then generates two files,
`tracef.3` and `vtracef.3`, where `vtracef.3` simply sources `tracef.3`
(which is what we want).

[1] https://lists.lttng.org/pipermail/lttng-dev/2020-February/029524.html

Signed-off-by: Simon Marchi <simon.marchi@efficios.com>
Signed-off-by: Philippe Proulx <eeppeliteloop@gmail.com>
Signed-off-by: Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
4 years agoCleanup: remove trailing white spaces across project
Francis Deslauriers [Mon, 17 Feb 2020 15:46:45 +0000 (10:46 -0500)] 
Cleanup: remove trailing white spaces across project

Signed-off-by: Francis Deslauriers <francis.deslauriers@efficios.com>
Signed-off-by: Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
Change-Id: I15202338465ee56d33316cbc632d9e3bf44ee31e

4 years agoFix: lttng-ust-comm.c: return number of fd rather size of array
Francis Deslauriers [Tue, 26 Nov 2019 16:16:30 +0000 (11:16 -0500)] 
Fix: lttng-ust-comm.c: return number of fd rather size of array

There are two conflicting comments for this function. One says it
returns the size of the received data and the other says it returns the
number of fd received.

It's more useful to receive the number of fd.

Signed-off-by: Francis Deslauriers <francis.deslauriers@efficios.com>
Signed-off-by: Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
Change-Id: I74084b461d396c3e623fa55100e6dd7e59dbea83

4 years agoliblttng-ust-comm: move `_unlock_fd_tracker()` after `close()` on error paths
Francis Deslauriers [Thu, 12 Dec 2019 14:32:00 +0000 (09:32 -0500)] 
liblttng-ust-comm: move `_unlock_fd_tracker()` after `close()` on error paths

Right now, receiving an error from `lttng_ust_add_fd_to_tracker()` means that
the fd was _not_ added to the fd set. So the `lttng_ust_safe_close_fd()`
(overriding `close()`) call will indeed close the fd as expected. So, it
doesn't matter if the `close()` is before or after the `_unlock_`.

Even considering that, I believe that it's clearer and more common to
have all related operations within the `_lock_` and  `_unlock_`
functions. Also, `lttng_ust_add_fd_to_tracker()` might be modified in
the future and fail for some other reason.

Signed-off-by: Francis Deslauriers <francis.deslauriers@efficios.com>
Signed-off-by: Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
Change-Id: Id29a6ab004cfd5ca601615e1a70c74cf754b12e2

4 years agoCleanup: liblttng-ust: change `int` flag to `bool`
Francis Deslauriers [Fri, 13 Dec 2019 22:24:25 +0000 (17:24 -0500)] 
Cleanup: liblttng-ust: change `int` flag to `bool`

Signed-off-by: Francis Deslauriers <francis.deslauriers@efficios.com>
Signed-off-by: Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
Change-Id: I78b35b6b99afe8a84aba6c836df3bce8d2532760

4 years agoliblttng-ust: exit loop early on event enabler match
Francis Deslauriers [Fri, 6 Dec 2019 22:49:35 +0000 (17:49 -0500)] 
liblttng-ust: exit loop early on event enabler match

Signed-off-by: Francis Deslauriers <francis.deslauriers@efficios.com>
Signed-off-by: Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
Change-Id: I0fa3215f7cd6a2d32ac00d66cf5fc184abd14612

4 years agoCleanup: remove redundant memory barrier
Francis Deslauriers [Wed, 11 Dec 2019 22:14:43 +0000 (17:14 -0500)] 
Cleanup: remove redundant memory barrier

This memory barrier is redundant with the one already issued in
`rcu_assign_pointer()` function during the `set_tracepoint()` call.

Signed-off-by: Francis Deslauriers <francis.deslauriers@efficios.com>
Signed-off-by: Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
Change-Id: I78decd9ae87a63d7663928ad99e03831155548f7

4 years agoCleanup: remove unused `lttng_bytecode_runtime::event` field
Francis Deslauriers [Fri, 13 Dec 2019 15:17:30 +0000 (10:17 -0500)] 
Cleanup: remove unused `lttng_bytecode_runtime::event` field

Signed-off-by: Francis Deslauriers <francis.deslauriers@efficios.com>
Signed-off-by: Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
Change-Id: Id946b69e8cb4e79415d221f0be0889cfe707b439

4 years agoDocs: explain why unused `lttng_enabler::ctx` is kept around
Francis Deslauriers [Wed, 18 Dec 2019 21:46:21 +0000 (16:46 -0500)] 
Docs: explain why unused `lttng_enabler::ctx` is kept around

Signed-off-by: Francis Deslauriers <francis.deslauriers@efficios.com>
Signed-off-by: Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
Change-Id: I93cc035ced57e29f3d675c8c611d5319194e6cfb

4 years agoCleanup: remove unused `lttng_free_enabler_filter_bytecode()` func
Francis Deslauriers [Thu, 28 Nov 2019 19:26:20 +0000 (14:26 -0500)] 
Cleanup: remove unused `lttng_free_enabler_filter_bytecode()` func

Signed-off-by: Francis Deslauriers <francis.deslauriers@efficios.com>
Signed-off-by: Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
Change-Id: Id9326aec2e6758ffffeb3eb9805bb0fa85d3076c

4 years agoCleanup: move unused function to deprecated symbol list
Francis Deslauriers [Thu, 28 Nov 2019 19:20:43 +0000 (14:20 -0500)] 
Cleanup: move unused function to deprecated symbol list

Signed-off-by: Francis Deslauriers <francis.deslauriers@efficios.com>
Signed-off-by: Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
Change-Id: I9c75feee029364ab17ef3783a6c8f0d45ff2948b

4 years agoCleanup: remove unused `__check_ust_safe_fmt()` function
Francis Deslauriers [Tue, 3 Dec 2019 21:53:47 +0000 (16:53 -0500)] 
Cleanup: remove unused `__check_ust_safe_fmt()` function

Usages of this function were removed by this commit:
  commit 5e96a46756a5dcd6e348afd84078b9e26438245d
  Author: Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
  Date:   Tue Aug 9 09:46:51 2011 -0400

      Add UST_DEBUG env. var. support

Signed-off-by: Francis Deslauriers <francis.deslauriers@efficios.com>
Signed-off-by: Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
Change-Id: I535028fc9338c0c2cef51a993bcab8f0e6c062c6

4 years agoCleanup: silence unused parameter `ps` warning
Francis Deslauriers [Tue, 3 Dec 2019 21:07:44 +0000 (16:07 -0500)] 
Cleanup: silence unused parameter `ps` warning

This function was copied here from one of the BSDs by this commit:
e5bc3b0f4d6c0407492ebdea863483925393e1bc with the /*ARGSUSED*/
lint-style comment to prevent any `unused` warning.

It seems clang doesn't support those lint-style comments, so it prints
this warning:
  CC       libustsnprintf_la-core.lo
  mbrtowc_sb.c:39:68: error: unused parameter 'ps' [-Werror,-Wunused-parameter]
  ust_safe_mbrtowc(wchar_t *pwc, const char *s, size_t n, mbstate_t *ps)

So mark that parameter as unused to prevent any warning.

We could also simply remove the unused parameter and change the
signature of the function.

Signed-off-by: Francis Deslauriers <francis.deslauriers@efficios.com>
Signed-off-by: Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
Change-Id: I09f4fd3938058ed985c1525d8b9b06a27529691e

4 years agoCleanup: apply `include-what-you-use` guideline for `close()`
Francis Deslauriers [Thu, 5 Dec 2019 23:17:31 +0000 (18:17 -0500)] 
Cleanup: apply `include-what-you-use` guideline for `close()`

I saw that some files use the `close()` function but there are not
including a header for it. The `close()` function is defined by the
following header: <unistd.h>

So, to follow the best practice of including what is used in a file, I
added `#include <unistd.h>` in files using `close()`.

Signed-off-by: Francis Deslauriers <francis.deslauriers@efficios.com>
Signed-off-by: Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
Change-Id: I07e104e957857c869576af7c2704e98584ecc763

4 years agoCleanup: apply `include-what-you-use` guideline for `uint*_t`
Francis Deslauriers [Tue, 3 Dec 2019 22:17:42 +0000 (17:17 -0500)] 
Cleanup: apply `include-what-you-use` guideline for `uint*_t`

I saw that some files use `uint*_t` types but there are not including a
header for it. The `uint*_t` types is defined by the following header:
  <stdint.h>

So, to follow the best practice of including what is used in a file, I
added `#include <stdint.h>` in files using `uint*_t`.

Signed-off-by: Francis Deslauriers <francis.deslauriers@efficios.com>
Signed-off-by: Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
Change-Id: I5da13744858a57fc8c9bf6a6cf1b29299c2211cc

4 years agoCleanup: apply `include-what-you-use` guideline for `mbstate_t`
Francis Deslauriers [Tue, 3 Dec 2019 20:47:24 +0000 (15:47 -0500)] 
Cleanup: apply `include-what-you-use` guideline for `mbstate_t`

I saw that some files use the `mbstate_t` type but there are not including
a header for it. The `mbstate_t` type is defined by the following header:
  <wchar.h>

So, to follow the best practice of including what is used in a file, I
added `#include <wchar.h>` in files using `mbstate_t`.

Signed-off-by: Francis Deslauriers <francis.deslauriers@efficios.com>
Signed-off-by: Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
Change-Id: I103d144ede1a8488d2662d3b8ba5337accafda99

4 years agoCleanup: apply `include-what-you-use` guideline for `fpos_t`
Francis Deslauriers [Tue, 3 Dec 2019 20:42:33 +0000 (15:42 -0500)] 
Cleanup: apply `include-what-you-use` guideline for `fpos_t`

I saw that some files use the `fpos_t` type but there are not including
a header for it. The `fpos_t` type is defined by the following header:
  <stdio.h>

So, to follow the best practice of including what is used in a file, I
added `#include <stdio.h>` in files using `fpos_t`.

Signed-off-by: Francis Deslauriers <francis.deslauriers@efficios.com>
Signed-off-by: Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
Change-Id: I808ad0b23f04389fd56f89aa001095b771a327d6

4 years agoCleanup: apply `include-what-you-use` guideline for `size_t`
Francis Deslauriers [Tue, 3 Dec 2019 20:33:22 +0000 (15:33 -0500)] 
Cleanup: apply `include-what-you-use` guideline for `size_t`

I saw that some files use the `size_t` type but there are not including
a header for it. The `size_t` type is defined by the following headers:
  <stddef.h>
  <stdio.h>
  <stdlib.h>
  <string.h>
  <time.h>
  <wchar.h>

So, to follow the best practice of including what is used in a file, I
added `#include <stddef.h>` in files using `size_t` but did not include
any of the previously listed header.

Signed-off-by: Francis Deslauriers <francis.deslauriers@efficios.com>
Signed-off-by: Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
Change-Id: Ica1d82691335294decf13ffcdf4257e35d6a44c2

4 years agoCleanup: typo: column -> colon
Francis Deslauriers [Wed, 27 Nov 2019 19:14:24 +0000 (14:14 -0500)] 
Cleanup: typo: column -> colon

Signed-off-by: Francis Deslauriers <francis.deslauriers@efficios.com>
Signed-off-by: Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
Change-Id: I6873c94805ad02e4bba1431f7202ae0185d9698f

4 years agoAdd git-review config
Francis Deslauriers [Wed, 27 Nov 2019 20:16:06 +0000 (15:16 -0500)] 
Add git-review config

Add .gitreview for contributors wishing to use gerrit for patch
reviews.

Signed-off-by: Francis Deslauriers <francis.deslauriers@efficios.com>
Signed-off-by: Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
Change-Id: I3ba853d0d68a660ac5d2d24c757e0f28b634977c

4 years agoVersion 2.12.0-rc1 v2.12.0-rc1
Mathieu Desnoyers [Wed, 5 Feb 2020 15:37:32 +0000 (10:37 -0500)] 
Version 2.12.0-rc1

Signed-off-by: Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
4 years agoFix: build with -fno-common
Michael Jeanson [Thu, 16 Jan 2020 15:59:14 +0000 (10:59 -0500)] 
Fix: build with -fno-common

GCC 10 will default to building with -fno-common, this inhibits the
linker from merging multiple tentative definitions of a symbol in an
archive. Keep only the declaration in the libustsnprintf.la convenience
library.

Signed-off-by: Michael Jeanson <mjeanson@efficios.com>
Signed-off-by: Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
Change-Id: I8fb7c72811ce7e62f10342f55fcabeeabfdd4c67

4 years agoBump LTTNG_UST_ABI_MINOR_VERSION to 1
Mathieu Desnoyers [Fri, 20 Dec 2019 15:49:20 +0000 (10:49 -0500)] 
Bump LTTNG_UST_ABI_MINOR_VERSION to 1

Increment the minor version of lttng-ust ABI to 1, to take into
account that the "clear" command was added in this release cycle.

This will allow future LTTng-tools versions to check for this
capability.

Signed-off-by: Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
4 years agolttng-clear: stop tracing required
Mathieu Desnoyers [Wed, 23 Oct 2019 16:57:47 +0000 (12:57 -0400)] 
lttng-clear: stop tracing required

Require that tracing is stopped when buffers are cleared. Update
comments and warning checks to that effect.

Signed-off-by: Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
5 years agodoc: fix build failure due to wrong whitespace character
Simon Marchi [Mon, 18 Nov 2019 18:44:14 +0000 (13:44 -0500)] 
doc: fix build failure due to wrong whitespace character

The previous, commit:

    54435b75df4c ("doc: reformat long lines in doc/examples/Makefile.am")

introduced the following build failure, when the support for JUL is
enabled:

    make[1]: Entering directory '/home/smarchi/build/lttng-ust/doc/examples/java-jul'
    javac -classpath "../../../liblttng-ust-java-agent/java/lttng-ust-agent-jul/lttng-ust-agent-jul.jar:../../../liblttng-ust-java-agent/java/lttng-ust-agent-common/lttng-ust-agent-common.jar:." -g Hello.java
    javac -classpath "../../../liblttng-ust-java-agent/java/lttng-ust-agent-jul/lttng-ust-agent-jul.jar:../../../liblttng-ust-java-agent/java/lttng-ust-agent-common/lttng-ust-agent-common.jar:." -g FilterChangeListenerExample.java
    javac -classpath "../../../liblttng-ust-java-agent/java/lttng-ust-agent-jul/lttng-ust-agent-jul.jar:../../../liblttng-ust-java-agent/java/lttng-ust-agent-common/lttng-ust-agent-common.jar:." -g ApplicationContextExample.java
    make[1]: *** No rule to make target ' '.  Stop.
    make[1]: Leaving directory '/home/smarchi/build/lttng-ust/doc/examples/java-jul'
    Makefile:979: recipe for target 'all-local' failed
    make: *** [all-local] Error 1

I inadvertently inserted a character that looks like a space, but that
is not a space.  make tries to interpret it as a target name, which
obviously fails.

Replace it with a proper space.

Signed-off-by: Simon Marchi <simon.marchi@efficios.com>
Signed-off-by: Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
5 years agodoc: reformat long lines in doc/examples/Makefile.am
Simon Marchi [Mon, 18 Nov 2019 17:07:51 +0000 (12:07 -0500)] 
doc: reformat long lines in doc/examples/Makefile.am

Format the long lines in the all-local target a bit like the "cmake"
target is formatted already.  I think it helps readability to have one
argument per line instead of very long lines.

At the same time, I removed the "cd .." at the end of parentheses.  The
parentheses start a new subshell, so it's unnecessary to do "cd .."
before the subshell exits.

Signed-off-by: Simon Marchi <simon.marchi@efficios.com>
Signed-off-by: Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
5 years agodoc: pass AR when building examples
Simon Marchi [Mon, 18 Nov 2019 17:07:50 +0000 (12:07 -0500)] 
doc: pass AR when building examples

As reported here [1], when cross-compiling lttng-ust, the
"hello-static-lib" example uses the ar tool made for the --build machine
instead of the prefixed one, for the --host machine.

The Makefiles in the subdirectories of doc/examples are written by hand,
so that they can be easily copied and modified by users.  They are
therefore not integrated in the automake build system, and any value
detected by configure must be passed explicitly when invoking it.
For example, the CC value is already explicitly passed, so that the
compiler value found by configure is passed down.  We just need to do
the same for AR.

This patch adds AM_PROG_AR in configure.ac, so that configure finds the
prefixed version of ar, if cross-compiling.

It then sets the AR variable in doc/examples/Makefile.am, when invoking
sub-Makefiles.  I don't think we really need it in the cmake case, but
it doesn't hurt to have it there.

[1] https://lists.lttng.org/pipermail/lttng-dev/2019-November/029388.html

Reported-by: Rolf Eike Beer <eb@emlix.com>
Signed-off-by: Simon Marchi <simon.marchi@efficios.com>
Signed-off-by: Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
5 years agoRequire automake >= 1.12
Michael Jeanson [Thu, 7 Nov 2019 18:48:52 +0000 (13:48 -0500)] 
Require automake >= 1.12

The test suite LOG_DRIVER statement requires that automake >= 1.12 be used
during bootstrap.

Signed-off-by: Michael Jeanson <mjeanson@efficios.com>
Signed-off-by: Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
5 years agoAdd procname to lttng_ust_statedump information
Jonathan Rajotte [Fri, 28 Jun 2019 21:28:15 +0000 (17:28 -0400)] 
Add procname to lttng_ust_statedump information

Adding the process procname to the statedump allows users to disable
procname context in scenario for which the data and serialization overhead
of the procname process is problematic. Users can stitch information in
post-processing based on other contexts (pid).

Users can skip this statedump via the
LTTNG_UST_WITHOUT_PROCNAME_STATEDUMP env variable.

Note that the procname statedump value is the procname seen at
application start (lttng_ust_init). Subsequent calls to pthread_setname_np
or equivalent have no effect on this value.

Since we cannot use the current thread name due to the
lttng_pthread_setname_np call in ust_listener_thread, we store the
process name inside the sock_info struct before the call to
lttng_pthread_setname_np. This data structure is already present as the
"owner" object in the statedump mechanism. During the statedump, we fetch
the procname from the "owner" object.

Use LTTNG_HIDDEN to reduce visibility of lttng_ust_sockinfo_get_procname.

Signed-off-by: Jonathan Rajotte <jonathan.rajotte-julien@efficios.com>
Signed-off-by: Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
5 years agoDocs: LTTNG-UST(3): missing references to some namespace man pages
Jérémie Galarneau [Thu, 24 Oct 2019 19:08:28 +0000 (15:08 -0400)] 
Docs: LTTNG-UST(3): missing references to some namespace man pages

The LTTNG-UST(3) manual page is missing references to the mount,
network, ipc, and uts namespace man pages.

Signed-off-by: Jérémie Galarneau <jeremie.galarneau@efficios.com>
Signed-off-by: Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
5 years agoSet version to 2.12-pre
Michael Jeanson [Wed, 23 Oct 2019 15:31:32 +0000 (11:31 -0400)] 
Set version to 2.12-pre

Signed-off-by: Michael Jeanson <mjeanson@efficios.com>
Signed-off-by: Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
5 years agoAdd pkgconfig support for liblttng-ust-ctl
Michael Jeanson [Wed, 23 Oct 2019 15:11:30 +0000 (11:11 -0400)] 
Add pkgconfig support for liblttng-ust-ctl

Signed-off-by: Michael Jeanson <mjeanson@efficios.com>
Signed-off-by: Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
5 years agoFix: uninitialized variable in lib_ring_buffer_reserve_committed
Mathieu Desnoyers [Tue, 22 Oct 2019 19:29:48 +0000 (15:29 -0400)] 
Fix: uninitialized variable in lib_ring_buffer_reserve_committed

This internal function implemented in libringbuffer is not used within
lttng-ust actually, but uses an uninitialized variable:

As reported by clang:

        ./frontend_internal.h:263:75: warning: variable 'idx' is uninitialized when used here [-Wuninitialized]
                struct commit_counters_hot *cc_hot = shmp_index(handle, buf->commit_hot, idx);
                                                                                         ^~~
        ./shm.h:74:86: note: expanded from macro 'shmp_index'
                        ____ptr_ret = (__typeof__(____ptr_ret)) _shmp_offset((handle)->table, &(ref)._ref, index, sizeof(*____ptr_ret));        \
                                                                                                           ^~~~~
        ./frontend_internal.h:262:27: note: initialize the variable 'idx' to silence this warning
                unsigned long offset, idx, commit_count;
                                         ^
                                          = 0
        In file included from ring_buffer_backend.c:29:
        In file included from ./backend.h:33:
        ./frontend_internal.h:263:75: warning: variable 'idx' is uninitialized when used here [-Wuninitialized]
                struct commit_counters_hot *cc_hot = shmp_index(handle, buf->commit_hot, idx);
                                                                                         ^~~
        ./shm.h:74:86: note: expanded from macro 'shmp_index'
                        ____ptr_ret = (__typeof__(____ptr_ret)) _shmp_offset((handle)->table, &(ref)._ref, index, sizeof(*____ptr_ret));        \
                                                                                                           ^~~~~
        ./frontend_internal.h:262:27: note: initialize the variable 'idx' to silence this warning
                unsigned long offset, idx, commit_count;
                                         ^
                                          = 0

Signed-off-by: Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
5 years agoFix: document proper liburcu version dependency
Michael Jeanson [Mon, 21 Oct 2019 17:04:31 +0000 (13:04 -0400)] 
Fix: document proper liburcu version dependency

Signed-off-by: Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
5 years agoFix: Add missing files to distribution
Michael Jeanson [Mon, 21 Oct 2019 17:04:14 +0000 (13:04 -0400)] 
Fix: Add missing files to distribution

Signed-off-by: Michael Jeanson <mjeanson@efficios.com>
Signed-off-by: Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
5 years agoAdd userspace vuid/vgid contexts
Michael Jeanson [Tue, 12 Feb 2019 15:40:48 +0000 (10:40 -0500)] 
Add userspace vuid/vgid contexts

Add a context for each available namespaced user and group IDs

  * vuid : real user ID
  * veuid : effective user ID
  * vsuid : saved set-user ID

These are the IDs as seen in the current user namespace, see
user_namespaces(7) and credentials(7) for details on each type.

Signed-off-by: Michael Jeanson <mjeanson@efficios.com>
Signed-off-by: Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
5 years agoAdd userspace namespace contexts
Michael Jeanson [Tue, 12 Feb 2019 15:38:25 +0000 (10:38 -0500)] 
Add userspace namespace contexts

Add a context for each available kernel namespace which currently are :
cgroup, ipc, mnt, net, pid, user and uts. The id chosen to identify the
namespaces is the inode number of the file representing each one of them
in the proc filesystem.

This was introduced in kernel v3.8.0, if any of these context are
enabled on a system running an older kernel, zero will be returned.

Signed-off-by: Michael Jeanson <mjeanson@efficios.com>
Signed-off-by: Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
5 years agoFix: lttng perf counter deadlock
Mathieu Desnoyers [Mon, 7 Oct 2019 19:45:46 +0000 (15:45 -0400)] 
Fix: lttng perf counter deadlock

Using the ust_lock() to lazily setup the perf counters introduces
a scenario where this lock is nested within the urcu-bp read-side
lock.

However, the LTTNG_UST_WAIT_QUIESCENT ust command requires that
urcu-bp synchronize_rcu() is performed with the ust_lock() held.

This inter-dependency introduces a deadlock:

Thread A                          Thread B

rcu_read_lock()
                                  ust_lock()
                                  synchronize_rcu() (blocked by rcu
                                                     read-side lock)
ust_lock()   <-- deadlock

Introduce a new lttng_perf_lock to protect the lttng perf context
data structures from concurrent modifications and from fork. This
lock can be nested within the ust_lock, but never the opposite.

This removes the circular locking dependency involving urcu bp.

Fixes: #1202
Signed-off-by: Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
5 years agoRevert "Fix: fd tracker: do not allow signal handlers to close lttng-ust FDs"
Mathieu Desnoyers [Fri, 11 Oct 2019 14:11:39 +0000 (10:11 -0400)] 
Revert "Fix: fd tracker: do not allow signal handlers to close lttng-ust FDs"

This reverts commit 48a143c09cc97bf7a2ace811277e7d60b294b5f6.

Fixes: #1204
Signed-off-by: Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
5 years agoFix: fd tracker: do not allow signal handlers to close lttng-ust FDs
Mathieu Desnoyers [Mon, 7 Oct 2019 19:41:10 +0000 (15:41 -0400)] 
Fix: fd tracker: do not allow signal handlers to close lttng-ust FDs

Split the thread_fd_tracking state from the ust_fd_mutex_nest used to
track whether a signal handler is nested over a fd tracker lock.

lttng-ust listener threads need to invoke
lttng_ust_fd_tracker_register_thread() so the fd tracker can
distinguish them from application threads.

Otherwise, using ust_fd_mutex_nest to try to distinguish between
ust and application threads makes it possible for signal handlers
to appear as if they are ust listener threads, and thus attempt to
close UST file descriptors.

Signed-off-by: Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
Fixes: #1199
5 years agoFix: fd tracker: provide async-signal-safety for close wrapper
Mathieu Desnoyers [Fri, 4 Oct 2019 19:04:13 +0000 (15:04 -0400)] 
Fix: fd tracker: provide async-signal-safety for close wrapper

close(3) is part of the async-signal-safe functions. Therefore, it is
expected that the close wrapper provided by liblttng-ust-fd-tracker
behaves in a async-signal-safe way.

Use a similar strategy as ust_lock() does: disable signals when taking
and releasing the lock, and keep track of nesting with a TLS variable.
This ensures signals are restored to their original state when close(3)
ends up being invoked.

Fixes: #1199
Signed-off-by: Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
5 years agoFix: Disable cancellation around fd tracker lock
Mathieu Desnoyers [Fri, 4 Oct 2019 14:15:37 +0000 (10:15 -0400)] 
Fix: Disable cancellation around fd tracker lock

When using the ust fd tracker LD_PRELOAD library (liblttng-ust-fd.so),
cancelling other threads while they issue "close()" leads to deadlocks.

Fixes: #1201
Signed-off-by: Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
5 years agoFix: Lock FD tracker across fork
Mathieu Desnoyers [Fri, 4 Oct 2019 14:07:03 +0000 (10:07 -0400)] 
Fix: Lock FD tracker across fork

If fork() is performed while other threads are holding the fd tracker
lock, it will stay in locked state in the child process and eventually
cause a deadlock.

One way to solve this is to hold the fd tracker lock across fork(), in
the same way we do for the ust_lock. This ensures no other threads are
holding that lock in the parent, and therefore provides a consistent
lock state in the child.

Fixes: #1199
Fixes: #1200
Signed-off-by: Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
5 years agodoc/man: include build version in GitHub links
Philippe Proulx [Tue, 22 May 2018 15:47:07 +0000 (11:47 -0400)] 
doc/man: include build version in GitHub links

Linking to master branch files on GitHub is not safe because files could
be renamed, whereas the layout stays the same for a given version tag.

Signed-off-by: Philippe Proulx <eeppeliteloop@gmail.com>
Signed-off-by: Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
5 years agoCheck if the AR environment variable exists for cross compilation
Maxime SORIN [Fri, 17 May 2019 12:30:01 +0000 (14:30 +0200)] 
Check if the AR environment variable exists for cross compilation

Signed-off-by: Maxime SORIN <msorin@msorin.com>
Signed-off-by: Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
5 years agoustctl: Implement ring buffer clear
Mathieu Desnoyers [Wed, 30 May 2018 00:28:01 +0000 (02:28 +0200)] 
ustctl: Implement ring buffer clear

Signed-off-by: Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
5 years agoMake bitfield.h C++-friendly
Simon Marchi [Tue, 20 Aug 2019 01:51:06 +0000 (21:51 -0400)] 
Make bitfield.h C++-friendly

This patch changes bitfield.h to be usable in C++11.

It will probably never be compiled as C++ in the context of
lttng-ust, but this is just to keep things sync'ed across projects.

Signed-off-by: Simon Marchi <simon.marchi@efficios.com>
Signed-off-by: Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
5 years agoFix: don't wait for initial statedump when 0 session active
Mathieu Desnoyers [Fri, 2 Aug 2019 14:43:35 +0000 (10:43 -0400)] 
Fix: don't wait for initial statedump when 0 session active

commit eb0e6022d5e2 "Fix: wait for initial statedump before proceeding
to the main program"

introduced a regression when an application interacts with a session
daemon which has 0 session active.

An application linked against lttng-ust started with
LTTNG_UST_REGISTER_TIMEOUT=-1 hangs forever.

Fix this by decrementing the semaphore if no statedump was requested
when the registration done command is received.

Signed-off-by: Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
5 years agoFix: wait for initial statedump before proceeding to the main program
Gabriel-Andrew Pollo-Guilbert [Mon, 29 Jul 2019 22:05:35 +0000 (18:05 -0400)] 
Fix: wait for initial statedump before proceeding to the main program

In the case of short lived applications, the application may exit before
the initial statedump has completed.

Higher-level trace analysis features such as translating addresses to
symbols rely on statedump. That information is required for those
analyses to work on such short-lived applications.

Force the statedump to occur before handing the control to the
application.

Fixes #1190

Signed-off-by: Gabriel-Andrew Pollo-Guilbert <gabriel.pollo-guilbert@efficios.com>
Signed-off-by: Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
5 years agoUse MAP_POPULATE to reduce pagefault when available
Jonathan Rajotte [Mon, 29 Jul 2019 18:49:59 +0000 (14:49 -0400)] 
Use MAP_POPULATE to reduce pagefault when available

Any ring buffer configuration bigger than PAGE_SIZE would result
in an increased latency for the first tracepoint hit (1200ns) landing on a
new PAGE_SIZE sized chunk of the mapped memory. This happens at least
for the first ring buffer traversal.

To alleviate this we can use MAP_POPULATE that will "prefault" the page
tables.

A similar flag seems to exist on freebsd (MAP_PREFAULT_READ) but I do
not have access to a system to test it and ensure it does indeed results
in the same effect. It mostly indicates that it prefaults for the
read case so I doubt it is the case.

Default to using MAP_POPULATE on Linux only for now. Support of
prefaulting on other platforms will be added as needed.

Link: https://lists.lttng.org/pipermail/lttng-dev/2019-July/029116.html
Link: https://lists.lttng.org/pipermail/lttng-dev/2019-July/029122.html
Tested-by: Yiteng Guo <guoyiteng@gmail.com>
Signed-off-by: Jonathan Rajotte <jonathan.rajotte-julien@efficios.com>
Signed-off-by: Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
5 years agoFix: remove uninitialised value
Gabriel-Andrew Pollo-Guilbert [Mon, 29 Jul 2019 15:14:26 +0000 (11:14 -0400)] 
Fix: remove uninitialised value

Commit 973eac638e4fd introduces an uninitialised value that may prevent
shared memory from being allocated. The compiler didn't give any warning
because the pointer to the value is sent to a function that don't do anything
with it. We simply pass NULL to that function.

Signed-off-by: Gabriel-Andrew Pollo-Guilbert <gabriel.pollo-guilbert@efficios.com>
Signed-off-by: Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
5 years agoFix: GCC unaligned pointer warnings
Gabriel-Andrew Pollo-Guilbert [Fri, 26 Jul 2019 22:00:07 +0000 (18:00 -0400)] 
Fix: GCC unaligned pointer warnings

The release of GCC 9 added the following warning:

-Waddress-of-packed-member, enabled by default, warns about an
unaligned pointer value from the address of a packed member of a
struct or union.

The warning is triggered in some place in LTTng-UST in cases where we
pass a pointer to get a result. Rather than passing the pointer directly
from the struct member, we get the result into a local storage, then
write into in the struct.

Signed-off-by: Gabriel-Andrew Pollo-Guilbert <gabriel.pollo-guilbert@efficios.com>
Signed-off-by: Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
5 years agoFix: do not use diagnostic pragma when GCC version is lower than 4.6.0
Jonathan Rajotte [Thu, 4 Jul 2019 18:51:37 +0000 (14:51 -0400)] 
Fix: do not use diagnostic pragma when GCC version is lower than 4.6.0

Signed-off-by: Jonathan Rajotte <jonathan.rajotte-julien@efficios.com>
Signed-off-by: Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
5 years agoFix: missing define when not building with gcc
Jonathan Rajotte [Thu, 4 Jul 2019 18:51:36 +0000 (14:51 -0400)] 
Fix: missing define when not building with gcc

Signed-off-by: Jonathan Rajotte <jonathan.rajotte-julien@efficios.com>
Signed-off-by: Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
5 years agoFix: client_sequence_number may dereference NULL pointer
Mathieu Desnoyers [Tue, 4 Jun 2019 18:36:44 +0000 (14:36 -0400)] 
Fix: client_sequence_number may dereference NULL pointer

Found by Coverity:
CID 1400710 (#1 of 1): Dereference null return value (NULL_RETURNS)
3. dereference: Dereferencing a null pointer header.

Signed-off-by: Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
5 years agoFix: namespace our gettid wrapper
Michael Jeanson [Mon, 3 Jun 2019 19:25:32 +0000 (15:25 -0400)] 
Fix: namespace our gettid wrapper

Since glibc 2.30, a gettid wrapper was added that conflicts with our
static declaration. Namespace our wrapper so there is no conflict,
we'll add support for the glibc provided wrapper in a further commit.

Signed-off-by: Michael Jeanson <mjeanson@efficios.com>
Signed-off-by: Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
5 years agoFix: get tid not pid in vtid context
Michael Jeanson [Mon, 3 Jun 2019 18:21:10 +0000 (14:21 -0400)] 
Fix: get tid not pid in vtid context

Looks like an over enthusiastic copy/paste error in
commit 98357ffd0125c23387d42d4b706c56077392326d.

Signed-off-by: Michael Jeanson <mjeanson@efficios.com>
Signed-off-by: Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
5 years agoCleanup: bitfields: streamline use of underscores
Mathieu Desnoyers [Fri, 17 May 2019 13:55:23 +0000 (09:55 -0400)] 
Cleanup: bitfields: streamline use of underscores

Do not prefix macro arguments with underscores. Use one leading
underscore as prefix for local variables defined within macros.

Signed-off-by: Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
5 years agoSilence compiler "always false comparison" warning
Mathieu Desnoyers [Tue, 14 May 2019 14:49:37 +0000 (10:49 -0400)] 
Silence compiler "always false comparison" warning

Compiling the bitfield test with gcc -Wextra generates those warnings:

 ../../include/babeltrace/bitfield-internal.h:38:45: warning: comparison of unsigned expression < 0 is always false [-Wtype-limits]
 #define _bt_is_signed_type(type) ((type) -1 < (type) 0)

This is the intent of the macro. Disable compiler warnings around use of
that macro.

Signed-off-by: Mathieu Desnoyers <mathieu.desnoyers@efficios.com
5 years agoFix: bitfield: shift undefined/implementation defined behaviors
Mathieu Desnoyers [Tue, 14 May 2019 14:48:15 +0000 (10:48 -0400)] 
Fix: bitfield: shift undefined/implementation defined behaviors

bitfield.h uses the left shift operator with a left operand which
may be negative. The C99 standard states that shifting a negative
value is undefined.

When building with -Wshift-negative-value, we get this gcc warning:

In file included from /home/smarchi/src/babeltrace/include/babeltrace/ctfser-internal.h:44:0,
                 from /home/smarchi/src/babeltrace/ctfser/ctfser.c:42:
/home/smarchi/src/babeltrace/include/babeltrace/ctfser-internal.h: In function ‘bt_ctfser_write_unsigned_int’:
/home/smarchi/src/babeltrace/include/babeltrace/bitfield-internal.h:116:24: error: left shift of negative value [-Werror=shift-negative-value]
   mask = ~((~(type) 0) << (__start % ts));  \
                        ^
/home/smarchi/src/babeltrace/include/babeltrace/bitfield-internal.h:222:2: note: in expansion of macro ‘_bt_bitfield_write_le’
  _bt_bitfield_write_le(ptr, type, _start, _length, _v)
  ^~~~~~~~~~~~~~~~~~~~~
/home/smarchi/src/babeltrace/include/babeltrace/ctfser-internal.h:418:3: note: in expansion of macro ‘bt_bitfield_write_le’
   bt_bitfield_write_le(mmap_align_addr(ctfser->base_mma) +
   ^~~~~~~~~~~~~~~~~~~~

This boils down to the fact that the expression ~((uint8_t)0) has type
"signed int", which is used as an operand of the left shift.  This is due
to the integer promotion rules of C99 (6.3.3.1):

    If an int can represent all values of the original type, the value is
    converted to an int; otherwise, it is converted to an unsigned int.
    These are called the integer promotions. All other types are unchanged
    by the integer promotions.

We also need to cast the result explicitly into the left hand
side type to deal with:

warning: large integer implicitly truncated to unsigned type [-Woverflow]

The C99 standard states that a right shift has implementation-defined
behavior when shifting a signed negative value. Add a preprocessor check
that the compiler provides the expected behavior, else provide an
alternative implementation which guarantees the intended behavior.

A preprocessor check is also added to ensure that the compiler
representation for signed values is two's complement, which is expected
by this header.

Document that this header strictly respects the C99 standard, with
the exception of its use of __typeof__.

Signed-off-by: Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
5 years agoFix: Update coding style link
Stefan Wallentowitz [Fri, 10 May 2019 14:00:58 +0000 (16:00 +0200)] 
Fix: Update coding style link

The documentation at kernel.org changed and the coding style has
moved.

Signed-off-by: Stefan Wallentowitz <stefan@wallentowitz.de>
5 years agoFix: alignment of ring buffer shm space reservation
Mathieu Desnoyers [Fri, 10 May 2019 15:51:10 +0000 (11:51 -0400)] 
Fix: alignment of ring buffer shm space reservation

commit a9ff648cc "Implement file-backed ring buffer" changes the order
of backend fields with respect to the frontend per-subbuffer
commit_counters_hot and commit_counters_cold arrays, but does not change
that order when calculating the space needed in the initial pass.

This discrepancy can be an issue for field alignment calculation.
Let's analyse the situation. If the incorrect position of alignment
calculation leads to a larger space reserved than the actual
allocations, no ill effect will be perceived by the user. However,
if space calculation is less than the allocations, it will cause the
ring buffer (and thus channel) creation to fail.

The fields that are incorrectly misplaced in size calculation (in
officially released versions) are:

* struct commit_counters_hot is aligned on CAA_CACHE_LINE_SIZE,
* struct commit_counters_cold is aligned on CAA_CACHE_LINE_SIZE,

Those are placed after (should be before) the backend fields:

* struct lttng_ust_lib_ring_buffer_backend_pages_shmp aligned on the
  natural alignment of ssize_t,
* alignment on page size,
* struct lttng_ust_lib_ring_buffer_backend_pages, aligned on the natural
  alignment of ssize_t,
* struct lttng_ust_lib_ring_buffer_backend_subbuffer, aligned on natural
  alignment of unsigned long,
* struct lttng_ust_lib_ring_buffer_backend_counts, aligned on natural
  alignment of uint64_t.

The largest alignment is the alignment on page size in the backend
fields. If we have a channel configured within specific ranges of
sub-buffer count, we should reach commit counters array dimensions
which cause the page size alignment to be lower than it should be in
the space calculation, and therefore leads to a problematic scenario
where space allocation will fail, thus leading to channel creation
failures.

Signed-off-by: Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
5 years agoFix: allocate ts_end in ringbuffer shared memory
Gabriel-Andrew Pollo-Guilbert [Fri, 10 May 2019 15:26:32 +0000 (11:26 -0400)] 
Fix: allocate ts_end in ringbuffer shared memory

Allocate the memory used by the ts_end field added by commit 6c737d05.
When allocating lots of subbuffer for a channel (512 or more),
zalloc_shm() will fail to allocate all the objects because the allocated
memory map didn't take account the newly added field.

With lttng-tools version: b14f53d4 (2.12.0-pre)

Steps to reproduce the bug:

1. lttng-sessiond -vvv --verbose-consumer
2. start a traced application
3. lttng create "test-sesssion"
4. lttng enable-channel --userspace --num-subbuf 512 \
                                --subbuf-size 8k --overwrite channel
5. lttng enable-event -u -a -c channel
6. lttng start

After these steps, the following error message show should be thrown:

Error: ask_channel_creation consumer command failed
Error: Error creating UST channel "channel" on the consumer daemon

Signed-off-by: Gabriel-Andrew Pollo-Guilbert <gabriel.pollo-guilbert@efficios.com>
Signed-off-by: Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
5 years agoFix: timestamp_end field should include all events within sub-buffer
Mathieu Desnoyers [Tue, 30 Apr 2019 15:23:44 +0000 (11:23 -0400)] 
Fix: timestamp_end field should include all events within sub-buffer

Fix for timestamp_end not including all events within sub-buffer. This
happens if a thread is preempted/interrupted for a long time between
reserve and commit (e.g. in the middle of a packet), which causes the
timestamp used for timestamp_end field of the packet header to be lower
than the timestamp of the last events in the buffer (those following the
event that was preempted/interrupted between reserve and commit).

The fix involves sampling the timestamp when doing the last space
reservation in a sub-buffer (which necessarily happens before doing the
delivery after its last commit). Save this timestamp temporarily in a
per-sub-buffer control area (we have exclusive access to that area until
we increment the commit counter).

Then, that timestamp value will be read when delivering the sub-buffer,
whichever event or switch happens to be the last to increment the commit
counter to perform delivery. The timestamp value can be read without
worrying about concurrent access, because at that point sub-buffer
delivery has exclusive access to the sub-buffer.

This ensures the timestamp_end value is always larger or equal to the
timestamp of the last event, always below or equal the timestamp_begin
of the following packet, and always below or equal the timestamp of the
first event in the following packet.

This changes the layout of the ring buffer shared memory area, so we
need to bump the LTTNG_UST_ABI version from 7.2 to 8.0, thus requiring
locked-step upgrade between liblttng-ust in applications, session
daemon, and consumer daemon. This fix therefore cannot be backported
to existing stable releases.

Fixes: #1183
Signed-off-by: Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
5 years agoHarmonize rw_prog_cxx_works macro across projects
Michael Jeanson [Tue, 16 Apr 2019 20:17:31 +0000 (16:17 -0400)] 
Harmonize rw_prog_cxx_works macro across projects

Signed-off-by: Michael Jeanson <mjeanson@efficios.com>
Signed-off-by: Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
5 years agoUpdate macros from the autoconf archive
Michael Jeanson [Tue, 16 Apr 2019 20:17:30 +0000 (16:17 -0400)] 
Update macros from the autoconf archive

Signed-off-by: Michael Jeanson <mjeanson@efficios.com>
Signed-off-by: Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
5 years agoust-ctl API: clarify getter usage requirements
Mathieu Desnoyers [Wed, 10 Apr 2019 15:14:03 +0000 (11:14 -0400)] 
ust-ctl API: clarify getter usage requirements

Signed-off-by: Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
5 years agoFix: don't access packet header for stream_id and stream_instance_id getters
Mathieu Desnoyers [Wed, 10 Apr 2019 14:31:47 +0000 (10:31 -0400)] 
Fix: don't access packet header for stream_id and stream_instance_id getters

The stream ID and stream instance ID are invariant for a stream, so
there is no point reading them from the packet header currently owned by
the consumer (between get/put subbuf).

Actually, the consumer try to access the stream_id from the live timer
when sending a live beacon without getting the reader subbuffer first.
Doing so is racy against producers. In typical live scenarios
(non-overwrite channels), the producers will always write the same
stream id and stream instance id values at the same header offsets,
which will "work", except for the initial state of an empty buffer:
the value "0" will be returned (erroneously).

For the less frequently used scenario of a live session with "overwrite"
channels, this is handled by issuing a CHAN_WARN_ON, which disables
tracing for the channel, and prints warning to the consumerd console
when running consumerd with LTTNG_UST_DEBUG=1.

In the case where a ring buffer does not have any data ready, it makes
no sense to try to get a subbuffer for reading anyway, so the approach
was broken.

So return the stream id and stream instance id from the internal
data structures rather than reading it from the ring buffer.

Signed-off-by: Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
This page took 0.04827 seconds and 4 git commands to generate.