X-Git-Url: https://git.lttng.org/?p=lttng-tools.git;a=blobdiff_plain;f=src%2Fbin%2Flttng-sessiond%2Fkernel.c;h=b32193451f2060c401ac9d7503f2e48574be3fe4;hp=381b83e6366c120128d9e6a639a081a24c54b684;hb=6e21424e11f47edb885c7f92ae1cae69eee0ed8e;hpb=7c493d31f0a1461e0f17a3fd494fef9459d1987c diff --git a/src/bin/lttng-sessiond/kernel.c b/src/bin/lttng-sessiond/kernel.c index 381b83e63..b32193451 100644 --- a/src/bin/lttng-sessiond/kernel.c +++ b/src/bin/lttng-sessiond/kernel.c @@ -15,9 +15,7 @@ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. */ -#define _GNU_SOURCE #define _LGPL_SOURCE -#include #include #include #include @@ -50,17 +48,24 @@ int kernel_add_channel_context(struct ltt_kernel_channel *chan, DBG("Adding context to channel %s", chan->channel->name); ret = kernctl_add_context(chan->fd, &ctx->ctx); if (ret < 0) { - if (errno != EEXIST) { - PERROR("add context ioctl"); - } else { + switch (-ret) { + case ENOSYS: + /* Exists but not available for this kernel */ + ret = LTTNG_ERR_KERN_CONTEXT_UNAVAILABLE; + goto error; + case EEXIST: /* If EEXIST, we just ignore the error */ ret = 0; + goto end; + default: + PERROR("add context ioctl"); + ret = LTTNG_ERR_KERN_CONTEXT_FAIL; + goto error; } - goto error; } +end: cds_list_add_tail(&ctx->list, &chan->ctx_list); - return 0; error: @@ -197,7 +202,7 @@ int kernel_create_event(struct lttng_event *ev, ret = kernctl_create_event(channel->fd, event->event); if (ret < 0) { - switch (errno) { + switch (-ret) { case EEXIST: break; case ENOSYS: @@ -209,7 +214,6 @@ int kernel_create_event(struct lttng_event *ev, default: PERROR("create event ioctl"); } - ret = -errno; goto free_event; } @@ -230,7 +234,7 @@ int kernel_create_event(struct lttng_event *ev, ret = kernctl_enable(event->fd); if (ret < 0) { - switch (errno) { + switch (-ret) { case EEXIST: ret = LTTNG_ERR_KERN_EVENT_EXIST; break; @@ -277,7 +281,6 @@ int kernel_disable_channel(struct ltt_kernel_channel *chan) ret = kernctl_disable(chan->fd); if (ret < 0) { PERROR("disable chan ioctl"); - ret = errno; goto error; } @@ -300,7 +303,7 @@ int kernel_enable_channel(struct ltt_kernel_channel *chan) assert(chan); ret = kernctl_enable(chan->fd); - if (ret < 0 && errno != EEXIST) { + if (ret < 0 && ret != -EEXIST) { PERROR("Enable kernel chan"); goto error; } @@ -325,7 +328,7 @@ int kernel_enable_event(struct ltt_kernel_event *event) ret = kernctl_enable(event->fd); if (ret < 0) { - switch (errno) { + switch (-ret) { case EEXIST: ret = LTTNG_ERR_KERN_EVENT_EXIST; break; @@ -356,7 +359,7 @@ int kernel_disable_event(struct ltt_kernel_event *event) ret = kernctl_disable(event->fd); if (ret < 0) { - switch (errno) { + switch (-ret) { case EEXIST: ret = LTTNG_ERR_KERN_EVENT_EXIST; break; @@ -387,7 +390,7 @@ int kernel_track_pid(struct ltt_kernel_session *session, int pid) if (!ret) { return LTTNG_OK; } - switch (errno) { + switch (-ret) { case EINVAL: return LTTNG_ERR_INVALID; case ENOMEM: @@ -409,7 +412,7 @@ int kernel_untrack_pid(struct ltt_kernel_session *session, int pid) if (!ret) { return LTTNG_OK; } - switch (errno) { + switch (-ret) { case EINVAL: return LTTNG_ERR_INVALID; case ENOMEM: @@ -573,25 +576,6 @@ void kernel_wait_quiescent(int fd) } } -/* - * Kernel calibrate - */ -int kernel_calibrate(int fd, struct lttng_kernel_calibrate *calibrate) -{ - int ret; - - assert(calibrate); - - ret = kernctl_calibrate(fd, calibrate); - if (ret < 0) { - PERROR("calibrate ioctl"); - return -1; - } - - return 0; -} - - /* * Force flush buffer of metadata. */ @@ -660,17 +644,22 @@ error: * Open stream of channel, register it to the kernel tracer and add it * to the stream list of the channel. * + * Note: given that the streams may appear in random order wrt CPU + * number (e.g. cpu hotplug), the index value of the stream number in + * the stream name is not necessarily linked to the CPU number. + * * Return the number of created stream. Else, a negative value. */ int kernel_open_channel_stream(struct ltt_kernel_channel *channel) { - int ret, count = 0; + int ret; struct ltt_kernel_stream *lks; assert(channel); while ((ret = kernctl_create_stream(channel->fd)) >= 0) { - lks = trace_kernel_create_stream(channel->channel->name, count); + lks = trace_kernel_create_stream(channel->channel->name, + channel->stream_count); if (lks == NULL) { ret = close(ret); if (ret) { @@ -689,13 +678,10 @@ int kernel_open_channel_stream(struct ltt_kernel_channel *channel) lks->tracefile_size = channel->channel->attr.tracefile_size; lks->tracefile_count = channel->channel->attr.tracefile_count; - /* Add stream to channe stream list */ + /* Add stream to channel stream list */ cds_list_add(&lks->list, &channel->stream_list.head); channel->stream_count++; - /* Increment counter which represent CPU number. */ - count++; - DBG("Kernel stream %s created (fd: %d, state: %d)", lks->name, lks->fd, lks->state); } @@ -830,7 +816,7 @@ int kernel_validate_version(int tracer_fd) ret = kernctl_tracer_version(tracer_fd, &version); if (ret < 0) { - ERR("Failed at getting the lttng-modules version"); + ERR("Failed to retrieve the lttng-modules version"); goto error; } @@ -842,11 +828,11 @@ int kernel_validate_version(int tracer_fd) } ret = kernctl_tracer_abi_version(tracer_fd, &abi_version); if (ret < 0) { - ERR("Failed at getting lttng-modules ABI version"); + ERR("Failed to retrieve lttng-modules ABI version"); goto error; } if (abi_version.major != LTTNG_MODULES_ABI_MAJOR_VERSION) { - ERR("Kernel tracer ABI version (%d.%d) is not compatible with expected ABI major version (%d.*)", + ERR("Kernel tracer ABI version (%d.%d) does not match the expected ABI major version (%d.*)", abi_version.major, abi_version.minor, LTTNG_MODULES_ABI_MAJOR_VERSION); goto error; @@ -860,6 +846,7 @@ error_version: ret = -1; error: + ERR("Kernel tracer version check failed; kernel tracing will not be available"); return ret; } @@ -1101,3 +1088,35 @@ 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. + * + * Return 1 on success, 0 when feature is not supported, negative value in case + * of errors. + */ +int kernel_supports_ring_buffer_snapshot_sample_positions(int tracer_fd) +{ + int ret = 0; // Not supported by default + struct lttng_kernel_tracer_abi_version abi; + + 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; +}