[lttng-modules,1/2] Fix: handle missing ftrace header on v4.12
Commit Message
Properly handle the case where we build against the distro headers of a
kernel >= 4.12 and ftrace is enabled but the private header is
unavailable.
Signed-off-by: Michael Jeanson <mjeanson at efficios.com>
---
Makefile.ABI.workarounds | 21 +++++++++++++++++++++
lttng-events.h | 2 +-
probes/Kbuild | 19 ++++---------------
3 files changed, 26 insertions(+), 16 deletions(-)
Comments
Merged into master, 2.10, 2.9, 2.8, thanks!
Mathieu
----- On Jun 23, 2017, at 2:29 PM, Michael Jeanson mjeanson at efficios.com wrote:
> Properly handle the case where we build against the distro headers of a
> kernel >= 4.12 and ftrace is enabled but the private header is
> unavailable.
>
> Signed-off-by: Michael Jeanson <mjeanson at efficios.com>
> ---
> Makefile.ABI.workarounds | 21 +++++++++++++++++++++
> lttng-events.h | 2 +-
> probes/Kbuild | 19 ++++---------------
> 3 files changed, 26 insertions(+), 16 deletions(-)
>
> diff --git a/Makefile.ABI.workarounds b/Makefile.ABI.workarounds
> index c3717f8..2e6c4aa 100644
> --- a/Makefile.ABI.workarounds
> +++ b/Makefile.ABI.workarounds
> @@ -27,3 +27,24 @@ RT_PATCH_VERSION:=$(shell
> $(TOP_LTTNG_MODULES_DIR)/rt-patch-version.sh $(CURDIR)
> ifneq ($(RT_PATCH_VERSION), 0)
> ccflags-y += -DRT_PATCH_VERSION=$(RT_PATCH_VERSION)
> endif
> +
> +# Starting with kernel 4.12, the ftrace header was moved to private headers
> +# and as such is not available when building against distro headers instead
> +# of the full kernel sources. In the situation, define
> LTTNG_FTRACE_MISSING_HEADER
> +# so we can enable the compat code even if CONFIG_DYNAMIC_FTRACE is enabled.
> +ifneq ($(CONFIG_DYNAMIC_FTRACE),)
> + ftrace_dep = $(srctree)/kernel/trace/trace.h
> + ftrace_dep_check = $(wildcard $(ftrace_dep))
> + have_ftrace_header = $(shell \
> + if [ $(VERSION) -ge 5 -o \( $(VERSION) -eq 4 -a $(PATCHLEVEL) -ge 12 \) ] ;
> then \
> + if [ -z "$(ftrace_dep_check)" ] ; then \
> + echo "no" ; \
> + exit ; \
> + fi; \
> + fi; \
> + echo "yes" ; \
> + )
> + ifeq ($(have_ftrace_header), no)
> + ccflags-y += -DLTTNG_FTRACE_MISSING_HEADER
> + endif
> +endif
> diff --git a/lttng-events.h b/lttng-events.h
> index f55bf66..17dd8d3 100644
> --- a/lttng-events.h
> +++ b/lttng-events.h
> @@ -810,7 +810,7 @@ int lttng_kretprobes_event_enable_state(struct lttng_event
> *event,
> }
> #endif
>
> -#ifdef CONFIG_DYNAMIC_FTRACE
> +#if defined(CONFIG_DYNAMIC_FTRACE) && !defined(LTTNG_FTRACE_MISSING_HEADER)
> int lttng_ftrace_register(const char *name,
> const char *symbol_name,
> struct lttng_event *event);
> diff --git a/probes/Kbuild b/probes/Kbuild
> index 78bf3fb..cc1c065 100644
> --- a/probes/Kbuild
> +++ b/probes/Kbuild
> @@ -259,22 +259,11 @@ ifneq ($(CONFIG_KRETPROBES),)
> endif # CONFIG_KRETPROBES
>
> ifneq ($(CONFIG_DYNAMIC_FTRACE),)
> - ftrace_dep = $(srctree)/kernel/trace/trace.h
> - ftrace_dep_check = $(wildcard $(ftrace_dep))
> - ftrace = $(shell \
> - if [ $(VERSION) -ge 5 -o \( $(VERSION) -eq 4 -a $(PATCHLEVEL) -ge 12 \) ] ;
> then \
> - if [ -z "$(ftrace_dep_check)" ] ; then \
> - echo "warn" ; \
> - exit ; \
> - fi; \
> - fi; \
> - echo "lttng-ftrace.o" ; \
> - )
> - ifeq ($(ftrace),warn)
> + ifeq ($(have_ftrace_header),yes)
> + obj-$(CONFIG_LTTNG) += lttng-ftrace.o
> + else
> $(warning Files $(ftrace_dep) not found. Probe "ftrace" is disabled. Use full
> kernel source tree to enable it.)
> - ftrace =
> - endif # $(ftrace),warn
> - obj-$(CONFIG_LTTNG) += $(ftrace)
> + endif
> endif # CONFIG_DYNAMIC_FTRACE
>
> # vim:syntax=make
> --
> 2.7.4
@@ -27,3 +27,24 @@ RT_PATCH_VERSION:=$(shell $(TOP_LTTNG_MODULES_DIR)/rt-patch-version.sh $(CURDIR)
ifneq ($(RT_PATCH_VERSION), 0)
ccflags-y += -DRT_PATCH_VERSION=$(RT_PATCH_VERSION)
endif
+
+# Starting with kernel 4.12, the ftrace header was moved to private headers
+# and as such is not available when building against distro headers instead
+# of the full kernel sources. In the situation, define LTTNG_FTRACE_MISSING_HEADER
+# so we can enable the compat code even if CONFIG_DYNAMIC_FTRACE is enabled.
+ifneq ($(CONFIG_DYNAMIC_FTRACE),)
+ ftrace_dep = $(srctree)/kernel/trace/trace.h
+ ftrace_dep_check = $(wildcard $(ftrace_dep))
+ have_ftrace_header = $(shell \
+ if [ $(VERSION) -ge 5 -o \( $(VERSION) -eq 4 -a $(PATCHLEVEL) -ge 12 \) ] ; then \
+ if [ -z "$(ftrace_dep_check)" ] ; then \
+ echo "no" ; \
+ exit ; \
+ fi; \
+ fi; \
+ echo "yes" ; \
+ )
+ ifeq ($(have_ftrace_header), no)
+ ccflags-y += -DLTTNG_FTRACE_MISSING_HEADER
+ endif
+endif
@@ -810,7 +810,7 @@ int lttng_kretprobes_event_enable_state(struct lttng_event *event,
}
#endif
-#ifdef CONFIG_DYNAMIC_FTRACE
+#if defined(CONFIG_DYNAMIC_FTRACE) && !defined(LTTNG_FTRACE_MISSING_HEADER)
int lttng_ftrace_register(const char *name,
const char *symbol_name,
struct lttng_event *event);
@@ -259,22 +259,11 @@ ifneq ($(CONFIG_KRETPROBES),)
endif # CONFIG_KRETPROBES
ifneq ($(CONFIG_DYNAMIC_FTRACE),)
- ftrace_dep = $(srctree)/kernel/trace/trace.h
- ftrace_dep_check = $(wildcard $(ftrace_dep))
- ftrace = $(shell \
- if [ $(VERSION) -ge 5 -o \( $(VERSION) -eq 4 -a $(PATCHLEVEL) -ge 12 \) ] ; then \
- if [ -z "$(ftrace_dep_check)" ] ; then \
- echo "warn" ; \
- exit ; \
- fi; \
- fi; \
- echo "lttng-ftrace.o" ; \
- )
- ifeq ($(ftrace),warn)
+ ifeq ($(have_ftrace_header),yes)
+ obj-$(CONFIG_LTTNG) += lttng-ftrace.o
+ else
$(warning Files $(ftrace_dep) not found. Probe "ftrace" is disabled. Use full kernel source tree to enable it.)
- ftrace =
- endif # $(ftrace),warn
- obj-$(CONFIG_LTTNG) += $(ftrace)
+ endif
endif # CONFIG_DYNAMIC_FTRACE
# vim:syntax=make