forked from Minki/linux
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
This commit is contained in:
commit
7c6baa304b
@ -1873,7 +1873,7 @@ feature:
|
||||
|
||||
status\input | 0 | 1 | else |
|
||||
--------------+------------+------------+------------+
|
||||
not allocated |(do nothing)| alloc+swap | EINVAL |
|
||||
not allocated |(do nothing)| alloc+swap |(do nothing)|
|
||||
--------------+------------+------------+------------+
|
||||
allocated | free | swap | clear |
|
||||
--------------+------------+------------+------------+
|
||||
|
@ -12,6 +12,7 @@
|
||||
#ifndef _ASM_S390_CPU_MF_H
|
||||
#define _ASM_S390_CPU_MF_H
|
||||
|
||||
#include <linux/errno.h>
|
||||
#include <asm/facility.h>
|
||||
|
||||
#define CPU_MF_INT_SF_IAE (1 << 31) /* invalid entry address */
|
||||
|
@ -414,24 +414,28 @@ config PROBE_EVENTS
|
||||
def_bool n
|
||||
|
||||
config DYNAMIC_FTRACE
|
||||
bool "enable/disable ftrace tracepoints dynamically"
|
||||
bool "enable/disable function tracing dynamically"
|
||||
depends on FUNCTION_TRACER
|
||||
depends on HAVE_DYNAMIC_FTRACE
|
||||
default y
|
||||
help
|
||||
This option will modify all the calls to ftrace dynamically
|
||||
(will patch them out of the binary image and replace them
|
||||
with a No-Op instruction) as they are called. A table is
|
||||
created to dynamically enable them again.
|
||||
This option will modify all the calls to function tracing
|
||||
dynamically (will patch them out of the binary image and
|
||||
replace them with a No-Op instruction) on boot up. During
|
||||
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
|
||||
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
|
||||
def_bool y
|
||||
depends on DYNAMIC_FTRACE
|
||||
|
@ -2400,6 +2400,27 @@ static void test_ftrace_alive(struct seq_file *m)
|
||||
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)
|
||||
{
|
||||
struct trace_iterator *iter = v;
|
||||
@ -2411,7 +2432,9 @@ static int s_show(struct seq_file *m, void *v)
|
||||
seq_puts(m, "#\n");
|
||||
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);
|
||||
else
|
||||
trace_default_header(m);
|
||||
@ -4144,8 +4167,6 @@ tracing_snapshot_write(struct file *filp, const char __user *ubuf, size_t cnt,
|
||||
default:
|
||||
if (current_trace->allocated_snapshot)
|
||||
tracing_reset_online_cpus(&max_tr);
|
||||
else
|
||||
ret = -EINVAL;
|
||||
break;
|
||||
}
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user