tools/bootconfig: Add --init option for bconf2ftrace.sh
authorMasami Hiramatsu <mhiramat@kernel.org>
Mon, 10 Aug 2020 08:35:32 +0000 (17:35 +0900)
committerSteven Rostedt (VMware) <rostedt@goodmis.org>
Sat, 19 Sep 2020 02:17:13 +0000 (22:17 -0400)
Since the ftrace current setting may conflict with the new setting
from bootconfig, add the --init option to initialize ftrace before
setting for bconf2ftrace.sh.

E.g.
 $ bconf2ftrace.sh --init boottrace.bconf

This initialization method copied from selftests/ftrace.

Link: https://lkml.kernel.org/r/159704853203.175360.17029578033994278231.stgit@devnote2
Signed-off-by: Masami Hiramatsu <mhiramat@kernel.org>
Signed-off-by: Steven Rostedt (VMware) <rostedt@goodmis.org>
tools/bootconfig/scripts/bconf2ftrace.sh
tools/bootconfig/scripts/ftrace.sh [new file with mode: 0644]

index a46e984..595e164 100755 (executable)
@@ -3,8 +3,9 @@
 
 usage() {
        echo "Ftrace boottime trace test tool"
-       echo "Usage: $0 [--apply] [--debug] BOOTCONFIG-FILE"
+       echo "Usage: $0 [--apply|--init] [--debug] BOOTCONFIG-FILE"
        echo "    --apply: Test actual apply to tracefs (need sudo)"
+       echo "    --init:  Initialize ftrace before applying (imply --apply)"
        exit 1
 }
 
@@ -13,12 +14,16 @@ usage() {
 BCONF=
 DEBUG=
 APPLY=
+INIT=
 while [ x"$1" != x ]; do
        case "$1" in
        "--debug")
                DEBUG=$1;;
        "--apply")
                APPLY=$1;;
+       "--init")
+               APPLY=$1
+               INIT=$1;;
        *)
                [ ! -f $1 ] && usage
                BCONF=$1;;
@@ -57,6 +62,11 @@ if [ -z "$TRACEFS" ]; then
        fi
 fi
 
+if [ x"$INIT" != x ]; then
+       . `dirname $0`/ftrace.sh
+       (cd $TRACEFS; initialize_ftrace)
+fi
+
 . `dirname $0`/xbc.sh
 
 ######## main #########
diff --git a/tools/bootconfig/scripts/ftrace.sh b/tools/bootconfig/scripts/ftrace.sh
new file mode 100644 (file)
index 0000000..186eed9
--- /dev/null
@@ -0,0 +1,109 @@
+# SPDX-License-Identifier: GPL-2.0-only
+
+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
+    if [ ! -f set_ftrace_filter ]; then
+      return 0
+    fi
+    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 ! grep -q "$t" set_ftrace_filter; then
+               continue;
+       fi
+       name=`echo $t | cut -d: -f1 | cut -d' ' -f1`
+       if [ $tr = "enable_event" -o $tr = "disable_event" ]; then
+           tr=`echo $t | cut -d: -f2-4`
+           limit=`echo $t | cut -d: -f5`
+       else
+           tr=`echo $t | cut -d: -f2`
+           limit=`echo $t | cut -d: -f3`
+       fi
+       if [ "$limit" != "unlimited" ]; then
+           tr="$tr:$limit"
+       fi
+       echo "!$name:$tr" > set_ftrace_filter
+    done
+}
+
+disable_events() {
+    echo 0 > events/enable
+}
+
+clear_synthetic_events() { # reset all current synthetic events
+    grep -v ^# synthetic_events |
+    while read line; do
+        echo "!$line" >> synthetic_events
+    done
+}
+
+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
+    reset_ftrace_filter
+    disable_events
+    [ -f set_event_pid ] && echo > set_event_pid
+    [ -f set_ftrace_pid ] && echo > set_ftrace_pid
+    [ -f set_ftrace_notrace ] && echo > set_ftrace_notrace
+    [ -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
+    [ -f synthetic_events ] && echo > synthetic_events
+    [ -f snapshot ] && echo 0 > snapshot
+    clear_trace
+    enable_tracing
+}