Commit 7c6baa30 authored by Linus Torvalds's avatar Linus Torvalds

Merge branch 'perf-urgent-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip

Pull perf fixes from Ingo Molnar:
 "Misc minor fixes mostly related to tracing"

* 'perf-urgent-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip:
  s390: Fix a header dependencies related build error
  tracing: update documentation of snapshot utility
  tracing: Do not return EINVAL in snapshot when not allocated
  tracing: Add help of snapshot feature when snapshot is empty
  ftrace: Update the kconfig for DYNAMIC_FTRACE
parents 0cb77508 cb16b91a
...@@ -1873,7 +1873,7 @@ feature: ...@@ -1873,7 +1873,7 @@ feature:
status\input | 0 | 1 | else | status\input | 0 | 1 | else |
--------------+------------+------------+------------+ --------------+------------+------------+------------+
not allocated |(do nothing)| alloc+swap | EINVAL | not allocated |(do nothing)| alloc+swap |(do nothing)|
--------------+------------+------------+------------+ --------------+------------+------------+------------+
allocated | free | swap | clear | allocated | free | swap | clear |
--------------+------------+------------+------------+ --------------+------------+------------+------------+
......
...@@ -12,6 +12,7 @@ ...@@ -12,6 +12,7 @@
#ifndef _ASM_S390_CPU_MF_H #ifndef _ASM_S390_CPU_MF_H
#define _ASM_S390_CPU_MF_H #define _ASM_S390_CPU_MF_H
#include <linux/errno.h>
#include <asm/facility.h> #include <asm/facility.h>
#define CPU_MF_INT_SF_IAE (1 << 31) /* invalid entry address */ #define CPU_MF_INT_SF_IAE (1 << 31) /* invalid entry address */
......
...@@ -414,24 +414,28 @@ config PROBE_EVENTS ...@@ -414,24 +414,28 @@ config PROBE_EVENTS
def_bool n def_bool n
config DYNAMIC_FTRACE config DYNAMIC_FTRACE
bool "enable/disable ftrace tracepoints dynamically" bool "enable/disable function tracing dynamically"
depends on FUNCTION_TRACER depends on FUNCTION_TRACER
depends on HAVE_DYNAMIC_FTRACE depends on HAVE_DYNAMIC_FTRACE
default y default y
help help
This option will modify all the calls to ftrace dynamically This option will modify all the calls to function tracing
(will patch them out of the binary image and replace them dynamically (will patch them out of the binary image and
with a No-Op instruction) as they are called. A table is replace them with a No-Op instruction) on boot up. During
created to dynamically enable them again. compile time, a table is made of all the locations that ftrace
can function trace, and this table is linked into the kernel
image. When this is enabled, functions can be individually
enabled, and the functions not enabled will not affect
performance of the system.
See the files in /sys/kernel/debug/tracing:
available_filter_functions
set_ftrace_filter
set_ftrace_notrace
This way a CONFIG_FUNCTION_TRACER kernel is slightly larger, but This way a CONFIG_FUNCTION_TRACER kernel is slightly larger, but
otherwise has native performance as long as no tracing is active. otherwise has native performance as long as no tracing is active.
The changes to the code are done by a kernel thread that
wakes up once a second and checks to see if any ftrace calls
were made. If so, it runs stop_machine (stops all CPUS)
and modifies the code to jump over the call to ftrace.
config DYNAMIC_FTRACE_WITH_REGS config DYNAMIC_FTRACE_WITH_REGS
def_bool y def_bool y
depends on DYNAMIC_FTRACE depends on DYNAMIC_FTRACE
......
...@@ -2400,6 +2400,27 @@ static void test_ftrace_alive(struct seq_file *m) ...@@ -2400,6 +2400,27 @@ static void test_ftrace_alive(struct seq_file *m)
seq_printf(m, "# MAY BE MISSING FUNCTION EVENTS\n"); seq_printf(m, "# MAY BE MISSING FUNCTION EVENTS\n");
} }
#ifdef CONFIG_TRACER_MAX_TRACE
static void print_snapshot_help(struct seq_file *m, struct trace_iterator *iter)
{
if (iter->trace->allocated_snapshot)
seq_printf(m, "#\n# * Snapshot is allocated *\n#\n");
else
seq_printf(m, "#\n# * Snapshot is freed *\n#\n");
seq_printf(m, "# Snapshot commands:\n");
seq_printf(m, "# echo 0 > snapshot : Clears and frees snapshot buffer\n");
seq_printf(m, "# echo 1 > snapshot : Allocates snapshot buffer, if not already allocated.\n");
seq_printf(m, "# Takes a snapshot of the main buffer.\n");
seq_printf(m, "# echo 2 > snapshot : Clears snapshot buffer (but does not allocate)\n");
seq_printf(m, "# (Doesn't have to be '2' works with any number that\n");
seq_printf(m, "# is not a '0' or '1')\n");
}
#else
/* Should never be called */
static inline void print_snapshot_help(struct seq_file *m, struct trace_iterator *iter) { }
#endif
static int s_show(struct seq_file *m, void *v) static int s_show(struct seq_file *m, void *v)
{ {
struct trace_iterator *iter = v; struct trace_iterator *iter = v;
...@@ -2411,7 +2432,9 @@ static int s_show(struct seq_file *m, void *v) ...@@ -2411,7 +2432,9 @@ static int s_show(struct seq_file *m, void *v)
seq_puts(m, "#\n"); seq_puts(m, "#\n");
test_ftrace_alive(m); test_ftrace_alive(m);
} }
if (iter->trace && iter->trace->print_header) if (iter->snapshot && trace_empty(iter))
print_snapshot_help(m, iter);
else if (iter->trace && iter->trace->print_header)
iter->trace->print_header(m); iter->trace->print_header(m);
else else
trace_default_header(m); trace_default_header(m);
...@@ -4144,8 +4167,6 @@ tracing_snapshot_write(struct file *filp, const char __user *ubuf, size_t cnt, ...@@ -4144,8 +4167,6 @@ tracing_snapshot_write(struct file *filp, const char __user *ubuf, size_t cnt,
default: default:
if (current_trace->allocated_snapshot) if (current_trace->allocated_snapshot)
tracing_reset_online_cpus(&max_tr); tracing_reset_online_cpus(&max_tr);
else
ret = -EINVAL;
break; break;
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment