1#!/bin/sh
2# perf record sample filtering (by BPF) tests
3# SPDX-License-Identifier: GPL-2.0
4
5set -e
6
7err=0
8perfdata=$(mktemp /tmp/__perf_test.perf.data.XXXXX)
9
10cleanup() {
11  rm -f "${perfdata}"
12  rm -f "${perfdata}".old
13  trap - EXIT TERM INT
14}
15
16trap_cleanup() {
17  cleanup
18  exit 1
19}
20trap trap_cleanup EXIT TERM INT
21
22test_bpf_filter_priv() {
23  echo "Checking BPF-filter privilege"
24
25  if [ "$(id -u)" != 0 ]
26  then
27    echo "bpf-filter test [Skipped permission]"
28    err=2
29    return
30  fi
31  if ! perf record -e task-clock --filter 'period > 1' \
32	  -o /dev/null --quiet true 2>&1
33  then
34    echo "bpf-filter test [Skipped missing BPF support]"
35    err=2
36    return
37  fi
38}
39
40test_bpf_filter_basic() {
41  echo "Basic bpf-filter test"
42
43  if ! perf record -e task-clock -c 10000 --filter 'ip < 0xffffffff00000000' \
44	  -o "${perfdata}" true 2> /dev/null
45  then
46    echo "Basic bpf-filter test [Failed record]"
47    err=1
48    return
49  fi
50  if perf script -i "${perfdata}" -F ip | grep 'ffffffff[0-9a-f]*'
51  then
52    if uname -r | grep -q ^6.2
53    then
54      echo "Basic bpf-filter test [Skipped unsupported kernel]"
55      err=2
56      return
57    fi
58    echo "Basic bpf-filter test [Failed invalid output]"
59    err=1
60    return
61  fi
62  echo "Basic bpf-filter test [Success]"
63}
64
65test_bpf_filter_fail() {
66  echo "Failing bpf-filter test"
67
68  # 'cpu' requires PERF_SAMPLE_CPU flag
69  if ! perf record -e task-clock --filter 'cpu > 0' \
70	  -o /dev/null true 2>&1 | grep PERF_SAMPLE_CPU
71  then
72    echo "Failing bpf-filter test [Failed forbidden CPU]"
73    err=1
74    return
75  fi
76
77  if ! perf record --sample-cpu -e task-clock --filter 'cpu > 0' \
78	  -o /dev/null true 2>/dev/null
79  then
80    echo "Failing bpf-filter test [Failed should succeed]"
81    err=1
82    return
83  fi
84
85  echo "Failing bpf-filter test [Success]"
86}
87
88test_bpf_filter_group() {
89  echo "Group bpf-filter test"
90
91  if ! perf record -e task-clock --filter 'period > 1000 || ip > 0' \
92	  -o /dev/null true 2>/dev/null
93  then
94    echo "Group bpf-filter test [Failed should succeed]"
95    err=1
96    return
97  fi
98
99  if ! perf record -e task-clock --filter 'cpu > 0 || ip > 0' \
100	  -o /dev/null true 2>&1 | grep PERF_SAMPLE_CPU
101  then
102    echo "Group bpf-filter test [Failed forbidden CPU]"
103    err=1
104    return
105  fi
106
107  if ! perf record -e task-clock --filter 'period > 0 || code_pgsz > 4096' \
108	  -o /dev/null true 2>&1 | grep PERF_SAMPLE_CODE_PAGE_SIZE
109  then
110    echo "Group bpf-filter test [Failed forbidden CODE_PAGE_SIZE]"
111    err=1
112    return
113  fi
114
115  echo "Group bpf-filter test [Success]"
116}
117
118
119test_bpf_filter_priv
120
121if [ $err = 0 ]; then
122  test_bpf_filter_basic
123fi
124
125if [ $err = 0 ]; then
126  test_bpf_filter_fail
127fi
128
129if [ $err = 0 ]; then
130  test_bpf_filter_group
131fi
132
133cleanup
134exit $err
135