X-Git-Url: http://git.efficios.com/?p=lttng-tools.git;a=blobdiff_plain;f=ltt-sessiond%2Fkernel-ctl.c;h=203c01050e82199f34128d09b9c5dd95ca6fb0a4;hp=09a3763eb835c30aaaa25fca4081f27d34aeb881;hb=1316184615e422526ef4fae68f980443414969c1;hpb=9f19cc17a942a7089fc209a2527d8b2960c83a00 diff --git a/ltt-sessiond/kernel-ctl.c b/ltt-sessiond/kernel-ctl.c index 09a3763eb..203c01050 100644 --- a/ltt-sessiond/kernel-ctl.c +++ b/ltt-sessiond/kernel-ctl.c @@ -24,14 +24,13 @@ #include #include -#include "lttngerr.h" -#include "libkernelctl.h" +#include +#include + #include "kernel-ctl.h" /* - * kernel_add_channel_context - * - * Add context on a kernel channel. + * Add context on a kernel channel. */ int kernel_add_channel_context(struct ltt_kernel_channel *chan, struct lttng_kernel_context *ctx) @@ -41,7 +40,12 @@ 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); if (ret < 0) { - perror("add context ioctl"); + if (errno != EEXIST) { + perror("add context ioctl"); + } else { + /* If EEXIST, we just ignore the error */ + ret = 0; + } goto error; } @@ -60,9 +64,7 @@ error: } /* - * kernel_add_event_context - * - * Add context on a kernel event. + * Add context on a kernel event. */ int kernel_add_event_context(struct ltt_kernel_event *event, struct lttng_kernel_context *ctx) @@ -91,10 +93,8 @@ error: } /* - * kernel_create_session - * - * Create a new kernel session, register it to the kernel tracer and add it to - * the session daemon session. + * Create a new kernel session, register it to the kernel tracer and add it to + * the session daemon session. */ int kernel_create_session(struct ltt_session *session, int tracer_fd) { @@ -102,7 +102,7 @@ int kernel_create_session(struct ltt_session *session, int tracer_fd) struct ltt_kernel_session *lks; /* Allocate data structure */ - lks = trace_create_kernel_session(); + lks = trace_kernel_create_session(session->path); if (lks == NULL) { ret = -1; goto error; @@ -122,7 +122,7 @@ int kernel_create_session(struct ltt_session *session, int tracer_fd) perror("fcntl session fd"); } - lks->kconsumer_fds_sent = 0; + lks->consumer_fds_sent = 0; session->kernel_session = lks; DBG("Kernel session created (fd: %d)", lks->fd); @@ -134,18 +134,17 @@ error: } /* - * kernel_create_channel - * - * Create a kernel channel, register it to the kernel tracer and add it to the - * kernel session. + * Create a kernel channel, register it to the kernel tracer and add it to the + * kernel session. */ -int kernel_create_channel(struct ltt_kernel_session *session, struct lttng_channel *chan, char *path) +int kernel_create_channel(struct ltt_kernel_session *session, + struct lttng_channel *chan, char *path) { int ret; struct ltt_kernel_channel *lkc; /* Allocate kernel channel */ - lkc = trace_create_kernel_channel(chan, path); + lkc = trace_kernel_create_channel(chan, path); if (lkc == NULL) { goto error; } @@ -179,27 +178,39 @@ error: } /* - * kernel_create_event - * - * Create a kernel event, enable it to the kernel tracer and add it to the - * channel event list of the kernel session. + * Create a kernel event, enable it to the kernel tracer and add it to the + * channel event list of the kernel session. */ -int kernel_create_event(struct lttng_event *ev, struct ltt_kernel_channel *channel) +int kernel_create_event(struct lttng_event *ev, + struct ltt_kernel_channel *channel) { int ret; struct ltt_kernel_event *event; - event = trace_create_kernel_event(ev); + event = trace_kernel_create_event(ev); if (event == NULL) { + ret = -1; goto error; } ret = kernctl_create_event(channel->fd, event->event); if (ret < 0) { - perror("create event ioctl"); + if (errno != EEXIST) { + PERROR("create event ioctl"); + } + ret = -errno; goto free_event; } + /* + * LTTNG_KERNEL_SYSCALL event creation will return 0 on success. However + * this FD must not be added to the event list. + */ + if (ret == 0 && event->event->instrumentation == LTTNG_KERNEL_SYSCALL) { + DBG2("Kernel event syscall creation success"); + goto end; + } + event->fd = ret; /* Prevent fd duplication after execlp() */ ret = fcntl(event->fd, F_SETFD, FD_CLOEXEC); @@ -213,18 +224,17 @@ int kernel_create_event(struct lttng_event *ev, struct ltt_kernel_channel *chann DBG("Event %s created (fd: %d)", ev->name, event->fd); +end: return 0; free_event: free(event); error: - return -1; + return ret; } /* - * kernel_disable_channel - * - * Disable a kernel channel. + * Disable a kernel channel. */ int kernel_disable_channel(struct ltt_kernel_channel *chan) { @@ -247,18 +257,15 @@ error: } /* - * kernel_enable_channel - * - * Enable a kernel channel. + * Enable a kernel channel. */ int kernel_enable_channel(struct ltt_kernel_channel *chan) { int ret; ret = kernctl_enable(chan->fd); - if (ret < 0) { - perror("enable chan ioctl"); - ret = errno; + if (ret < 0 && errno != EEXIST) { + perror("Enable kernel chan"); goto error; } @@ -272,20 +279,15 @@ error: } /* - * kernel_enable_event - * - * Enable a kernel event. + * Enable a kernel event. */ int kernel_enable_event(struct ltt_kernel_event *event) { int ret; ret = kernctl_enable(event->fd); - if (ret < 0) { - perror("enable event ioctl"); - if (errno == EEXIST) { - ret = -EEXIST; - } + if (ret < 0 && errno != EEXIST) { + perror("enable kernel event"); goto error; } @@ -299,17 +301,15 @@ error: } /* - * kernel_disable_event - * - * Disable a kernel event. + * Disable a kernel event. */ int kernel_disable_event(struct ltt_kernel_event *event) { int ret; ret = kernctl_disable(event->fd); - if (ret < 0) { - perror("disable event ioctl"); + if (ret < 0 && errno != EEXIST) { + perror("disable kernel event"); goto error; } @@ -323,10 +323,8 @@ error: } /* - * kernel_open_metadata - * - * Create kernel metadata, open from the kernel tracer and add it to the - * kernel session. + * Create kernel metadata, open from the kernel tracer and add it to the + * kernel session. */ int kernel_open_metadata(struct ltt_kernel_session *session, char *path) { @@ -334,7 +332,7 @@ int kernel_open_metadata(struct ltt_kernel_session *session, char *path) struct ltt_kernel_metadata *lkm; /* Allocate kernel metadata */ - lkm = trace_create_kernel_metadata(path); + lkm = trace_kernel_create_metadata(path); if (lkm == NULL) { goto error; } @@ -363,9 +361,7 @@ error: } /* - * kernel_start_session - * - * Start tracing session. + * Start tracing session. */ int kernel_start_session(struct ltt_kernel_session *session) { @@ -386,9 +382,7 @@ error: } /* - * kernel_wait_quiescent - * - * Make a kernel wait to make sure in-flight probe have completed. + * Make a kernel wait to make sure in-flight probe have completed. */ void kernel_wait_quiescent(int fd) { @@ -404,8 +398,23 @@ void kernel_wait_quiescent(int fd) } /* - * kernel_metadata_flush_buffer - * + * Kernel calibrate + */ +int kernel_calibrate(int fd, struct lttng_kernel_calibrate *calibrate) +{ + int ret; + + ret = kernctl_calibrate(fd, calibrate); + if (ret < 0) { + perror("calibrate ioctl"); + return -1; + } + + return 0; +} + + +/* * Force flush buffer of metadata. */ int kernel_metadata_flush_buffer(int fd) @@ -421,9 +430,7 @@ int kernel_metadata_flush_buffer(int fd) } /* - * kernel_flush_buffer - * - * Force flush buffer for channel. + * Force flush buffer for channel. */ int kernel_flush_buffer(struct ltt_kernel_channel *channel) { @@ -446,9 +453,7 @@ int kernel_flush_buffer(struct ltt_kernel_channel *channel) } /* - * kernel_stop_session - * - * Stop tracing session. + * Stop tracing session. */ int kernel_stop_session(struct ltt_kernel_session *session) { @@ -468,12 +473,10 @@ error: } /* - * kernel_open_channel_stream - * - * Open stream of channel, register it to the kernel tracer and add it - * to the stream list of the channel. + * Open stream of channel, register it to the kernel tracer and add it + * to the stream list of the channel. * - * Return the number of created stream. Else, a negative value. + * Return the number of created stream. Else, a negative value. */ int kernel_open_channel_stream(struct ltt_kernel_channel *channel) { @@ -481,7 +484,7 @@ int kernel_open_channel_stream(struct ltt_kernel_channel *channel) struct ltt_kernel_stream *lks; while ((ret = kernctl_create_stream(channel->fd)) > 0) { - lks = trace_create_kernel_stream(); + lks = trace_kernel_create_stream(); if (lks == NULL) { close(ret); goto error; @@ -516,9 +519,7 @@ error: } /* - * kernel_open_metadata_stream - * - * Open the metadata stream and set it to the kernel session. + * Open the metadata stream and set it to the kernel session. */ int kernel_open_metadata_stream(struct ltt_kernel_session *session) { @@ -565,7 +566,7 @@ ssize_t kernel_list_events(int tracer_fd, struct lttng_event **events) fp = fdopen(fd, "r"); if (fp == NULL) { perror("kernel tracepoint list fdopen"); - goto error; + goto error_fp; } /* @@ -577,26 +578,30 @@ ssize_t kernel_list_events(int tracer_fd, struct lttng_event **events) while ((size = fscanf(fp, "event { name = %m[^;]; };%n\n", &event, &pos)) == 1) { if (count > nbmem) { - DBG("Reallocating event list from %zd to %zd bytes", nbmem, + DBG("Reallocating event list from %zu to %zu bytes", nbmem, nbmem + KERNEL_EVENT_LIST_SIZE); /* Adding the default size again */ nbmem += KERNEL_EVENT_LIST_SIZE; elist = realloc(elist, nbmem); if (elist == NULL) { perror("realloc list events"); - goto error; + count = -ENOMEM; + goto end; } } - strncpy(elist[count].name, event, strlen(event)); + strncpy(elist[count].name, event, LTTNG_SYMBOL_NAME_LEN); + elist[count].name[LTTNG_SYMBOL_NAME_LEN - 1] = '\0'; count++; } *events = elist; - - DBG("Kernel list events done (%ld events)", count); - + DBG("Kernel list events done (%zu events)", count); +end: + fclose(fp); /* closes both fp and fd */ return count; +error_fp: + close(fd); error: return -1; }