Merge tag 'trace-v4.19-1' of git://git.kernel.org/pub/scm/linux/kernel/git/rostedt...
authorLinus Torvalds <torvalds@linux-foundation.org>
Thu, 23 Aug 2018 20:07:00 +0000 (13:07 -0700)
committerLinus Torvalds <torvalds@linux-foundation.org>
Thu, 23 Aug 2018 20:07:00 +0000 (13:07 -0700)
Pull tracing fixes from Steven Rostedt:
 "Masami found an off by one bug in the code that keeps "notrace"
  functions from being traced by kprobes. During my testing, I found
  that there's places that we may want to add kprobes to notrace, thus
  we may end up changing this code before 4.19 is released.

  The history behind this change is that we found that adding kprobes to
  various notrace functions caused the kernel to crashed. We took the
  safe route and decided not to allow kprobes to trace any notrace
  function.

  But because notrace is added to functions that just cause weird side
  effects to the function tracer, but are still safe, preventing kprobes
  for all notrace functios may be too much of a big hammer.

  One such place is __schedule() is marked notrace, to keep function
  tracer from doing strange recursive loops when it gets traced with
  NEED_RESCHED set. With this change, one can not add kprobes to the
  scheduler.

  Masami also added code to use gcov on ftrace"

* tag 'trace-v4.19-1' of git://git.kernel.org/pub/scm/linux/kernel/git/rostedt/linux-trace:
  tracing/kprobes: Fix to check notrace function with correct range
  tracing: Allow gcov profiling on only ftrace subsystem

kernel/trace/Kconfig
kernel/trace/Makefile
kernel/trace/trace_kprobe.c

index c042a455afc6a109a45ae5b58e360d0dec67bcc2..5e3de28c7677396aaa4360dcf2f51fb9b365b626 100644 (file)
@@ -774,6 +774,18 @@ config TRACING_EVENTS_GPIO
        help
          Enable tracing events for gpio subsystem
 
+config GCOV_PROFILE_FTRACE
+       bool "Enable GCOV profiling on ftrace subsystem"
+       depends on GCOV_KERNEL
+       help
+         Enable GCOV profiling on ftrace subsystem for checking
+         which functions/lines are tested.
+
+         If unsure, say N.
+
+         Note that on a kernel compiled with this config, ftrace will
+         run significantly slower.
+
 endif # FTRACE
 
 endif # TRACING_SUPPORT
index 98d53b39a8ee333e130e4d53cb5a3992191ea6a7..f81dadbc7c4ac3ef35c031d1164edf1b3b82d034 100644 (file)
@@ -23,6 +23,11 @@ ifdef CONFIG_TRACING_BRANCHES
 KBUILD_CFLAGS += -DDISABLE_BRANCH_PROFILING
 endif
 
+# for GCOV coverage profiling
+ifdef CONFIG_GCOV_PROFILE_FTRACE
+GCOV_PROFILE := y
+endif
+
 CFLAGS_trace_benchmark.o := -I$(src)
 CFLAGS_trace_events_filter.o := -I$(src)
 
index 2bfb2bbeb3d22cb6f2aa475902599eacb8a725a8..c30032367aab4a5c83a013d615830cda97a82f8a 100644 (file)
@@ -513,7 +513,14 @@ static bool within_notrace_func(struct trace_kprobe *tk)
        if (!addr || !kallsyms_lookup_size_offset(addr, &size, &offset))
                return false;
 
-       return !ftrace_location_range(addr - offset, addr - offset + size);
+       /* Get the entry address of the target function */
+       addr -= offset;
+
+       /*
+        * Since ftrace_location_range() does inclusive range check, we need
+        * to subtract 1 byte from the end address.
+        */
+       return !ftrace_location_range(addr, addr + size - 1);
 }
 #else
 #define within_notrace_func(tk)        (false)