History

ftrace/graph: Do not modify the EMPTY_HASH for the function_graph filter

On boot up, if the kernel command line sets a graph funtion with the kernel command line options "ftrace_graph_filter" or "ftrace_graph_notrace" then it updates the corresponding function graph hash, ftrace_graph_hash or ftrace_graph_notrace_hash respectively. Unfortunately, at boot up, these variables are pointers to the "EMPTY_HASH" which is a constant used as a placeholder when a hash has no entities. The problem was that the comand line version to set the hashes updated the actual EMPTY_HASH instead of creating a new hash for the function graph. This broke the EMPTY_HASH because not only did it modify a constant (not sure how that was allowed to happen, except maybe because it was done at early boot, const variables were still mutable), but it made the filters have functions listed in them when they were actually empty. The kernel command line function needs to allocate a new hash for the function graph filters and assign the necessary variables to that new hash instead. Link: http://lkml.kernel.org/r/1488420091.7212.17.camel@linux.intel.com

Steven Rostedt (VMware) committed 9 years ago

Commit 92ad18e1 parent 3a150df1 file · +8 −4Browse files

Unified · Split

kernel/trace/ftrace.c+8−4
@@ -4421,10 +4421,9 @@ static void __init set_ftrace_early_graph(char *buf, int enable) · 4420 unmodified lines
4421 char *func;4421 char *func;
4422 struct ftrace_hash *hash;4422 struct ftrace_hash *hash;
4423 4423
4424 if (enable)4424 hash = alloc_ftrace_hash(FTRACE_HASH_DEFAULT_BITS);
4425 hash = ftrace_graph_hash;4425 if (WARN_ON(!hash))
4426 else4426 return;
4427 hash = ftrace_graph_notrace_hash;
4428 4427
4429 while (buf) {4428 while (buf) {
4430 func = strsep(&buf, ",");4429 func = strsep(&buf, ",");
@@ -4434,6 +4433,11 @@ static void __init set_ftrace_early_graph(char *buf, int enable) · 3 unmodified lines
4434 printk(KERN_DEBUG "ftrace: function %s not "4433 printk(KERN_DEBUG "ftrace: function %s not "
4435 "traceable\n", func);4434 "traceable\n", func);
4436 }4435 }
4436
4437 if (enable)
4438 ftrace_graph_hash = hash;
4439 else
4440 ftrace_graph_notrace_hash = hash;
4437}4441}
4438#endif /* CONFIG_FUNCTION_GRAPH_TRACER */4442#endif /* CONFIG_FUNCTION_GRAPH_TRACER */
4439 4443