fix: use timespec64 on kernels that have it
authorMichael Jeanson <mjeanson@efficios.com>
Mon, 24 Feb 2020 19:50:20 +0000 (14:50 -0500)
committerMathieu Desnoyers <mathieu.desnoyers@efficios.com>
Mon, 24 Feb 2020 21:50:25 +0000 (16:50 -0500)
This fixes v5.6 which has hidden 'struct timespec' from kernel code and
makes 32bit archs y2038 compliant on v3.17 and newer.

Signed-off-by: Michael Jeanson <mjeanson@efficios.com>
Signed-off-by: Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
Change-Id: I1daedc4a93cbbebb8f5a1d99c4619cb27f6a9e07

lttng-events.c
wrapper/time.h [new file with mode: 0644]

index 25c616ee82a8aecdc017695036c57445635d0e63..1308d949f73460e9b4fb13291828d67a7015a985 100644 (file)
@@ -43,6 +43,7 @@
 #include <wrapper/vzalloc.h>
 #include <wrapper/ringbuffer/backend.h>
 #include <wrapper/ringbuffer/frontend.h>
+#include <wrapper/time.h>
 
 #define METADATA_CACHE_DEFAULT_SIZE 4096
 
@@ -2448,6 +2449,9 @@ int _lttng_event_header_declare(struct lttng_session *session)
  * in future versions.
  * This function may return a negative offset. It may happen if the
  * system sets the REALTIME clock to 0 after boot.
+ *
+ * Use 64bit timespec on kernels that have it, this makes 32bit arch
+ * y2038 compliant.
  */
 static
 int64_t measure_clock_offset(void)
@@ -2455,13 +2459,21 @@ int64_t measure_clock_offset(void)
        uint64_t monotonic_avg, monotonic[2], realtime;
        uint64_t tcf = trace_clock_freq();
        int64_t offset;
-       struct timespec rts = { 0, 0 };
        unsigned long flags;
+#ifdef LTTNG_KERNEL_HAS_TIMESPEC64
+       struct timespec64 rts = { 0, 0 };
+#else
+       struct timespec rts = { 0, 0 };
+#endif
 
        /* Disable interrupts to increase correlation precision. */
        local_irq_save(flags);
        monotonic[0] = trace_clock_read64();
+#ifdef LTTNG_KERNEL_HAS_TIMESPEC64
+       ktime_get_real_ts64(&rts);
+#else
        getnstimeofday(&rts);
+#endif
        monotonic[1] = trace_clock_read64();
        local_irq_restore(flags);
 
diff --git a/wrapper/time.h b/wrapper/time.h
new file mode 100644 (file)
index 0000000..362f314
--- /dev/null
@@ -0,0 +1,22 @@
+/* SPDX-License-Identifier: (GPL-2.0 or LGPL-2.1)
+ *
+ * wrapper/time.h
+ *
+ * Copyright (C) 2020 Michael Jeanson <mjeanson@efficios.com>
+ * Copyright (C) 2020 Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
+ */
+
+#ifndef _LTTNG_WRAPPER_TIME_H
+#define _LTTNG_WRAPPER_TIME_H
+
+#include <linux/version.h>
+
+/*
+ * Use 64bit timespec on kernels that have it, this makes 32bit arch
+ * y2038 compliant.
+ */
+#if (LINUX_VERSION_CODE >= KERNEL_VERSION(3,17,0))
+# define LTTNG_KERNEL_HAS_TIMESPEC64
+#endif
+
+#endif /* _LTTNG_WRAPPER_TIME_H */
This page took 0.027869 seconds and 4 git commands to generate.