Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

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

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
Loading
Loading
Loading
Loading
+1 −1
Original line number Original line Diff line number Diff line
@@ -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    |
	--------------+------------+------------+------------+
	--------------+------------+------------+------------+
+1 −0
Original line number Original line Diff line number Diff line
@@ -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 */
+14 −10
Original line number Original line Diff line number Diff line
@@ -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
+24 −3
Original line number Original line Diff line number Diff line
@@ -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)
			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,
	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;
	}
	}