fix: need to undef mainline define
[lttng-modules.git] / lttng-events.c
index 0ef87a8c992a9224b613b218ac1e324b95440a43..a3758229c745ef53fa0929d766fc95dce8d66bec 100644 (file)
 #include <linux/sched.h>
 #include <linux/slab.h>
 #include <linux/jiffies.h>
+#include <linux/utsname.h>
 #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 <id> {\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 <id> {\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;
This page took 0.025152 seconds and 4 git commands to generate.