X-Git-Url: https://git.lttng.org/?p=lttng-tools.git;a=blobdiff_plain;f=ltt-sessiond%2Ftrace.c;h=c090f21063d60d8e38c3aecf6150e17195c8d45f;hp=f59c96f3f7c40f06596052dc415ee6051ae4a7b2;hb=773168b7255d45fd28f018055292e93b7a76482d;hpb=b082db07f0c522527fc95fc97f3e99eb0579c0cc diff --git a/ltt-sessiond/trace.c b/ltt-sessiond/trace.c index f59c96f3f..c090f2106 100644 --- a/ltt-sessiond/trace.c +++ b/ltt-sessiond/trace.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 @@ -24,7 +24,6 @@ #include #include "lttngerr.h" -#include "ltt-sessiond.h" #include "trace.h" /* @@ -139,7 +138,9 @@ struct ltt_kernel_channel *trace_create_kernel_channel(struct lttng_channel *cha lkc->fd = 0; lkc->stream_count = 0; + lkc->event_count = 0; lkc->enabled = 1; + lkc->ctx = NULL; /* Init linked list */ CDS_INIT_LIST_HEAD(&lkc->events_list.head); CDS_INIT_LIST_HEAD(&lkc->stream_list.head); @@ -176,20 +177,28 @@ struct ltt_kernel_event *trace_create_kernel_event(struct lttng_event *ev) } switch (ev->type) { - case LTTNG_EVENT_KPROBES: - attr->instrumentation = LTTNG_KERNEL_KPROBES; - attr->u.kprobe.addr = ev->attr.kprobe.addr; - attr->u.kprobe.offset = ev->attr.kprobe.offset; + case LTTNG_EVENT_PROBE: + attr->instrumentation = LTTNG_KERNEL_KPROBE; + attr->u.kprobe.addr = ev->attr.probe.addr; + attr->u.kprobe.offset = ev->attr.probe.offset; strncpy(attr->u.kprobe.symbol_name, - ev->attr.kprobe.symbol_name, LTTNG_SYM_NAME_LEN); + ev->attr.probe.symbol_name, LTTNG_SYM_NAME_LEN); break; case LTTNG_EVENT_FUNCTION: + attr->instrumentation = LTTNG_KERNEL_KRETPROBE; + attr->u.kretprobe.addr = ev->attr.probe.addr; + 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); + 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); break; - case LTTNG_EVENT_TRACEPOINTS: - attr->instrumentation = LTTNG_KERNEL_TRACEPOINTS; + case LTTNG_EVENT_TRACEPOINT: + attr->instrumentation = LTTNG_KERNEL_TRACEPOINT; break; default: ERR("Unknown kernel instrumentation type (%d)", ev->type); @@ -203,6 +212,7 @@ struct ltt_kernel_event *trace_create_kernel_event(struct lttng_event *ev) lke->fd = 0; lke->event = attr; lke->enabled = 1; + lke->ctx = NULL; return lke; @@ -217,7 +227,7 @@ error: * * Return pointer to structure or NULL. */ -struct ltt_kernel_metadata *trace_create_kernel_metadata(void) +struct ltt_kernel_metadata *trace_create_kernel_metadata(char *path) { int ret; struct ltt_kernel_metadata *lkm; @@ -242,7 +252,7 @@ struct ltt_kernel_metadata *trace_create_kernel_metadata(void) lkm->fd = 0; lkm->conf = chan; /* Set default metadata path */ - ret = asprintf(&lkm->pathname, "%s/metadata", DEFAULT_TRACE_OUTPUT); + ret = asprintf(&lkm->pathname, "%s/metadata", path); if (ret < 0) { perror("asprintf kernel metadata"); goto error; @@ -310,8 +320,8 @@ void trace_destroy_kernel_event(struct ltt_kernel_event *event) void trace_destroy_kernel_channel(struct ltt_kernel_channel *channel) { - struct ltt_kernel_stream *stream; - struct ltt_kernel_event *event; + struct ltt_kernel_stream *stream, *stmp; + struct ltt_kernel_event *event, *etmp; DBG("[trace] Closing channel fd %d", channel->fd); /* Close kernel fd */ @@ -321,12 +331,12 @@ void trace_destroy_kernel_channel(struct ltt_kernel_channel *channel) free(channel->channel); /* For each stream in the channel list */ - cds_list_for_each_entry(stream, &channel->stream_list.head, list) { + cds_list_for_each_entry_safe(stream, stmp, &channel->stream_list.head, list) { trace_destroy_kernel_stream(stream); } /* For each event in the channel list */ - cds_list_for_each_entry(event, &channel->events_list.head, list) { + cds_list_for_each_entry_safe(event, etmp, &channel->events_list.head, list) { trace_destroy_kernel_event(event); } @@ -348,7 +358,7 @@ void trace_destroy_kernel_metadata(struct ltt_kernel_metadata *metadata) void trace_destroy_kernel_session(struct ltt_kernel_session *session) { - struct ltt_kernel_channel *channel; + struct ltt_kernel_channel *channel, *ctmp; DBG("[trace] Closing session fd %d", session->fd); /* Close kernel fds */ @@ -362,7 +372,7 @@ void trace_destroy_kernel_session(struct ltt_kernel_session *session) trace_destroy_kernel_metadata(session->metadata); } - cds_list_for_each_entry(channel, &session->channel_list.head, list) { + cds_list_for_each_entry_safe(channel, ctmp, &session->channel_list.head, list) { trace_destroy_kernel_channel(channel); }