aboutsummaryrefslogtreecommitdiffstatshomepage
path: root/tools/perf/tests/shell/record_bpf_filter.sh
blob: 31c593966e8cf6a6209f4916529e28e2f1d31e15 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
#!/bin/sh
# perf record sample filtering (by BPF) tests
# SPDX-License-Identifier: GPL-2.0

set -e

err=0
perfdata=$(mktemp /tmp/__perf_test.perf.data.XXXXX)

cleanup() {
  rm -f "${perfdata}"
  rm -f "${perfdata}".old
  trap - EXIT TERM INT
}

trap_cleanup() {
  cleanup
  exit 1
}
trap trap_cleanup EXIT TERM INT

test_bpf_filter_priv() {
  echo "Checking BPF-filter privilege"

  if [ "$(id -u)" != 0 ]
  then
    echo "bpf-filter test [Skipped permission]"
    err=2
    return
  fi
  if ! perf record -e task-clock --filter 'period > 1' \
	  -o /dev/null --quiet true 2>&1
  then
    echo "bpf-filter test [Skipped missing BPF support]"
    err=2
    return
  fi
}

test_bpf_filter_basic() {
  echo "Basic bpf-filter test"

  if ! perf record -e task-clock -c 10000 --filter 'ip < 0xffffffff00000000' \
	  -o "${perfdata}" true 2> /dev/null
  then
    echo "Basic bpf-filter test [Failed record]"
    err=1
    return
  fi
  if perf script -i "${perfdata}" -F ip | grep 'ffffffff[0-9a-f]*'
  then
    if uname -r | grep -q ^6.2
    then
      echo "Basic bpf-filter test [Skipped unsupported kernel]"
      err=2
      return
    fi
    echo "Basic bpf-filter test [Failed invalid output]"
    err=1
    return
  fi
  echo "Basic bpf-filter test [Success]"
}

test_bpf_filter_fail() {
  echo "Failing bpf-filter test"

  # 'cpu' requires PERF_SAMPLE_CPU flag
  if ! perf record -e task-clock --filter 'cpu > 0' \
	  -o /dev/null true 2>&1 | grep PERF_SAMPLE_CPU
  then
    echo "Failing bpf-filter test [Failed forbidden CPU]"
    err=1
    return
  fi

  if ! perf record --sample-cpu -e task-clock --filter 'cpu > 0' \
	  -o /dev/null true 2>/dev/null
  then
    echo "Failing bpf-filter test [Failed should succeed]"
    err=1
    return
  fi

  echo "Failing bpf-filter test [Success]"
}

test_bpf_filter_group() {
  echo "Group bpf-filter test"

  if ! perf record -e task-clock --filter 'period > 1000 || ip > 0' \
	  -o /dev/null true 2>/dev/null
  then
    echo "Group bpf-filter test [Failed should succeed]"
    err=1
    return
  fi

  if ! perf record -e task-clock --filter 'cpu > 0 || ip > 0' \
	  -o /dev/null true 2>&1 | grep PERF_SAMPLE_CPU
  then
    echo "Group bpf-filter test [Failed forbidden CPU]"
    err=1
    return
  fi

  if ! perf record -e task-clock --filter 'period > 0 || code_pgsz > 4096' \
	  -o /dev/null true 2>&1 | grep PERF_SAMPLE_CODE_PAGE_SIZE
  then
    echo "Group bpf-filter test [Failed forbidden CODE_PAGE_SIZE]"
    err=1
    return
  fi

  echo "Group bpf-filter test [Success]"
}


test_bpf_filter_priv

if [ $err = 0 ]; then
  test_bpf_filter_basic
fi

if [ $err = 0 ]; then
  test_bpf_filter_fail
fi

if [ $err = 0 ]; then
  test_bpf_filter_group
fi

cleanup
exit $err