X-Git-Url: https://git.lttng.org/?p=lttng-tools.git;a=blobdiff_plain;f=src%2Fbin%2Flttng-sessiond%2Ftrace-kernel.c;h=c1104fac2cc903f53f9d387d8981778cbbc3b780;hp=79e4a2f4e28b7e64a1f83fa242cf4677a570a7c4;hb=8809eec0bb55b03862cb1eb128eb39d50104c258;hpb=990570edd474b304d4c935d82be6201d872025e4 diff --git a/src/bin/lttng-sessiond/trace-kernel.c b/src/bin/lttng-sessiond/trace-kernel.c index 79e4a2f4e..c1104fac2 100644 --- a/src/bin/lttng-sessiond/trace-kernel.c +++ b/src/bin/lttng-sessiond/trace-kernel.c @@ -1,19 +1,18 @@ /* * Copyright (C) 2011 - David Goulet * - * 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; only version 2 - * of the License. + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License, version 2 only, + * as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + * You should have received a copy of the GNU General Public License along + * with this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. */ #define _GNU_SOURCE @@ -22,10 +21,10 @@ #include #include -#include #include #include +#include "consumer.h" #include "trace-kernel.h" /* @@ -92,23 +91,44 @@ struct ltt_kernel_session *trace_kernel_create_session(char *path) /* Allocate a new ltt kernel session */ lks = zmalloc(sizeof(struct ltt_kernel_session)); if (lks == NULL) { - perror("create kernel session zmalloc"); + PERROR("create kernel session zmalloc"); goto error; } /* Init data structure */ - lks->fd = 0; - lks->metadata_stream_fd = 0; + lks->fd = -1; + lks->metadata_stream_fd = -1; lks->channel_count = 0; lks->stream_count_global = 0; lks->metadata = NULL; - lks->consumer_fd = 0; + lks->consumer_fd = -1; CDS_INIT_LIST_HEAD(&lks->channel_list.head); + /* Create default consumer output object */ + lks->consumer = consumer_create_output(CONSUMER_DST_LOCAL); + if (lks->consumer == NULL) { + goto error; + } + + /* + * The tmp_consumer stays NULL until a set_consumer_uri command is + * executed. At this point, the consumer should be nullify until an + * enable_consumer command. This assignment is symbolic since we've zmalloc + * the struct. + */ + lks->tmp_consumer = NULL; + + /* Use the default consumer output which is the tracing session path. */ + ret = snprintf(lks->consumer->dst.trace_path, PATH_MAX, "%s/kernel", path); + if (ret < 0) { + PERROR("snprintf consumer trace path"); + goto error; + } + /* Set session path */ ret = asprintf(&lks->trace_path, "%s/kernel", path); if (ret < 0) { - perror("asprintf kernel traces path"); + PERROR("asprintf kernel traces path"); goto error; } @@ -123,25 +143,25 @@ error: * * Return pointer to structure or NULL. */ -struct ltt_kernel_channel *trace_kernel_create_channel(struct lttng_channel *chan, char *path) +struct ltt_kernel_channel *trace_kernel_create_channel( + struct lttng_channel *chan, char *path) { - int ret; struct ltt_kernel_channel *lkc; lkc = zmalloc(sizeof(struct ltt_kernel_channel)); if (lkc == NULL) { - perror("ltt_kernel_channel zmalloc"); + PERROR("ltt_kernel_channel zmalloc"); goto error; } lkc->channel = zmalloc(sizeof(struct lttng_channel)); if (lkc->channel == NULL) { - perror("lttng_channel zmalloc"); + PERROR("lttng_channel zmalloc"); goto error; } memcpy(lkc->channel, chan, sizeof(struct lttng_channel)); - lkc->fd = 0; + lkc->fd = -1; lkc->stream_count = 0; lkc->event_count = 0; lkc->enabled = 1; @@ -149,12 +169,6 @@ struct ltt_kernel_channel *trace_kernel_create_channel(struct lttng_channel *cha /* Init linked list */ CDS_INIT_LIST_HEAD(&lkc->events_list.head); CDS_INIT_LIST_HEAD(&lkc->stream_list.head); - /* Set default trace output path */ - ret = asprintf(&lkc->pathname, "%s", path); - if (ret < 0) { - perror("asprintf kernel create channel"); - goto error; - } return lkc; @@ -175,7 +189,7 @@ struct ltt_kernel_event *trace_kernel_create_event(struct lttng_event *ev) lke = zmalloc(sizeof(struct ltt_kernel_event)); attr = zmalloc(sizeof(struct lttng_kernel_event)); if (lke == NULL || attr == NULL) { - perror("kernel event zmalloc"); + PERROR("kernel event zmalloc"); goto error; } @@ -185,8 +199,8 @@ struct ltt_kernel_event *trace_kernel_create_event(struct lttng_event *ev) attr->u.kprobe.addr = ev->attr.probe.addr; attr->u.kprobe.offset = ev->attr.probe.offset; strncpy(attr->u.kprobe.symbol_name, - ev->attr.probe.symbol_name, LTTNG_SYM_NAME_LEN); - attr->u.kprobe.symbol_name[LTTNG_SYM_NAME_LEN - 1] = '\0'; + ev->attr.probe.symbol_name, LTTNG_KERNEL_SYM_NAME_LEN); + attr->u.kprobe.symbol_name[LTTNG_KERNEL_SYM_NAME_LEN - 1] = '\0'; break; case LTTNG_EVENT_FUNCTION: attr->instrumentation = LTTNG_KERNEL_KRETPROBE; @@ -194,14 +208,14 @@ struct ltt_kernel_event *trace_kernel_create_event(struct lttng_event *ev) attr->u.kretprobe.offset = ev->attr.probe.offset; attr->u.kretprobe.offset = ev->attr.probe.offset; strncpy(attr->u.kretprobe.symbol_name, - ev->attr.probe.symbol_name, LTTNG_SYM_NAME_LEN); - attr->u.kretprobe.symbol_name[LTTNG_SYM_NAME_LEN - 1] = '\0'; + ev->attr.probe.symbol_name, LTTNG_KERNEL_SYM_NAME_LEN); + attr->u.kretprobe.symbol_name[LTTNG_KERNEL_SYM_NAME_LEN - 1] = '\0'; break; case LTTNG_EVENT_FUNCTION_ENTRY: attr->instrumentation = LTTNG_KERNEL_FUNCTION; strncpy(attr->u.ftrace.symbol_name, - ev->attr.ftrace.symbol_name, LTTNG_SYM_NAME_LEN); - attr->u.ftrace.symbol_name[LTTNG_SYM_NAME_LEN - 1] = '\0'; + ev->attr.ftrace.symbol_name, LTTNG_KERNEL_SYM_NAME_LEN); + attr->u.ftrace.symbol_name[LTTNG_KERNEL_SYM_NAME_LEN - 1] = '\0'; break; case LTTNG_EVENT_TRACEPOINT: attr->instrumentation = LTTNG_KERNEL_TRACEPOINT; @@ -218,11 +232,11 @@ struct ltt_kernel_event *trace_kernel_create_event(struct lttng_event *ev) } /* Copy event name */ - strncpy(attr->name, ev->name, LTTNG_SYM_NAME_LEN); - attr->name[LTTNG_SYM_NAME_LEN - 1] = '\0'; + strncpy(attr->name, ev->name, LTTNG_KERNEL_SYM_NAME_LEN); + attr->name[LTTNG_KERNEL_SYM_NAME_LEN - 1] = '\0'; /* Setting up a kernel event */ - lke->fd = 0; + lke->fd = -1; lke->event = attr; lke->enabled = 1; lke->ctx = NULL; @@ -230,6 +244,8 @@ struct ltt_kernel_event *trace_kernel_create_event(struct lttng_event *ev) return lke; error: + free(lke); + free(attr); return NULL; } @@ -240,14 +256,13 @@ error: */ struct ltt_kernel_metadata *trace_kernel_create_metadata(char *path) { - int ret; struct ltt_kernel_metadata *lkm; struct lttng_channel *chan; lkm = zmalloc(sizeof(struct ltt_kernel_metadata)); chan = zmalloc(sizeof(struct lttng_channel)); if (lkm == NULL || chan == NULL) { - perror("kernel metadata zmalloc"); + PERROR("kernel metadata zmalloc"); goto error; } @@ -260,18 +275,14 @@ struct ltt_kernel_metadata *trace_kernel_create_metadata(char *path) chan->attr.output = DEFAULT_KERNEL_CHANNEL_OUTPUT; /* Init metadata */ - lkm->fd = 0; + lkm->fd = -1; lkm->conf = chan; - /* Set default metadata path */ - ret = asprintf(&lkm->pathname, "%s/metadata", path); - if (ret < 0) { - perror("asprintf kernel metadata"); - goto error; - } return lkm; error: + free(lkm); + free(chan); return NULL; } @@ -281,19 +292,28 @@ error: * * Return pointer to structure or NULL. */ -struct ltt_kernel_stream *trace_kernel_create_stream(void) +struct ltt_kernel_stream *trace_kernel_create_stream(const char *name, + unsigned int count) { + int ret; struct ltt_kernel_stream *lks; lks = zmalloc(sizeof(struct ltt_kernel_stream)); if (lks == NULL) { - perror("kernel stream zmalloc"); + PERROR("kernel stream zmalloc"); + goto error; + } + + /* Set name */ + ret = snprintf(lks->name, sizeof(lks->name), "%s_%d", name, count); + if (ret < 0) { + PERROR("snprintf stream name"); goto error; } + lks->name[sizeof(lks->name) - 1] = '\0'; /* Init stream */ - lks->fd = 0; - lks->pathname = NULL; + lks->fd = -1; lks->state = 0; return lks; @@ -307,13 +327,19 @@ error: */ void trace_kernel_destroy_stream(struct ltt_kernel_stream *stream) { + int ret; + DBG("[trace] Closing stream fd %d", stream->fd); /* Close kernel fd */ - close(stream->fd); + if (stream->fd >= 0) { + ret = close(stream->fd); + if (ret) { + PERROR("close"); + } + } /* Remove from stream list */ cds_list_del(&stream->list); - free(stream->pathname); free(stream); } @@ -322,9 +348,18 @@ void trace_kernel_destroy_stream(struct ltt_kernel_stream *stream) */ void trace_kernel_destroy_event(struct ltt_kernel_event *event) { - DBG("[trace] Closing event fd %d", event->fd); - /* Close kernel fd */ - close(event->fd); + int ret; + + if (event->fd >= 0) { + DBG("[trace] Closing event fd %d", event->fd); + /* Close kernel fd */ + ret = close(event->fd); + if (ret) { + PERROR("close"); + } + } else { + DBG("[trace] Tearing down event (no associated fd)"); + } /* Remove from event list */ cds_list_del(&event->list); @@ -341,10 +376,16 @@ void trace_kernel_destroy_channel(struct ltt_kernel_channel *channel) { struct ltt_kernel_stream *stream, *stmp; struct ltt_kernel_event *event, *etmp; + int ret; DBG("[trace] Closing channel fd %d", channel->fd); /* Close kernel fd */ - close(channel->fd); + if (channel->fd >= 0) { + ret = close(channel->fd); + if (ret) { + PERROR("close"); + } + } /* For each stream in the channel list */ cds_list_for_each_entry_safe(stream, stmp, &channel->stream_list.head, list) { @@ -359,7 +400,6 @@ void trace_kernel_destroy_channel(struct ltt_kernel_channel *channel) /* Remove from channel list */ cds_list_del(&channel->list); - free(channel->pathname); free(channel->channel); free(channel->ctx); free(channel); @@ -370,12 +410,18 @@ void trace_kernel_destroy_channel(struct ltt_kernel_channel *channel) */ void trace_kernel_destroy_metadata(struct ltt_kernel_metadata *metadata) { + int ret; + DBG("[trace] Closing metadata fd %d", metadata->fd); /* Close kernel fd */ - close(metadata->fd); + if (metadata->fd >= 0) { + ret = close(metadata->fd); + if (ret) { + PERROR("close"); + } + } free(metadata->conf); - free(metadata->pathname); free(metadata); } @@ -385,14 +431,23 @@ void trace_kernel_destroy_metadata(struct ltt_kernel_metadata *metadata) void trace_kernel_destroy_session(struct ltt_kernel_session *session) { struct ltt_kernel_channel *channel, *ctmp; + int ret; DBG("[trace] Closing session fd %d", session->fd); /* Close kernel fds */ - close(session->fd); + if (session->fd >= 0) { + ret = close(session->fd); + if (ret) { + PERROR("close"); + } + } - if (session->metadata_stream_fd != 0) { + if (session->metadata_stream_fd >= 0) { DBG("[trace] Closing metadata stream fd %d", session->metadata_stream_fd); - close(session->metadata_stream_fd); + ret = close(session->metadata_stream_fd); + if (ret) { + PERROR("close"); + } } if (session->metadata != NULL) { @@ -403,6 +458,10 @@ void trace_kernel_destroy_session(struct ltt_kernel_session *session) trace_kernel_destroy_channel(channel); } + /* Wipe consumer output object */ + consumer_destroy_output(session->consumer); + consumer_destroy_output(session->tmp_consumer); + free(session->trace_path); free(session); }