X-Git-Url: http://git.lttng.org./?a=blobdiff_plain;f=liblttng-ust%2Fltt-events.c;h=911bf2929bd6a7bde214e315113163fff255e5b4;hb=882a56d75d6054e1bf35d1bcddd668be4da4980f;hp=9751089c564f6830cb449eceb084200593dab2ae;hpb=7c169cd8fd8de9d25557d89ce68a24b69fcb639c;p=lttng-ust.git diff --git a/liblttng-ust/ltt-events.c b/liblttng-ust/ltt-events.c index 9751089c..911bf292 100644 --- a/liblttng-ust/ltt-events.c +++ b/liblttng-ust/ltt-events.c @@ -20,6 +20,9 @@ #include #include #include +#include +#include +#include "clock.h" #include #include @@ -74,7 +77,6 @@ struct ust_pending_probe { }; static void _ltt_event_destroy(struct ltt_event *event); -static void _ltt_loglevel_destroy(struct session_loglevel *sl); static void _ltt_wildcard_destroy(struct session_wildcard *sw); static void _ltt_channel_destroy(struct ltt_channel *chan); static int _ltt_event_unregister(struct ltt_event *event); @@ -144,49 +146,11 @@ int pending_probe_fix_events(const struct lttng_event_desc *desc) size_t name_len = strlen(name); uint32_t hash; - /* - * For this event, we need to lookup the loglevel. If active (in - * the active loglevels hash table), we must create the event. - */ - if (desc->loglevel) { - const struct tracepoint_loglevel_entry *ev_ll; - struct loglevel_entry *loglevel; - - ev_ll = *desc->loglevel; - loglevel = get_loglevel(ev_ll->identifier); - if (!loglevel) - loglevel = get_loglevel_value(ev_ll->value); - if (loglevel) { - struct session_loglevel *sl; - - cds_list_for_each_entry(sl, &loglevel->session_list, - session_list) { - struct ltt_event *ev; - int ret; - - memcpy(&event_param, &sl->event_param, - sizeof(event_param)); - memcpy(event_param.name, - desc->name, - sizeof(event_param.name)); - /* create event */ - ret = ltt_event_create(sl->chan, - &event_param, NULL, - &ev); - if (ret) { - DBG("Error creating event"); - continue; - } - cds_list_add(&ev->loglevel_list, - &sl->events); - } - } - } - /* Wildcard */ { struct wildcard_entry *wildcard; + /* TODO: check if loglevel match */ wildcard = match_wildcard(desc->name); if (strcmp(desc->name, "lttng_ust:metadata") && wildcard) { struct session_wildcard *sw; @@ -225,6 +189,7 @@ int pending_probe_fix_events(const struct lttng_event_desc *desc) struct ltt_event *event; struct ltt_channel *chan; + /* TODO: check if loglevel match */ if (strncmp(name, e->name, LTTNG_UST_SYM_NAME_LEN - 1)) continue; event = e->event; @@ -259,7 +224,6 @@ struct ltt_session *ltt_session_create(void) return NULL; CDS_INIT_LIST_HEAD(&session->chan); CDS_INIT_LIST_HEAD(&session->events); - CDS_INIT_LIST_HEAD(&session->loglevels); CDS_INIT_LIST_HEAD(&session->wildcards); uuid_generate(session->uuid); cds_list_add(&session->list, &sessions); @@ -270,7 +234,6 @@ void ltt_session_destroy(struct ltt_session *session) { struct ltt_channel *chan, *tmpchan; struct ltt_event *event, *tmpevent; - struct session_loglevel *loglevel, *tmploglevel; struct session_wildcard *wildcard, *tmpwildcard; int ret; @@ -280,8 +243,6 @@ void ltt_session_destroy(struct ltt_session *session) WARN_ON(ret); } synchronize_trace(); /* Wait for in-flight events to complete */ - cds_list_for_each_entry_safe(loglevel, tmploglevel, &session->loglevels, list) - _ltt_loglevel_destroy(loglevel); cds_list_for_each_entry_safe(wildcard, tmpwildcard, &session->wildcards, list) _ltt_wildcard_destroy(wildcard); cds_list_for_each_entry_safe(event, tmpevent, &session->events, list) @@ -441,26 +402,6 @@ void _ltt_channel_destroy(struct ltt_channel *chan) chan->ops->channel_destroy(chan); } -int ltt_loglevel_create(struct ltt_channel *chan, - struct lttng_ust_event *event_param, - struct session_loglevel **_sl) -{ - struct session_loglevel *sl; - - sl = add_loglevel(event_param->name, chan, event_param); - if (!sl || IS_ERR(sl)) { - return PTR_ERR(sl); - } - *_sl = sl; - return 0; -} - -static -void _ltt_loglevel_destroy(struct session_loglevel *sl) -{ - _remove_loglevel(sl); -} - int ltt_wildcard_create(struct ltt_channel *chan, struct lttng_ust_event *event_param, struct session_wildcard **_sw) @@ -527,6 +468,7 @@ int ltt_event_create(struct ltt_channel *chan, switch (event_param->instrumentation) { case LTTNG_UST_TRACEPOINT: event->desc = ltt_event_get(event_param->name); + /* TODO: check if loglevel match */ if (event->desc) { ret = __tracepoint_probe_register(event_param->name, event->desc->probe_callback, @@ -545,9 +487,6 @@ int ltt_event_create(struct ltt_channel *chan, goto add_pending_error; } break; - case LTTNG_UST_TRACEPOINT_LOGLEVEL: - assert(0); - break; default: WARN_ON_ONCE(1); } @@ -881,14 +820,12 @@ int _ltt_event_metadata_statedump(struct ltt_session *session, goto end; if (event->desc->loglevel) { - const struct tracepoint_loglevel_entry *ll_entry; + const int *ll_entry; ll_entry = *event->desc->loglevel; ret = lttng_metadata_printf(session, - " loglevel.identifier = \"%s\";\n" - " loglevel.value = %lld;\n", - ll_entry->identifier, - (long long) ll_entry->value); + " loglevel = %d;\n", + ll_entry); if (ret) goto end; } @@ -987,8 +924,8 @@ int _ltt_stream_packet_context_declare(struct ltt_session *session) { return lttng_metadata_printf(session, "struct packet_context {\n" - " uint64_t timestamp_begin;\n" - " uint64_t timestamp_end;\n" + " uint64_clock_monotonic_t timestamp_begin;\n" + " uint64_clock_monotonic_t timestamp_end;\n" " uint32_t events_discarded;\n" " uint32_t content_size;\n" " uint32_t packet_size;\n" @@ -1014,11 +951,11 @@ int _ltt_event_header_declare(struct ltt_session *session) " enum : uint5_t { compact = 0 ... 30, extended = 31 } id;\n" " variant {\n" " struct {\n" - " uint27_t timestamp;\n" + " uint27_clock_monotonic_t timestamp;\n" " } compact;\n" " struct {\n" " uint32_t id;\n" - " uint64_t timestamp;\n" + " uint64_clock_monotonic_t timestamp;\n" " } extended;\n" " } v;\n" "} align(%u);\n" @@ -1027,11 +964,11 @@ int _ltt_event_header_declare(struct ltt_session *session) " enum : uint16_t { compact = 0 ... 65534, extended = 65535 } id;\n" " variant {\n" " struct {\n" - " uint32_t timestamp;\n" + " uint32_clock_monotonic_t timestamp;\n" " } compact;\n" " struct {\n" " uint32_t id;\n" - " uint64_t timestamp;\n" + " uint64_clock_monotonic_t timestamp;\n" " } extended;\n" " } v;\n" "} align(%u);\n\n", @@ -1040,6 +977,31 @@ int _ltt_event_header_declare(struct ltt_session *session) ); } +/* + * Approximation of NTP time of day to clock monotonic correlation, + * taken at start of trace. + * Yes, this is only an approximation. Yes, we can (and will) do better + * in future versions. + */ +static +uint64_t measure_clock_offset(void) +{ + uint64_t offset, monotonic[2], realtime; + struct timespec rts = { 0, 0 }; + int ret; + + monotonic[0] = trace_clock_read64(); + ret = clock_gettime(CLOCK_REALTIME, &rts); + if (ret < 0) + return 0; + monotonic[1] = trace_clock_read64(); + offset = (monotonic[0] + monotonic[1]) >> 1; + realtime = rts.tv_sec * 1000000000ULL; + realtime += rts.tv_nsec; + offset = realtime - offset; + return offset; +} + /* * Output metadata into this session's metadata buffers. */ @@ -1047,7 +1009,7 @@ static int _ltt_session_metadata_statedump(struct ltt_session *session) { unsigned char *uuid_c = session->uuid; - char uuid_s[37]; + char uuid_s[37], clock_uuid_s[CLOCK_UUID_LEN]; struct ltt_channel *chan; struct ltt_event *event; int ret = 0; @@ -1103,6 +1065,56 @@ int _ltt_session_metadata_statedump(struct ltt_session *session) if (ret) goto end; + ret = lttng_metadata_printf(session, + "clock {\n" + " name = %s;\n", + "monotonic" + ); + if (ret) + goto end; + + if (!trace_clock_uuid(clock_uuid_s)) { + ret = lttng_metadata_printf(session, + " uuid = \"%s\";\n", + clock_uuid_s + ); + if (ret) + goto end; + } + + ret = lttng_metadata_printf(session, + " description = \"Monotonic Clock\";\n" + " freq = %" PRIu64 "; /* Frequency, in Hz */\n" + " /* clock value offset from Epoch is: offset * (1/freq) */\n" + " offset = %" PRIu64 ";\n" + "};\n\n", + trace_clock_freq(), + measure_clock_offset() + ); + if (ret) + goto end; + + ret = lttng_metadata_printf(session, + "typealias integer {\n" + " size = 27; align = 1; signed = false;\n" + " map = clock.monotonic.value;\n" + "} := uint27_clock_monotonic_t;\n" + "\n" + "typealias integer {\n" + " size = 32; align = %u; signed = false;\n" + " map = clock.monotonic.value;\n" + "} := uint32_clock_monotonic_t;\n" + "\n" + "typealias integer {\n" + " size = 64; align = %u; signed = false;\n" + " map = clock.monotonic.value;\n" + "} := uint64_clock_monotonic_t;\n\n", + lttng_alignof(uint32_t) * CHAR_BIT, + lttng_alignof(uint64_t) * CHAR_BIT + ); + if (ret) + goto end; + ret = _ltt_stream_packet_context_declare(session); if (ret) goto end;