Commit f26db964 authored by Linus Torvalds's avatar Linus Torvalds

Merge tag 'trace-v4.11-rc1' of git://git.kernel.org/pub/scm/linux/kernel/git/rostedt/linux-trace

Pull tracing fixes from Steven Rostedt:
 "There was some breakage with the changes for jump labels in the 4.11
  merge window:

   - powerpc broke as jump labels uses the two LSB bits as flags in
     initialization.

     A check was added to make sure that all jump label entries were 4
     bytes aligned, but powerpc didn't work that way for modules. Adding
     an alignment in the module linker script appeared to be the best
     solution.

   - Jump labels also added an anonymous union to access those LSB bits
     as a normal long. But because this structure had static
     initialization, it broke older compilers that could not statically
     initialize anonymous unions without brackets.

   - The command line parameter for setting function graph filter broke
     the "EMPTY_HASH" descriptor by modifying it instead of creating a
     new hash to hold the entries.

   - The command line parameter ftrace_graph_max_depth was added to
     allow its setting at boot time. It uses existing code and only the
     command line hook was added.

     This is not really a fix, but as it uses existing code without
     affecting anything else, I added it to this release. It was ready
     before the merge window closed, but I wanted to let it sit in
     linux-next for a couple of days first"

* tag 'trace-v4.11-rc1' of git://git.kernel.org/pub/scm/linux/kernel/git/rostedt/linux-trace:
  ftrace/graph: Add ftrace_graph_max_depth kernel parameter
  tracing: Add #undef to fix compile error
  jump_label: Add comment about initialization order for anonymous unions
  jump_label: Fix anonymous union initialization
  module: set __jump_table alignment to 8
  ftrace/graph: Do not modify the EMPTY_HASH for the function_graph filter
  tracing: Fix code comment for ftrace_ops_get_func()
parents c1ae3cfa 65a50c65
...@@ -1183,6 +1183,12 @@ ...@@ -1183,6 +1183,12 @@
functions that can be changed at run time by the functions that can be changed at run time by the
set_graph_notrace file in the debugfs tracing directory. set_graph_notrace file in the debugfs tracing directory.
ftrace_graph_max_depth=<uint>
[FTRACE] Used with the function graph tracer. This is
the max depth it will trace into a function. This value
can be changed at run time by the max_graph_depth file
in the tracefs tracing directory. default: 0 (no limit)
gamecon.map[2|3]= gamecon.map[2|3]=
[HW,JOY] Multisystem joystick and NES/SNES/PSX pad [HW,JOY] Multisystem joystick and NES/SNES/PSX pad
support via parallel port (up to 5 devices per port) support via parallel port (up to 5 devices per port)
......
...@@ -90,6 +90,13 @@ extern bool static_key_initialized; ...@@ -90,6 +90,13 @@ extern bool static_key_initialized;
struct static_key { struct static_key {
atomic_t enabled; atomic_t enabled;
/* /*
* Note:
* To make anonymous unions work with old compilers, the static
* initialization of them requires brackets. This creates a dependency
* on the order of the struct with the initializers. If any fields
* are added, STATIC_KEY_INIT_TRUE and STATIC_KEY_INIT_FALSE may need
* to be modified.
*
* bit 0 => 1 if key is initially true * bit 0 => 1 if key is initially true
* 0 if initially false * 0 if initially false
* bit 1 => 1 if points to struct static_key_mod * bit 1 => 1 if points to struct static_key_mod
...@@ -166,10 +173,10 @@ extern void static_key_disable(struct static_key *key); ...@@ -166,10 +173,10 @@ extern void static_key_disable(struct static_key *key);
*/ */
#define STATIC_KEY_INIT_TRUE \ #define STATIC_KEY_INIT_TRUE \
{ .enabled = { 1 }, \ { .enabled = { 1 }, \
.entries = (void *)JUMP_TYPE_TRUE } { .entries = (void *)JUMP_TYPE_TRUE } }
#define STATIC_KEY_INIT_FALSE \ #define STATIC_KEY_INIT_FALSE \
{ .enabled = { 0 }, \ { .enabled = { 0 }, \
.entries = (void *)JUMP_TYPE_FALSE } { .entries = (void *)JUMP_TYPE_FALSE } }
#else /* !HAVE_JUMP_LABEL */ #else /* !HAVE_JUMP_LABEL */
......
#undef TRACE_SYSTEM #undef TRACE_SYSTEM
#define TRACE_SYSTEM raw_syscalls #define TRACE_SYSTEM raw_syscalls
#undef TRACE_INCLUDE_FILE
#define TRACE_INCLUDE_FILE syscalls #define TRACE_INCLUDE_FILE syscalls
#if !defined(_TRACE_EVENTS_SYSCALLS_H) || defined(TRACE_HEADER_MULTI_READ) #if !defined(_TRACE_EVENTS_SYSCALLS_H) || defined(TRACE_HEADER_MULTI_READ)
......
...@@ -4416,16 +4416,24 @@ static int __init set_graph_notrace_function(char *str) ...@@ -4416,16 +4416,24 @@ static int __init set_graph_notrace_function(char *str)
} }
__setup("ftrace_graph_notrace=", set_graph_notrace_function); __setup("ftrace_graph_notrace=", set_graph_notrace_function);
static int __init set_graph_max_depth_function(char *str)
{
if (!str)
return 0;
fgraph_max_depth = simple_strtoul(str, NULL, 0);
return 1;
}
__setup("ftrace_graph_max_depth=", set_graph_max_depth_function);
static void __init set_ftrace_early_graph(char *buf, int enable) static void __init set_ftrace_early_graph(char *buf, int enable)
{ {
int ret; int ret;
char *func; char *func;
struct ftrace_hash *hash; struct ftrace_hash *hash;
if (enable) hash = alloc_ftrace_hash(FTRACE_HASH_DEFAULT_BITS);
hash = ftrace_graph_hash; if (WARN_ON(!hash))
else return;
hash = ftrace_graph_notrace_hash;
while (buf) { while (buf) {
func = strsep(&buf, ","); func = strsep(&buf, ",");
...@@ -4435,6 +4443,11 @@ static void __init set_ftrace_early_graph(char *buf, int enable) ...@@ -4435,6 +4443,11 @@ static void __init set_ftrace_early_graph(char *buf, int enable)
printk(KERN_DEBUG "ftrace: function %s not " printk(KERN_DEBUG "ftrace: function %s not "
"traceable\n", func); "traceable\n", func);
} }
if (enable)
ftrace_graph_hash = hash;
else
ftrace_graph_notrace_hash = hash;
} }
#endif /* CONFIG_FUNCTION_GRAPH_TRACER */ #endif /* CONFIG_FUNCTION_GRAPH_TRACER */
...@@ -5488,7 +5501,7 @@ static void ftrace_ops_assist_func(unsigned long ip, unsigned long parent_ip, ...@@ -5488,7 +5501,7 @@ static void ftrace_ops_assist_func(unsigned long ip, unsigned long parent_ip,
* Normally the mcount trampoline will call the ops->func, but there * Normally the mcount trampoline will call the ops->func, but there
* are times that it should not. For example, if the ops does not * are times that it should not. For example, if the ops does not
* have its own recursion protection, then it should call the * have its own recursion protection, then it should call the
* ftrace_ops_recurs_func() instead. * ftrace_ops_assist_func() instead.
* *
* Returns the function that the trampoline should call for @ops. * Returns the function that the trampoline should call for @ops.
*/ */
......
...@@ -22,4 +22,6 @@ SECTIONS { ...@@ -22,4 +22,6 @@ SECTIONS {
. = ALIGN(8); . = ALIGN(8);
.init_array 0 : { *(SORT(.init_array.*)) *(.init_array) } .init_array 0 : { *(SORT(.init_array.*)) *(.init_array) }
__jump_table 0 : ALIGN(8) { KEEP(*(__jump_table)) }
} }
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