X-Git-Url: https://git.lttng.org/?p=lttng-tools.git;a=blobdiff_plain;f=ltt-sessiond%2Fkernel-ctl.c;h=5c452ca924988e77694e0fc26ba3a242a8381886;hp=168bce1f3d3eb9ea89566da7cb65995fe8bb9c20;hb=050349bbb362ea993533591532643022efeab864;hpb=b082db07f0c522527fc95fc97f3e99eb0579c0cc diff --git a/ltt-sessiond/kernel-ctl.c b/ltt-sessiond/kernel-ctl.c index 168bce1f3..5c452ca92 100644 --- a/ltt-sessiond/kernel-ctl.c +++ b/ltt-sessiond/kernel-ctl.c @@ -3,8 +3,8 @@ * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License - * as published by the Free Software Foundation; either version 2 - * of the License, or (at your option) any later version. + * as published by the Free Software Foundation; only version 2 + * of the License. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of @@ -25,14 +25,11 @@ #include #include "lttngerr.h" -#include "ltt-sessiond.h" -#include "libkernelctl.h" +#include "kernelctl.h" #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) @@ -42,7 +39,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; } @@ -61,9 +63,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) @@ -92,10 +92,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) { @@ -125,7 +123,6 @@ int kernel_create_session(struct ltt_session *session, int tracer_fd) lks->kconsumer_fds_sent = 0; session->kernel_session = lks; - session->kern_session_count++; DBG("Kernel session created (fd: %d)", lks->fd); @@ -136,12 +133,11 @@ 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; @@ -181,12 +177,11 @@ 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; @@ -211,6 +206,8 @@ int kernel_create_event(struct lttng_event *ev, struct ltt_kernel_channel *chann /* Add event to event list */ cds_list_add(&event->list, &channel->events_list.head); + channel->event_count++; + DBG("Event %s created (fd: %d)", ev->name, event->fd); return 0; @@ -222,9 +219,7 @@ error: } /* - * kernel_disable_channel - * - * Disable a kernel channel. + * Disable a kernel channel. */ int kernel_disable_channel(struct ltt_kernel_channel *chan) { @@ -247,9 +242,7 @@ error: } /* - * kernel_enable_channel - * - * Enable a kernel channel. + * Enable a kernel channel. */ int kernel_enable_channel(struct ltt_kernel_channel *chan) { @@ -272,9 +265,7 @@ error: } /* - * kernel_enable_event - * - * Enable a kernel event. + * Enable a kernel event. */ int kernel_enable_event(struct ltt_kernel_event *event) { @@ -283,6 +274,9 @@ int kernel_enable_event(struct ltt_kernel_event *event) ret = kernctl_enable(event->fd); if (ret < 0) { perror("enable event ioctl"); + if (errno == EEXIST) { + ret = -EEXIST; + } goto error; } @@ -296,9 +290,7 @@ error: } /* - * kernel_disable_event - * - * Disable a kernel event. + * Disable a kernel event. */ int kernel_disable_event(struct ltt_kernel_event *event) { @@ -320,18 +312,16 @@ 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) +int kernel_open_metadata(struct ltt_kernel_session *session, char *path) { int ret; struct ltt_kernel_metadata *lkm; /* Allocate kernel metadata */ - lkm = trace_create_kernel_metadata(); + lkm = trace_create_kernel_metadata(path); if (lkm == NULL) { goto error; } @@ -360,9 +350,7 @@ error: } /* - * kernel_start_session - * - * Start tracing session. + * Start tracing session. */ int kernel_start_session(struct ltt_kernel_session *session) { @@ -383,9 +371,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) { @@ -401,8 +387,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) @@ -418,9 +419,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) { @@ -443,9 +442,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) { @@ -465,12 +462,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) { @@ -513,9 +508,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) { @@ -542,18 +535,16 @@ error: } /* - * kernel_list_events - * - * Get the event list from the kernel tracer and return that list in the CTF - * format. + * Get the event list from the kernel tracer and return the number of elements. */ -ssize_t kernel_list_events(int tracer_fd, char **list) +ssize_t kernel_list_events(int tracer_fd, struct lttng_event **events) { - int fd; - char *buf, *line = NULL; - size_t nb, nbmem, total = 0; + int fd, pos; + char *event; + size_t nbmem, count = 0; ssize_t size; FILE *fp; + struct lttng_event *elist; fd = kernctl_tracepoint_list(tracer_fd); if (fd < 0) { @@ -564,7 +555,7 @@ ssize_t kernel_list_events(int tracer_fd, char **list) fp = fdopen(fd, "r"); if (fp == NULL) { perror("kernel tracepoint list fdopen"); - goto error; + goto error_fp; } /* @@ -572,30 +563,34 @@ ssize_t kernel_list_events(int tracer_fd, char **list) * See kernel-ctl.h for explanation of this value */ nbmem = KERNEL_EVENT_LIST_SIZE; - buf = malloc(nbmem); + elist = malloc(sizeof(struct lttng_event) * nbmem); - while ((size = getline(&line, &nb, fp)) != -1) { - if (total + size > nbmem) { - DBG("Reallocating event list from %zd to %zd bytes", nbmem, - total + size + KERNEL_EVENT_LIST_SIZE); + while ((size = fscanf(fp, "event { name = %m[^;]; };%n\n", &event, &pos)) == 1) { + if (count > nbmem) { + DBG("Reallocating event list from %zu to %zu bytes", nbmem, + nbmem + KERNEL_EVENT_LIST_SIZE); /* Adding the default size again */ - nbmem = total + size + KERNEL_EVENT_LIST_SIZE; - buf = realloc(buf, nbmem); - if (buf == NULL) { + nbmem += KERNEL_EVENT_LIST_SIZE; + elist = realloc(elist, nbmem); + if (elist == NULL) { perror("realloc list events"); - goto error; + count = -ENOMEM; + goto end; } } - memcpy(buf + total, line, size); - total += size; + strncpy(elist[count].name, event, LTTNG_SYMBOL_NAME_LEN); + elist[count].name[LTTNG_SYMBOL_NAME_LEN - 1] = '\0'; + count++; } - *list = buf; - - DBG("Kernel list events done"); - - return total; + *events = elist; + 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; }