ftrace: Allow enabling of filters via index of available_filter_functions
Enabling of large number of functions by echoing in a large subset of the functions in available_filter_functions can take a very long time. The process requires testing all functions registered by the function tracer (which is in the 10s of thousands), and doing a kallsyms lookup to convert the ip address into a name, then comparing that name with the string passed in. When a function causes the function tracer to crash the system, a binary bisect of the available_filter_functions can be done to find the culprit. But this requires passing in half of the functions in available_filter_functions over and over again, which makes it basically a O(n^2) operation. With 40,000 functions, that ends up bing 1,600,000,000 opertions! And enabling this can take over 20 minutes. As a quick speed up, if a number is passed into one of the filter files, instead of doing a search, it just enables the function at the corresponding line of the available_filter_functions file. That is: # echo 50 > set_ftrace_filter # cat set_ftrace_filter x86_pmu_commit_txn # head -50 available_filter_functions | tail -1 x86_pmu_commit_txn This allows setting of half the available_filter_functions to take place in less than a second! # time seq 20000 > set_ftrace_filter real 0m0.042s user 0m0.005s sys 0m0.015s # wc -l set_ftrace_filter 20000 set_ftrace_filter Signed-off-by: Steven Rostedt (VMware) <rostedt@goodmis.org>
This commit is contained in:
@@ -233,6 +233,12 @@ of ftrace. Here is a list of some of the key files:
|
||||
This interface also allows for commands to be used. See the
|
||||
"Filter commands" section for more details.
|
||||
|
||||
As a speed up, since processing strings can't be quite expensive
|
||||
and requires a check of all functions registered to tracing, instead
|
||||
an index can be written into this file. A number (starting with "1")
|
||||
written will instead select the same corresponding at the line position
|
||||
of the "available_filter_functions" file.
|
||||
|
||||
set_ftrace_notrace:
|
||||
|
||||
This has an effect opposite to that of
|
||||
@@ -2835,6 +2841,38 @@ Produces::
|
||||
|
||||
We can see that there's no more lock or preempt tracing.
|
||||
|
||||
Selecting function filters via index
|
||||
------------------------------------
|
||||
|
||||
Because processing of strings is expensive (the address of the function
|
||||
needs to be looked up before comparing to the string being passed in),
|
||||
an index can be used as well to enable functions. This is useful in the
|
||||
case of setting thousands of specific functions at a time. By passing
|
||||
in a list of numbers, no string processing will occur. Instead, the function
|
||||
at the specific location in the internal array (which corresponds to the
|
||||
functions in the "available_filter_functions" file), is selected.
|
||||
|
||||
::
|
||||
|
||||
# echo 1 > set_ftrace_filter
|
||||
|
||||
Will select the first function listed in "available_filter_functions"
|
||||
|
||||
::
|
||||
|
||||
# head -1 available_filter_functions
|
||||
trace_initcall_finish_cb
|
||||
|
||||
# cat set_ftrace_filter
|
||||
trace_initcall_finish_cb
|
||||
|
||||
# head -50 available_filter_functions | tail -1
|
||||
x86_pmu_commit_txn
|
||||
|
||||
# echo 1 50 > set_ftrace_filter
|
||||
# cat set_ftrace_filter
|
||||
trace_initcall_finish_cb
|
||||
x86_pmu_commit_txn
|
||||
|
||||
Dynamic ftrace with the function graph tracer
|
||||
---------------------------------------------
|
||||
|
Fai riferimento in un nuovo problema
Block a user