X-Git-Url: http://git.lttng.org/?a=blobdiff_plain;f=lttng-events.c;h=a3758229c745ef53fa0929d766fc95dce8d66bec;hb=ba21566bd4d49e97184ac34bec82a95f47da28b4;hp=0ef87a8c992a9224b613b218ac1e324b95440a43;hpb=a90917c3f8c4ed79117f1caa333b29a2108084ec;p=lttng-modules.git diff --git a/lttng-events.c b/lttng-events.c index 0ef87a8c..a3758229 100644 --- a/lttng-events.c +++ b/lttng-events.c @@ -14,8 +14,10 @@ #include #include #include +#include #include "wrapper/uuid.h" #include "wrapper/vmalloc.h" /* for wrapper_vmalloc_sync_all() */ +#include "wrapper/random.h" #include "lttng-events.h" #include "lttng-tracer.h" @@ -111,6 +113,11 @@ int lttng_session_enable(struct lttng_session *session) ACCESS_ONCE(session->active) = 1; ACCESS_ONCE(session->been_active) = 1; ret = _lttng_session_metadata_statedump(session); + if (ret) { + ACCESS_ONCE(session->active) = 0; + goto end; + } + ret = lttng_statedump_start(session); if (ret) ACCESS_ONCE(session->active) = 0; end: @@ -794,8 +801,8 @@ int _lttng_stream_packet_context_declare(struct lttng_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" @@ -821,11 +828,11 @@ int _lttng_event_header_declare(struct lttng_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" @@ -834,11 +841,11 @@ int _lttng_event_header_declare(struct lttng_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", @@ -847,6 +854,33 @@ int _lttng_event_header_declare(struct lttng_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 }; + unsigned long flags; + + /* Disable interrupts to increase correlation precision. */ + local_irq_save(flags); + monotonic[0] = trace_clock_read64(); + getnstimeofday(&rts); + monotonic[1] = trace_clock_read64(); + local_irq_restore(flags); + + offset = (monotonic[0] + monotonic[1]) >> 1; + realtime = rts.tv_sec * NSEC_PER_SEC; + realtime += rts.tv_nsec; + offset = realtime - offset; + return offset; +} + /* * Output metadata into this session's metadata buffers. */ @@ -854,7 +888,7 @@ static int _lttng_session_metadata_statedump(struct lttng_session *session) { unsigned char *uuid_c = session->uuid.b; - unsigned char uuid_s[37]; + unsigned char uuid_s[37], clock_uuid_s[BOOT_ID_LEN]; struct lttng_channel *chan; struct lttng_event *event; int ret = 0; @@ -910,6 +944,71 @@ int _lttng_session_metadata_statedump(struct lttng_session *session) if (ret) goto end; + ret = lttng_metadata_printf(session, + "env {\n" + " domain = \"%s\";\n" + " sysname = \"%s\";\n" + " release = \"%s\";\n" + " version = \"%s\";\n" + "};\n\n", + "kernel", + utsname()->sysname, + utsname()->release, + utsname()->version + ); + 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 = %llu; /* Frequency, in Hz */\n" + " /* clock value offset from Epoch is: offset * (1/freq) */\n" + " offset = %llu;\n" + "};\n\n", + (unsigned long long) trace_clock_freq(), + (unsigned long long) 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 = _lttng_stream_packet_context_declare(session); if (ret) goto end;