fix: sublevel version overflow in LINUX_VERSION_CODE
authorMichael Jeanson <mjeanson@efficios.com>
Fri, 5 Feb 2021 17:08:40 +0000 (12:08 -0500)
committerMathieu Desnoyers <mathieu.desnoyers@efficios.com>
Wed, 10 Feb 2021 15:11:45 +0000 (10:11 -0500)
The 4.4.256 and 4.9.256 stable release overflow the 8bits allocated to
the sublevel in LINUX_VERSION_CODE which ends means they report
themselves as 4.5.0 and 4.10.0 respectively. The next releases in these
stables branches will have sublevel clamped at 255 and will thus report
themselves as 4.4.255 and 4.9.255 for all subsequent releases.

We need a way to way to properly detect these release since I doubt they
will stop breaking tracepoints declarations. As a workaround, extract
the version information from the Makefile in the kernel headers and use
this information to generate a version code when the sublevel is equal
or greater than 256.

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

Kbuild.common
lttng-kernel-version.h

index dde47a95a4b1cbfa3a973d1a9fb2ef3f5111db83..f58910270f37de95e28deb0022c9e911c6d9dd22 100644 (file)
@@ -1,5 +1,9 @@
 # SPDX-License-Identifier: (GPL-2.0 OR LGPL-2.1)
 
+ccflags-y += -DLTTNG_LINUX_MAJOR=$(VERSION)
+ccflags-y += -DLTTNG_LINUX_MINOR=$(PATCHLEVEL)
+ccflags-y += -DLTTNG_LINUX_PATCH=$(SUBLEVEL)
+
 # Work-around for distro-specific public modules ABI breakages.
 # Some distributions break the public module instrumentation ABI
 # compared to upstream stable kernels without providing other mean than
index 65281b2e8e2912f876143f155ac30e4ee8e7d692..34b98a272722d7da2c756e50f80ae9219c94ae7d 100644 (file)
 
 #include <linux/version.h>
 
+/*
+ * The following defines are extracted from the toplevel Linux Makefile and
+ * passed on the command line -with '-D'.
+ */
+
+#ifndef LTTNG_LINUX_MAJOR
+#define LTTNG_LINUX_MAJOR 0
+#endif
+
+#ifndef LTTNG_LINUX_MINOR
+#define LTTNG_LINUX_MINOR 0
+#endif
+
+#ifndef LTTNG_LINUX_PATCH
+#define LTTNG_LINUX_PATCH 0
+#endif
+
+/*
+ * Some stable releases have overflowed the 8bits allocated to the sublevel in
+ * the version code. To determine if the current kernel is affected, use the
+ * sublevel version from the Makefile. This is currently true for the 4.4.256
+ * and 4.9.256 stable releases.
+ *
+ * When the sublevel has overflowed, use the values from the Makefile instead
+ * of LINUX_VERSION_CODE from the kernel headers and allocate 16bits.
+ * Otherwise, keep using the version code from the headers to minimise the
+ * behavior change and avoid regressions.
+ */
+#if (LTTNG_LINUX_PATCH >= 256)
+
+#define LTTNG_KERNEL_VERSION(a, b, c) \
+       (((a) << 24) + ((b) << 16) + (c))
+
+#define LTTNG_LINUX_VERSION_CODE \
+       LTTNG_KERNEL_VERSION(LTTNG_LINUX_MAJOR, LTTNG_LINUX_MINOR, LTTNG_LINUX_PATCH)
+
+#else
+
 #define LTTNG_KERNEL_VERSION(a, b, c) KERNEL_VERSION(a, b, c)
 #define LTTNG_LINUX_VERSION_CODE LINUX_VERSION_CODE
 
+#endif
+
 #if (LTTNG_LINUX_VERSION_CODE >= LTTNG_KERNEL_VERSION(2,6,33))
 #include <generated/utsrelease.h>
 #else /* #if (LTTNG_LINUX_VERSION_CODE >= LTTNG_KERNEL_VERSION(2,6,33)) */
This page took 0.035881 seconds and 4 git commands to generate.