commit756b56a9e8upstream. The trigger code is picky in how it can be disabled as there may be dependencies between different events and synthetic events. Change the order on how triggers are reset. 1) Reset triggers of all synthetic events first 2) Remove triggers with actions attached to them 3) Remove all other triggers If this order isn't followed, then some triggers will not be reset, and an error may happen because a trigger is busy. Cc: stable@vger.kernel.org Fixes:cfa0963dc4("kselftests/ftrace : Add event trigger testcases") Reviewed-by: Namhyung Kim <namhyung@kernel.org> Acked-by: Masami Hiramatsu <mhiramat@kernel.org> Signed-off-by: Steven Rostedt (VMware) <rostedt@goodmis.org> Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
90 lines
2.2 KiB
Plaintext
90 lines
2.2 KiB
Plaintext
|
|
clear_trace() { # reset trace output
|
|
echo > trace
|
|
}
|
|
|
|
disable_tracing() { # stop trace recording
|
|
echo 0 > tracing_on
|
|
}
|
|
|
|
enable_tracing() { # start trace recording
|
|
echo 1 > tracing_on
|
|
}
|
|
|
|
reset_tracer() { # reset the current tracer
|
|
echo nop > current_tracer
|
|
}
|
|
|
|
reset_trigger_file() {
|
|
# remove action triggers first
|
|
grep -H ':on[^:]*(' $@ |
|
|
while read line; do
|
|
cmd=`echo $line | cut -f2- -d: | cut -f1 -d" "`
|
|
file=`echo $line | cut -f1 -d:`
|
|
echo "!$cmd" >> $file
|
|
done
|
|
grep -Hv ^# $@ |
|
|
while read line; do
|
|
cmd=`echo $line | cut -f2- -d: | cut -f1 -d" "`
|
|
file=`echo $line | cut -f1 -d:`
|
|
echo "!$cmd" > $file
|
|
done
|
|
}
|
|
|
|
reset_trigger() { # reset all current setting triggers
|
|
if [ -d events/synthetic ]; then
|
|
reset_trigger_file events/synthetic/*/trigger
|
|
fi
|
|
reset_trigger_file events/*/*/trigger
|
|
}
|
|
|
|
reset_events_filter() { # reset all current setting filters
|
|
grep -v ^none events/*/*/filter |
|
|
while read line; do
|
|
echo 0 > `echo $line | cut -f1 -d:`
|
|
done
|
|
}
|
|
|
|
reset_ftrace_filter() { # reset all triggers in set_ftrace_filter
|
|
echo > set_ftrace_filter
|
|
grep -v '^#' set_ftrace_filter | while read t; do
|
|
tr=`echo $t | cut -d: -f2`
|
|
if [ "$tr" = "" ]; then
|
|
continue
|
|
fi
|
|
if [ $tr = "enable_event" -o $tr = "disable_event" ]; then
|
|
tr=`echo $t | cut -d: -f1-4`
|
|
limit=`echo $t | cut -d: -f5`
|
|
else
|
|
tr=`echo $t | cut -d: -f1-2`
|
|
limit=`echo $t | cut -d: -f3`
|
|
fi
|
|
if [ "$limit" != "unlimited" ]; then
|
|
tr="$tr:$limit"
|
|
fi
|
|
echo "!$tr" > set_ftrace_filter
|
|
done
|
|
}
|
|
|
|
disable_events() {
|
|
echo 0 > events/enable
|
|
}
|
|
|
|
initialize_ftrace() { # Reset ftrace to initial-state
|
|
# As the initial state, ftrace will be set to nop tracer,
|
|
# no events, no triggers, no filters, no function filters,
|
|
# no probes, and tracing on.
|
|
disable_tracing
|
|
reset_tracer
|
|
reset_trigger
|
|
reset_events_filter
|
|
disable_events
|
|
echo > set_event_pid # event tracer is always on
|
|
[ -f set_ftrace_filter ] && echo | tee set_ftrace_*
|
|
[ -f set_graph_function ] && echo | tee set_graph_*
|
|
[ -f stack_trace_filter ] && echo > stack_trace_filter
|
|
[ -f kprobe_events ] && echo > kprobe_events
|
|
[ -f uprobe_events ] && echo > uprobe_events
|
|
enable_tracing
|
|
}
|