1#!/bin/sh
2# perf record offcpu profiling 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_offcpu_priv() {
23  echo "Checking off-cpu privilege"
24
25  if [ "$(id -u)" != 0 ]
26  then
27    echo "off-cpu test [Skipped permission]"
28    err=2
29    return
30  fi
31  if perf record --off-cpu -o /dev/null --quiet true 2>&1 | grep BUILD_BPF_SKEL
32  then
33    echo "off-cpu test [Skipped missing BPF support]"
34    err=2
35    return
36  fi
37}
38
39test_offcpu_basic() {
40  echo "Basic off-cpu test"
41
42  if ! perf record --off-cpu -e dummy -o ${perfdata} sleep 1 2> /dev/null
43  then
44    echo "Basic off-cpu test [Failed record]"
45    err=1
46    return
47  fi
48  if ! perf evlist -i ${perfdata} | grep -q "offcpu-time"
49  then
50    echo "Basic off-cpu test [Failed no event]"
51    err=1
52    return
53  fi
54  if ! perf report -i ${perfdata} -q --percent-limit=90 | grep -E -q sleep
55  then
56    echo "Basic off-cpu test [Failed missing output]"
57    err=1
58    return
59  fi
60  echo "Basic off-cpu test [Success]"
61}
62
63test_offcpu_child() {
64  echo "Child task off-cpu test"
65
66  # perf bench sched messaging creates 400 processes
67  if ! perf record --off-cpu -e dummy -o ${perfdata} -- \
68    perf bench sched messaging -g 10 > /dev/null 2>&1
69  then
70    echo "Child task off-cpu test [Failed record]"
71    err=1
72    return
73  fi
74  if ! perf evlist -i ${perfdata} | grep -q "offcpu-time"
75  then
76    echo "Child task off-cpu test [Failed no event]"
77    err=1
78    return
79  fi
80  # each process waits for read and write, so it should be more than 800 events
81  if ! perf report -i ${perfdata} -s comm -q -n -t ';' --percent-limit=90 | \
82    awk -F ";" '{ if (NF > 3 && int($3) < 800) exit 1; }'
83  then
84    echo "Child task off-cpu test [Failed invalid output]"
85    err=1
86    return
87  fi
88  echo "Child task off-cpu test [Success]"
89}
90
91
92test_offcpu_priv
93
94if [ $err = 0 ]; then
95  test_offcpu_basic
96fi
97
98if [ $err = 0 ]; then
99  test_offcpu_child
100fi
101
102cleanup
103exit $err
104