Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

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

selftests: ftrace: Add test to test reading of set_ftrace_file



The set_ftrace_file lists both functions that are filtered, as well as
function probes (triggers) that are attached to a function, like traceon or
stacktrace, etc. The reading of this file is not as trivial as most pseudo
files are, and there's been various bugs that have appeared in the past
when there's a mix of probes and functions listed. There's also a difference
when reading the file using dd with a block size of 1.

This test performs the following:

 o Resets set_ftrace_filter

 o Makes sure only "#### all functions enabled ####" is listed

    (All checks uses cat, and dd with bs=1 and bs=100)

 o Adds a traceon trigger to schedule

 o Checks if only "#### all function enabled ####" and the trigger is there.

 o Adds tracing of schedule

 o Checks if only schedule and the trigger is there

 o Adds tracing of do_IRQ as well

 o Checks if only schedule, do_IRQ and the trigger is there

 o Adds a traceon trigger to do_IRQ

 o Checks if only schedule, do_IRQ and both triggers are there

 o Removes tracing of do_IRQ

 o Checks if only schedule and both triggers are there

 o Removes tracing of schedule

 o Checks if only  "#### all functions enabled ####" and both triggers are there

 o Removes the triggers

 o Checks if only "#### all functions enabled ####" is there

 o Adds tracing of schedule

 o Checks if only schedule is there

 o Adds tracing of do_IRQ

 o Checks if only schedule and do_IRQ are there

Signed-off-by: default avatarSteven Rostedt (VMware) <rostedt@goodmis.org>
parent d8b39e1d
Loading
Loading
Loading
Loading
+132 −0
Original line number Diff line number Diff line
#!/bin/sh
# description: ftrace - test reading of set_ftrace_filter
#
# The set_ftrace_filter file of ftrace is used to list functions as well as
# triggers (probes) attached to functions. The code to read this file is not
# straight forward and has had various bugs in the past. This test is designed
# to add functions and triggers to that file in various ways and read that
# file in various ways (cat vs dd).
#

# The triggers are set within the set_ftrace_filter file
if [ ! -f set_ftrace_filter ]; then
    echo "set_ftrace_filter not found? Is dynamic ftrace not set?"
    exit_unsupported
fi

do_reset() {
    reset_tracer
    reset_ftrace_filter
    disable_events
    clear_trace
    enable_tracing
}

fail() { # mesg
    do_reset
    echo $1
    exit $FAIL
}

do_reset

FILTER=set_ftrace_filter
FUNC1="schedule"
FUNC2="do_IRQ"

ALL_FUNCS="#### all functions enabled ####"

test_func() {
    if ! echo "$1" | grep -q "^$2\$"; then
	return 0
    fi
    echo "$1" | grep -v "^$2\$"
    return 1
}

check_set_ftrace_filter() {
    cat=`cat $FILTER`
    dd1=`dd if=$FILTER bs=1 | grep -v -e 'records in' -e 'records out' -e 'bytes copied'`
    dd100=`dd if=$FILTER bs=100 | grep -v -e 'records in' -e 'records out' -e 'bytes copied'`

    echo "Testing '$@'"

    while [ $# -gt 0 ]; do
	echo "test $1"
	if cat=`test_func "$cat" "$1"`; then
	    return 0
	fi
	if dd1=`test_func "$dd1" "$1"`; then
	    return 0
	fi
	if dd100=`test_func "$dd100" "$1"`; then
	    return 0
	fi
	shift
    done

    if [ -n "$cat" ]; then
	return 0
    fi
    if [ -n "$dd1" ]; then
	return 0
    fi
    if [ -n "$dd100" ]; then
	return 0
    fi
    return 1;
}

if check_set_ftrace_filter "$ALL_FUNCS"; then
    fail "Expected only $ALL_FUNCS"
fi

echo "$FUNC1:traceoff" > set_ftrace_filter
if check_set_ftrace_filter "$ALL_FUNCS" "$FUNC1:traceoff:unlimited"; then
    fail "Expected $ALL_FUNCS and $FUNC1:traceoff:unlimited"
fi

echo "$FUNC1" > set_ftrace_filter
if check_set_ftrace_filter "$FUNC1" "$FUNC1:traceoff:unlimited"; then
    fail "Expected $FUNC1 and $FUNC1:traceoff:unlimited"
fi

echo "$FUNC2" >> set_ftrace_filter
if check_set_ftrace_filter "$FUNC1" "$FUNC2" "$FUNC1:traceoff:unlimited"; then
    fail "Expected $FUNC1 $FUNC2 and $FUNC1:traceoff:unlimited"
fi

echo "$FUNC2:traceoff" >> set_ftrace_filter
if check_set_ftrace_filter "$FUNC1" "$FUNC2" "$FUNC1:traceoff:unlimited" "$FUNC2:traceoff:unlimited"; then
    fail "Expected $FUNC1 $FUNC2 $FUNC1:traceoff:unlimited and $FUNC2:traceoff:unlimited"
fi

echo "$FUNC1" > set_ftrace_filter
if check_set_ftrace_filter "$FUNC1" "$FUNC1:traceoff:unlimited" "$FUNC2:traceoff:unlimited"; then
    fail "Expected $FUNC1 $FUNC1:traceoff:unlimited and $FUNC2:traceoff:unlimited"
fi

echo > set_ftrace_filter
if check_set_ftrace_filter "$ALL_FUNCS" "$FUNC1:traceoff:unlimited" "$FUNC2:traceoff:unlimited"; then
    fail "Expected $ALL_FUNCS $FUNC1:traceoff:unlimited and $FUNC2:traceoff:unlimited"
fi

reset_ftrace_filter

if check_set_ftrace_filter "$ALL_FUNCS"; then
    fail "Expected $ALL_FUNCS"
fi

echo "$FUNC1" > set_ftrace_filter
if check_set_ftrace_filter "$FUNC1" ; then
    fail "Expected $FUNC1"
fi

echo "$FUNC2" >> set_ftrace_filter
if check_set_ftrace_filter "$FUNC1" "$FUNC2" ; then
    fail "Expected $FUNC1 and $FUNC2"
fi

do_reset

exit 0