1#!/bin/sh
2# SPDX-License-Identifier: GPL-2.0
3# description: ftrace - function graph filters with stack tracer
4
5# Make sure that function graph filtering works, and is not
6# affected by other tracers enabled (like stack tracer)
7
8if ! grep -q function_graph available_tracers; then
9    echo "no function graph tracer configured"
10    exit_unsupported
11fi
12
13if [ ! -f set_ftrace_filter ]; then
14    echo "set_ftrace_filter not found? Is dynamic ftrace not set?"
15    exit_unsupported
16fi
17
18do_reset() {
19    if [ -e /proc/sys/kernel/stack_tracer_enabled ]; then
20	    echo 0 > /proc/sys/kernel/stack_tracer_enabled
21    fi
22}
23
24fail() { # msg
25    do_reset
26    echo $1
27    exit_fail
28}
29
30disable_tracing
31clear_trace;
32
33# filter something, schedule is always good
34if ! echo "schedule" > set_ftrace_filter; then
35    # test for powerpc 64
36    if ! echo ".schedule" > set_ftrace_filter; then
37	fail "can not enable schedule filter"
38    fi
39fi
40
41echo function_graph > current_tracer
42
43if [ ! -f stack_trace ]; then
44    echo "Stack tracer not configured"
45    do_reset
46    exit_unsupported;
47fi
48
49echo "Now testing with stack tracer"
50
51echo 1 > /proc/sys/kernel/stack_tracer_enabled
52
53disable_tracing
54clear_trace
55enable_tracing
56sleep 1
57
58count=`cat trace | grep '()' | grep -v schedule | wc -l`
59
60if [ $count -ne 0 ]; then
61    fail "Graph filtering not working with stack tracer?"
62fi
63
64# Make sure we did find something
65count=`cat trace | grep 'schedule()' | wc -l`
66if [ $count -eq 0 ]; then
67    fail "No schedule traces found?"
68fi
69
70echo 0 > /proc/sys/kernel/stack_tracer_enabled
71clear_trace
72sleep 1
73
74
75count=`cat trace | grep '()' | grep -v schedule | wc -l`
76
77if [ $count -ne 0 ]; then
78    fail "Graph filtering not working after stack tracer disabled?"
79fi
80
81count=`cat trace | grep 'schedule()' | wc -l`
82if [ $count -eq 0 ]; then
83    fail "No schedule traces found?"
84fi
85
86do_reset
87
88exit 0
89