Commit eb50d0f2 authored by Masami Hiramatsu (Google)'s avatar Masami Hiramatsu (Google)
Browse files

selftests/ftrace: Choose target function for filter test from samples

Since the event-filter-function.tc expects the 'exit_mmap()' directly
calls 'kmem_cache_free()', this is vulnerable to code modifications.

Choose the target function for the filter test from the sample
event data so that it can keep test running correctly even if the caller
function name will be changed.

Link: https://lore.kernel.org/linux-trace-kernel/167919441260.1922645.18355804179347364057.stgit@mhiramat.roam.corp.google.com/

Link: https://lore.kernel.org/all/CA+G9fYtF-XEKi9YNGgR=Kf==7iRb2FrmEC7qtwAeQbfyah-UhA@mail.gmail.com/


Reported-by: default avatarLinux Kernel Functional Testing <lkft@linaro.org>
Fixes: 7f09d639 ("tracing/selftests: Add test for event filtering on function name")
Signed-off-by: default avatarMasami Hiramatsu (Google) <mhiramat@kernel.org>
Acked-by: default avatarSteven Rostedt (Google) <rostedt@goodmis.org>
parent 81d0fa4c
Loading
Loading
Loading
Loading
+27 −18
Original line number Diff line number Diff line
@@ -9,18 +9,33 @@ fail() { #msg
    exit_fail
}

echo "Test event filter function name"
echo 0 > tracing_on
echo 0 > events/enable
sample_events() {
    echo > trace
echo 'call_site.function == exit_mmap' > events/kmem/kmem_cache_free/filter
    echo 1 > events/kmem/kmem_cache_free/enable
    echo 1 > tracing_on
    ls > /dev/null
    echo 0 > tracing_on
    echo 0 > events/kmem/kmem_cache_free/enable
}

hitcnt=`grep kmem_cache_free trace| grep exit_mmap | wc -l`
misscnt=`grep kmem_cache_free trace| grep -v exit_mmap | wc -l`
echo 0 > tracing_on
echo 0 > events/enable

echo "Get the most frequently calling function"
sample_events

target_func=`cut -d: -f3 trace | sed 's/call_site=\([^+]*\)+0x.*/\1/' | sort | uniq -c | sort | tail -n 1 | sed 's/^[ 0-9]*//'`
if [ -z "$target_func" ]; then
    exit_fail
fi
echo > trace

echo "Test event filter function name"
echo "call_site.function == $target_func" > events/kmem/kmem_cache_free/filter
sample_events

hitcnt=`grep kmem_cache_free trace| grep $target_func | wc -l`
misscnt=`grep kmem_cache_free trace| grep -v $target_func | wc -l`

if [ $hitcnt -eq 0 ]; then
	exit_fail
@@ -30,20 +45,14 @@ if [ $misscnt -gt 0 ]; then
	exit_fail
fi

address=`grep ' exit_mmap$' /proc/kallsyms | cut -d' ' -f1`
address=`grep " ${target_func}\$" /proc/kallsyms | cut -d' ' -f1`

echo "Test event filter function address"
echo 0 > tracing_on
echo 0 > events/enable
echo > trace
echo "call_site.function == 0x$address" > events/kmem/kmem_cache_free/filter
echo 1 > events/kmem/kmem_cache_free/enable
echo 1 > tracing_on
sleep 1
echo 0 > events/kmem/kmem_cache_free/enable
sample_events

hitcnt=`grep kmem_cache_free trace| grep exit_mmap | wc -l`
misscnt=`grep kmem_cache_free trace| grep -v exit_mmap | wc -l`
hitcnt=`grep kmem_cache_free trace| grep $target_func | wc -l`
misscnt=`grep kmem_cache_free trace| grep -v $target_func | wc -l`

if [ $hitcnt -eq 0 ]; then
	exit_fail