1#!/bin/sh
2# SPDX-License-Identifier: GPL-2.0
3# description: event filter function - test event filtering on functions
4# requires: set_event events/kmem/kmem_cache_free/filter
5# flags: instance
6
7fail() { #msg
8    echo $1
9    exit_fail
10}
11
12sample_events() {
13    echo 1 > events/kmem/kmem_cache_free/enable
14    echo 1 > tracing_on
15    ls > /dev/null
16    echo 0 > tracing_on
17    echo 0 > events/kmem/kmem_cache_free/enable
18}
19
20echo 0 > tracing_on
21echo 0 > events/enable
22
23echo "Get the most frequently calling function"
24echo > trace
25sample_events
26
27target_func=`cat trace | grep -o 'call_site=\([^+]*\)' | sed 's/call_site=//' | sort | uniq -c | sort | tail -n 1 | sed 's/^[ 0-9]*//'`
28if [ -z "$target_func" ]; then
29    exit_fail
30fi
31echo > trace
32
33echo "Test event filter function name"
34echo "call_site.function == $target_func" > events/kmem/kmem_cache_free/filter
35
36sample_events
37max_retry=10
38while [ `grep kmem_cache_free trace| wc -l` -eq 0 ]; do
39sample_events
40max_retry=$((max_retry - 1))
41if [ $max_retry -eq 0 ]; then
42	exit_fail
43fi
44done
45
46hitcnt=`grep kmem_cache_free trace| grep $target_func | wc -l`
47misscnt=`grep kmem_cache_free trace| grep -v $target_func | wc -l`
48
49if [ $hitcnt -eq 0 ]; then
50	exit_fail
51fi
52
53if [ $misscnt -gt 0 ]; then
54	exit_fail
55fi
56
57address=`grep " ${target_func}\$" /proc/kallsyms | cut -d' ' -f1`
58
59echo "Test event filter function address"
60echo "call_site.function == 0x$address" > events/kmem/kmem_cache_free/filter
61echo > trace
62sample_events
63max_retry=10
64while [ `grep kmem_cache_free trace| wc -l` -eq 0 ]; do
65sample_events
66max_retry=$((max_retry - 1))
67if [ $max_retry -eq 0 ]; then
68	exit_fail
69fi
70done
71
72hitcnt=`grep kmem_cache_free trace| grep $target_func | wc -l`
73misscnt=`grep kmem_cache_free trace| grep -v $target_func | wc -l`
74
75if [ $hitcnt -eq 0 ]; then
76	exit_fail
77fi
78
79if [ $misscnt -gt 0 ]; then
80	exit_fail
81fi
82
83reset_events_filter
84
85exit 0
86