Commit 646f01cc authored by Steven Rostedt (VMware)'s avatar Steven Rostedt (VMware)
Browse files

ftrace/selftest: Add tests to test register_ftrace_direct()



Add two test cases that test the new ftrace direct functionality if the
ftrace-direct sample module is available. One test case tests against each
available tracer (function, function_graph, mmiotrace, etc), and the other
test tests against a kprobe at the same location as the direct caller. Both
tests follow the same pattern of testing combinations:

  enable test (either the tracer or the kprobe)
  load direct function module
  unload direct function module
  disable test

  enable test
  load direct function module
  disable test
  unload direct function module

  load direct function module
  enable test
  disable test
  unload direct function module

  load direct function module
  enable test
  unload direct function module
  disable test

As most the bugs in development happened with various ways of enabling or
disabling the direct calls with function tracer in one of these
combinations.

Signed-off-by: default avatarSteven Rostedt (VMware) <rostedt@goodmis.org>
parent b06457c8
Loading
Loading
Loading
Loading
+53 −0
Original line number Diff line number Diff line
#!/bin/sh
# SPDX-License-Identifier: GPL-2.0
# description: Test ftrace direct functions against tracers

rmmod ftrace-direct ||:
if ! modprobe ftrace-direct ; then
  echo "No ftrace-direct sample module - please make CONFIG_SAMPLE_FTRACE_DIRECT=m"
  exit_unresolved;
fi

echo "Let the module run a little"
sleep 1

grep -q "my_direct_func: wakeing up" trace

rmmod ftrace-direct

test_tracer() {
	tracer=$1

	# tracer -> direct -> no direct > no tracer
	echo $tracer > current_tracer
	modprobe ftrace-direct
	rmmod ftrace-direct
	echo nop > current_tracer

	# tracer -> direct -> no tracer > no direct
	echo $tracer > current_tracer
	modprobe ftrace-direct
	echo nop > current_tracer
	rmmod ftrace-direct

	# direct -> tracer -> no tracer > no direct
	modprobe ftrace-direct
	echo $tracer > current_tracer
	echo nop > current_tracer
	rmmod ftrace-direct

	# direct -> tracer -> no direct > no notracer
	modprobe ftrace-direct
	echo $tracer > current_tracer
	rmmod ftrace-direct
	echo nop > current_tracer
}

for t in `cat available_tracers`; do
	if [ "$t" != "nop" ]; then
		test_tracer $t
	fi
done

echo nop > current_tracer
rmmod ftrace-direct ||:
+71 −0
Original line number Diff line number Diff line
#!/bin/sh
# SPDX-License-Identifier: GPL-2.0
# description: Test ftrace direct functions against kprobes

rmmod ftrace-direct ||:
if ! modprobe ftrace-direct ; then
  echo "No ftrace-direct sample module - please build with CONFIG_SAMPLE_FTRACE_DIRECT=m"
  exit_unresolved;
fi

if [ ! -f kprobe_events ]; then
	echo "No kprobe_events file -please build CONFIG_KPROBE_EVENTS"
	exit_unresolved;
fi

echo "Let the module run a little"
sleep 1

grep -q "my_direct_func: wakeing up" trace

rmmod ftrace-direct

echo 'p:kwake wake_up_process task=$arg1' > kprobe_events

start_direct() {
	echo > trace
	modprobe ftrace-direct
	sleep 1
	grep -q "my_direct_func: wakeing up" trace
}

stop_direct() {
	rmmod ftrace-direct
}

enable_probe() {
	echo > trace
	echo 1 > events/kprobes/kwake/enable
	sleep 1
	grep -q "kwake:" trace
}

disable_probe() {
	echo 0 > events/kprobes/kwake/enable
}

# probe -> direct -> no direct > no probe
enable_probe
start_direct
stop_direct
disable_probe

# probe -> direct -> no probe > no direct
enable_probe
start_direct
disable_probe
stop_direct

# direct -> probe -> no probe > no direct
start_direct
enable_probe
disable_probe
stop_direct

# direct -> probe -> no direct > no noprobe
start_direct
enable_probe
stop_direct
disable_probe

echo > kprobe_events