[lttng-dev] [PATCH lttng-tools] Fix: check lttng-modules ABI version for RING_BUFFER_SNAPSHOT_SAMPLE_POSITIONS support
Jérémie Galarneau
jeremie.galarneau at efficios.com
Tue Jun 13 16:15:50 UTC 2017
Merged in master and stable-2.10 with modifications. Thanks!
I'll also add a check on trigger registration.
Jérémie
On 15 May 2017 at 15:37, Jonathan Rajotte
<jonathan.rajotte-julien at efficios.com> wrote:
> The RING_BUFFER_SNAPSHOT_SAMPLE_POSITIONS was introduced in
> lttng-modules ABI version 2.3. When interacting with a kernel tracer
> witt ABI versions < 2.3, pass zero as monitor_timer_interval to disable
> the monitoring.
>
> Warn during sessiond startup and channel enabling if not supported.
>
> Fixes #1101
>
> Signed-off-by: Jonathan Rajotte <jonathan.rajotte-julien at efficios.com>
> ---
> src/bin/lttng-sessiond/cmd.c | 25 +++++++++++++++++++++++++
> src/bin/lttng-sessiond/kernel.c | 30 ++++++++++++++++++++++++++++++
> src/bin/lttng-sessiond/kernel.h | 1 +
> src/bin/lttng-sessiond/main.c | 12 ++++++++++++
> 4 files changed, 68 insertions(+)
>
> diff --git a/src/bin/lttng-sessiond/cmd.c b/src/bin/lttng-sessiond/cmd.c
> index f3ff2564..022329c7 100644
> --- a/src/bin/lttng-sessiond/cmd.c
> +++ b/src/bin/lttng-sessiond/cmd.c
> @@ -34,6 +34,7 @@
> #include <lttng/trigger/trigger-internal.h>
> #include <lttng/condition/condition.h>
> #include <lttng/action/action.h>
> +#include <lttng/channel.h>
> #include <lttng/channel-internal.h>
> #include <common/string-utils/string-utils.h>
>
> @@ -1349,6 +1350,30 @@ int cmd_enable_channel(struct ltt_session *session,
> attr->attr.switch_timer_interval = 0;
> }
>
> + /* Check for feature support */
> + switch (domain->type) {
> + case LTTNG_DOMAIN_KERNEL:
> + {
> + if (kernel_support_ring_buffer_snapshot_sample_positions(kernel_tracer_fd) < 1) {
> + /* Sampling position of buffer is not supported */
> + WARN("Kernel tracer does not support buffer monitoring. "
> + "Setting the monitor interval timer to 0 "
> + "(disabled) for channel '%s' of session '%s'",
> + attr-> name, session->name);
> + lttng_channel_set_monitor_timer_interval(attr, 0);
> + }
> + break;
> + }
> + case LTTNG_DOMAIN_UST:
> + case LTTNG_DOMAIN_JUL:
> + case LTTNG_DOMAIN_LOG4J:
> + case LTTNG_DOMAIN_PYTHON:
> + break;
> + default:
> + ret = LTTNG_ERR_UNKNOWN_DOMAIN;
> + goto error;
> + }
> +
> switch (domain->type) {
> case LTTNG_DOMAIN_KERNEL:
> {
> diff --git a/src/bin/lttng-sessiond/kernel.c b/src/bin/lttng-sessiond/kernel.c
> index aa516497..6bff1336 100644
> --- a/src/bin/lttng-sessiond/kernel.c
> +++ b/src/bin/lttng-sessiond/kernel.c
> @@ -1086,3 +1086,33 @@ int kernel_syscall_mask(int chan_fd, char **syscall_mask, uint32_t *nr_bits)
>
> return kernctl_syscall_mask(chan_fd, syscall_mask, nr_bits);
> }
> +
> +/*
> + * Check for the support of the RING_BUFFER_SNAPSHOT_SAMPLE_POSITIONS via abi
> + * version number.
Added an empty line here.
> + * Return 1 on success, 0 when feature is not supported, negative value in case
> + * of errors.
> + */
> +int kernel_support_ring_buffer_snapshot_sample_positions(int tracer_fd)
> +{
> + int ret = 0; // Not supported by default
> + struct lttng_kernel_tracer_abi_version abi;
Missing empty line here.
> + ret = kernctl_tracer_abi_version(tracer_fd, &abi);
> + if (ret < 0) {
> + ERR("Failed to retrieve lttng-modules ABI version");
> + goto error;
> + }
> +
> + /*
> + * RING_BUFFER_SNAPSHOT_SAMPLE_POSITIONS was introduced in 2.3
> + */
> + if (abi.major >= 2 && abi.minor >= 3) {
> + /* Supported */
> + ret = 1;
> + } else {
> + /* Not supported */
> + ret = 0;
> + }
> +error:
> + return ret;
> +}
> diff --git a/src/bin/lttng-sessiond/kernel.h b/src/bin/lttng-sessiond/kernel.h
> index 233ceffe..8c0959df 100644
> --- a/src/bin/lttng-sessiond/kernel.h
> +++ b/src/bin/lttng-sessiond/kernel.h
> @@ -65,5 +65,6 @@ int kernel_syscall_mask(int chan_fd, char **syscall_mask, uint32_t *nr_bits);
> int init_kernel_workarounds(void);
> ssize_t kernel_list_tracker_pids(struct ltt_kernel_session *session,
> int **_pids);
> +int kernel_support_ring_buffer_snapshot_sample_positions(int tracer_fd);
Renamed the function to "[...]_supports_[...]".
>
> #endif /* _LTT_KERNEL_CTL_H */
> diff --git a/src/bin/lttng-sessiond/main.c b/src/bin/lttng-sessiond/main.c
> index b856e126..19e26fb7 100644
> --- a/src/bin/lttng-sessiond/main.c
> +++ b/src/bin/lttng-sessiond/main.c
> @@ -2794,6 +2794,18 @@ static int init_kernel_tracer(void)
> goto error_modules;
> }
>
> + ret = kernel_support_ring_buffer_snapshot_sample_positions(kernel_tracer_fd);
> + if (ret < 0) {
> + goto error_modules;
> + }
> +
> + if (ret < 1) {
> + WARN("Kernel tracer does not support buffer monitoring. "
> + "Monitor interval timers will be set to 0 (disabled) "
> + "for future channels.");
Changed to
"Kernel tracer does not support buffer monitor. The monitor timer of
channels in the kernel domain will be set to 0 (disabled)."
> + }
> +
> +
> DBG("Kernel tracer fd %d", kernel_tracer_fd);
> return 0;
>
> --
> 2.11.0
>
--
Jérémie Galarneau
EfficiOS Inc.
http://www.efficios.com
More information about the lttng-dev
mailing list