Fix: portability: no arith on void pointer
[lttng-modules.git] / lttng-events.c
index c1dc1acbc5124fde9369b6045adb0f3c12ffa01f..9c8cde8f976adbf38fbccfb360675dc8a73bca59 100644 (file)
 #include <linux/seq_file.h>
 #include <linux/file.h>
 #include <linux/anon_inodes.h>
-#include "wrapper/file.h"
+#include <wrapper/file.h>
 #include <linux/jhash.h>
 #include <linux/uaccess.h>
 #include <linux/vmalloc.h>
 
-#include "wrapper/uuid.h"
-#include "wrapper/vmalloc.h"   /* for wrapper_vmalloc_sync_all() */
-#include "wrapper/random.h"
-#include "wrapper/tracepoint.h"
-#include "wrapper/list.h"
-#include "lttng-kernel-version.h"
-#include "lttng-events.h"
-#include "lttng-tracer.h"
-#include "lttng-abi-old.h"
-#include "wrapper/vzalloc.h"
+#include <wrapper/uuid.h>
+#include <wrapper/vmalloc.h>   /* for wrapper_vmalloc_sync_all() */
+#include <wrapper/random.h>
+#include <wrapper/tracepoint.h>
+#include <wrapper/list.h>
+#include <lttng-kernel-version.h>
+#include <lttng-events.h>
+#include <lttng-tracer.h>
+#include <lttng-abi-old.h>
+#include <lttng-endian.h>
+#include <wrapper/vzalloc.h>
 
 #define METADATA_CACHE_DEFAULT_SIZE 4096
 
@@ -1085,17 +1086,22 @@ int lttng_session_list_tracker_pids(struct lttng_session *session)
                ret = PTR_ERR(tracker_pids_list_file);
                goto file_error;
        }
+       if (atomic_long_add_unless(&session->file->f_count,
+               1, INT_MAX) == INT_MAX) {
+               goto refcount_error;
+       }
        ret = lttng_tracker_pids_list_fops.open(NULL, tracker_pids_list_file);
        if (ret < 0)
                goto open_error;
        m = tracker_pids_list_file->private_data;
        m->private = session;
        fd_install(file_fd, tracker_pids_list_file);
-       atomic_long_inc(&session->file->f_count);
 
        return file_fd;
 
 open_error:
+       atomic_long_dec(&session->file->f_count);
+refcount_error:
        fput(tracker_pids_list_file);
 file_error:
        put_unused_fd(file_fd);
@@ -1677,7 +1683,7 @@ int _lttng_field_statedump(struct lttng_session *session,
                                        ? "UTF8"
                                        : "ASCII",
                        field->type.u.basic.integer.base,
-#ifdef __BIG_ENDIAN
+#if __BYTE_ORDER == __BIG_ENDIAN
                        field->type.u.basic.integer.reverse_byte_order ? " byte_order = le;" : "",
 #else
                        field->type.u.basic.integer.reverse_byte_order ? " byte_order = be;" : "",
@@ -1695,6 +1701,14 @@ int _lttng_field_statedump(struct lttng_session *session,
                const struct lttng_basic_type *elem_type;
 
                elem_type = &field->type.u.array.elem_type;
+               if (field->type.u.array.elem_alignment) {
+                       ret = lttng_metadata_printf(session,
+                       "               struct { } align(%u) _%s_padding;\n",
+                                       field->type.u.array.elem_alignment * CHAR_BIT,
+                                       field->name);
+                       if (ret)
+                               return ret;
+               }
                ret = lttng_metadata_printf(session,
                        "               integer { size = %u; align = %u; signed = %u; encoding = %s; base = %u;%s } _%s[%u];\n",
                        elem_type->u.basic.integer.size,
@@ -1706,7 +1720,7 @@ int _lttng_field_statedump(struct lttng_session *session,
                                        ? "UTF8"
                                        : "ASCII",
                        elem_type->u.basic.integer.base,
-#ifdef __BIG_ENDIAN
+#if __BYTE_ORDER == __BIG_ENDIAN
                        elem_type->u.basic.integer.reverse_byte_order ? " byte_order = le;" : "",
 #else
                        elem_type->u.basic.integer.reverse_byte_order ? " byte_order = be;" : "",
@@ -1732,7 +1746,7 @@ int _lttng_field_statedump(struct lttng_session *session,
                                        ? "UTF8"
                                        : "ASCII"),
                        length_type->u.basic.integer.base,
-#ifdef __BIG_ENDIAN
+#if __BYTE_ORDER == __BIG_ENDIAN
                        length_type->u.basic.integer.reverse_byte_order ? " byte_order = le;" : "",
 #else
                        length_type->u.basic.integer.reverse_byte_order ? " byte_order = be;" : "",
@@ -1741,6 +1755,14 @@ int _lttng_field_statedump(struct lttng_session *session,
                if (ret)
                        return ret;
 
+               if (field->type.u.sequence.elem_alignment) {
+                       ret = lttng_metadata_printf(session,
+                       "               struct { } align(%u) _%s_padding;\n",
+                                       field->type.u.sequence.elem_alignment * CHAR_BIT,
+                                       field->name);
+                       if (ret)
+                               return ret;
+               }
                ret = lttng_metadata_printf(session,
                        "               integer { size = %u; align = %u; signed = %u; encoding = %s; base = %u;%s } _%s[ __%s_length ];\n",
                        elem_type->u.basic.integer.size,
@@ -1752,7 +1774,7 @@ int _lttng_field_statedump(struct lttng_session *session,
                                        ? "UTF8"
                                        : "ASCII"),
                        elem_type->u.basic.integer.base,
-#ifdef __BIG_ENDIAN
+#if __BYTE_ORDER == __BIG_ENDIAN
                        elem_type->u.basic.integer.reverse_byte_order ? " byte_order = le;" : "",
 #else
                        elem_type->u.basic.integer.reverse_byte_order ? " byte_order = be;" : "",
@@ -2002,12 +2024,15 @@ int _lttng_event_header_declare(struct lttng_session *session)
  * taken at start of trace.
  * Yes, this is only an approximation. Yes, we can (and will) do better
  * in future versions.
+ * This function may return a negative offset. It may happen if the
+ * system sets the REALTIME clock to 0 after boot.
  */
 static
-uint64_t measure_clock_offset(void)
+int64_t measure_clock_offset(void)
 {
-       uint64_t offset, monotonic[2], realtime;
+       uint64_t monotonic_avg, monotonic[2], realtime;
        uint64_t tcf = trace_clock_freq();
+       int64_t offset;
        struct timespec rts = { 0, 0 };
        unsigned long flags;
 
@@ -2018,7 +2043,7 @@ uint64_t measure_clock_offset(void)
        monotonic[1] = trace_clock_read64();
        local_irq_restore(flags);
 
-       offset = (monotonic[0] + monotonic[1]) >> 1;
+       monotonic_avg = (monotonic[0] + monotonic[1]) >> 1;
        realtime = (uint64_t) rts.tv_sec * tcf;
        if (tcf == NSEC_PER_SEC) {
                realtime += rts.tv_nsec;
@@ -2028,7 +2053,7 @@ uint64_t measure_clock_offset(void)
                do_div(n, NSEC_PER_SEC);
                realtime += n;
        }
-       offset = realtime - offset;
+       offset = (int64_t) realtime - monotonic_avg;
        return offset;
 }
 
@@ -2087,7 +2112,7 @@ int _lttng_session_metadata_statedump(struct lttng_session *session)
                CTF_SPEC_MAJOR,
                CTF_SPEC_MINOR,
                uuid_s,
-#ifdef __BIG_ENDIAN
+#if __BYTE_ORDER == __BIG_ENDIAN
                "be"
 #else
                "le"
@@ -2140,11 +2165,11 @@ int _lttng_session_metadata_statedump(struct lttng_session *session)
                "       description = \"%s\";\n"
                "       freq = %llu; /* Frequency, in Hz */\n"
                "       /* clock value offset from Epoch is: offset * (1/freq) */\n"
-               "       offset = %llu;\n"
+               "       offset = %lld;\n"
                "};\n\n",
                trace_clock_description(),
                (unsigned long long) trace_clock_freq(),
-               (unsigned long long) measure_clock_offset()
+               (long long) measure_clock_offset()
                );
        if (ret)
                goto end;
@@ -2245,6 +2270,9 @@ static int __init lttng_events_init(void)
        if (ret)
                return ret;
        ret = wrapper_get_pfnblock_flags_mask_init();
+       if (ret)
+               return ret;
+       ret = wrapper_get_pageblock_flags_mask_init();
        if (ret)
                return ret;
        ret = lttng_context_init();
This page took 0.026004 seconds and 4 git commands to generate.