From: Michael Jeanson Date: Fri, 5 Feb 2021 17:08:40 +0000 (-0500) Subject: fix: sublevel version overflow in LINUX_VERSION_CODE X-Git-Tag: v2.13.0-rc1~52 X-Git-Url: http://git.lttng.org/?p=lttng-modules.git;a=commitdiff_plain;h=7b25fa17c155f7088af45e843a711250ab0e7cb7 fix: sublevel version overflow in LINUX_VERSION_CODE 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. Change-Id: I96ae9f22c0c1ba8c619643946a5311c767fbcf8c Signed-off-by: Michael Jeanson Signed-off-by: Mathieu Desnoyers --- diff --git a/Kbuild.common b/Kbuild.common index d0fcd664..f64cb09d 100644 --- a/Kbuild.common +++ b/Kbuild.common @@ -1,5 +1,9 @@ # SPDX-License-Identifier: (GPL-2.0-only OR LGPL-2.1-only) +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 diff --git a/include/lttng/kernel-version.h b/include/lttng/kernel-version.h index 773de295..38b47cc3 100644 --- a/include/lttng/kernel-version.h +++ b/include/lttng/kernel-version.h @@ -2,7 +2,7 @@ * * lttng/kernel-version.h * - * Contains helpers to check more complex kernel version conditions. + * Contains helpers to check kernel version conditions. * * Copyright (C) 2012 Mathieu Desnoyers */ @@ -16,6 +16,49 @@ #define LTTNG_KERNEL_VERSION(a, b, c) KERNEL_VERSION(a, b, c) #define LTTNG_LINUX_VERSION_CODE LINUX_VERSION_CODE +/* + * 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 + /* * This macro checks if the kernel version is between the two specified * versions (lower limit inclusive, upper limit exclusive).