1831d06c8SNamhyung Kim#!/bin/sh
2831d06c8SNamhyung Kim# perf record offcpu profiling tests
3831d06c8SNamhyung Kim# SPDX-License-Identifier: GPL-2.0
4831d06c8SNamhyung Kim
5831d06c8SNamhyung Kimset -e
6831d06c8SNamhyung Kim
7831d06c8SNamhyung Kimerr=0
8831d06c8SNamhyung Kimperfdata=$(mktemp /tmp/__perf_test.perf.data.XXXXX)
9831d06c8SNamhyung Kim
10831d06c8SNamhyung Kimcleanup() {
11831d06c8SNamhyung Kim  rm -f ${perfdata}
12831d06c8SNamhyung Kim  rm -f ${perfdata}.old
13*a225c304SKajol Jain  trap - EXIT TERM INT
14831d06c8SNamhyung Kim}
15831d06c8SNamhyung Kim
16831d06c8SNamhyung Kimtrap_cleanup() {
17831d06c8SNamhyung Kim  cleanup
18831d06c8SNamhyung Kim  exit 1
19831d06c8SNamhyung Kim}
20*a225c304SKajol Jaintrap trap_cleanup EXIT TERM INT
21831d06c8SNamhyung Kim
22ade1d030SNamhyung Kimtest_offcpu_priv() {
23ade1d030SNamhyung Kim  echo "Checking off-cpu privilege"
24ade1d030SNamhyung Kim
25*a225c304SKajol Jain  if [ "$(id -u)" != 0 ]
26831d06c8SNamhyung Kim  then
27ade1d030SNamhyung Kim    echo "off-cpu test [Skipped permission]"
28831d06c8SNamhyung Kim    err=2
29831d06c8SNamhyung Kim    return
30831d06c8SNamhyung Kim  fi
319a2d5178SArnaldo Carvalho de Melo  if perf record --off-cpu -o /dev/null --quiet true 2>&1 | grep BUILD_BPF_SKEL
32831d06c8SNamhyung Kim  then
33ade1d030SNamhyung Kim    echo "off-cpu test [Skipped missing BPF support]"
34831d06c8SNamhyung Kim    err=2
35831d06c8SNamhyung Kim    return
36831d06c8SNamhyung Kim  fi
37ade1d030SNamhyung Kim}
38ade1d030SNamhyung Kim
39ade1d030SNamhyung Kimtest_offcpu_basic() {
40ade1d030SNamhyung Kim  echo "Basic off-cpu test"
41ade1d030SNamhyung Kim
42831d06c8SNamhyung Kim  if ! perf record --off-cpu -e dummy -o ${perfdata} sleep 1 2> /dev/null
43831d06c8SNamhyung Kim  then
44831d06c8SNamhyung Kim    echo "Basic off-cpu test [Failed record]"
45831d06c8SNamhyung Kim    err=1
46831d06c8SNamhyung Kim    return
47831d06c8SNamhyung Kim  fi
48831d06c8SNamhyung Kim  if ! perf evlist -i ${perfdata} | grep -q "offcpu-time"
49831d06c8SNamhyung Kim  then
50ade1d030SNamhyung Kim    echo "Basic off-cpu test [Failed no event]"
51831d06c8SNamhyung Kim    err=1
52831d06c8SNamhyung Kim    return
53831d06c8SNamhyung Kim  fi
54818448e9STiezhu Yang  if ! perf report -i ${perfdata} -q --percent-limit=90 | grep -E -q sleep
55831d06c8SNamhyung Kim  then
56831d06c8SNamhyung Kim    echo "Basic off-cpu test [Failed missing output]"
57831d06c8SNamhyung Kim    err=1
58831d06c8SNamhyung Kim    return
59831d06c8SNamhyung Kim  fi
60831d06c8SNamhyung Kim  echo "Basic off-cpu test [Success]"
61831d06c8SNamhyung Kim}
62831d06c8SNamhyung Kim
63ade1d030SNamhyung Kimtest_offcpu_child() {
64ade1d030SNamhyung Kim  echo "Child task off-cpu test"
65ade1d030SNamhyung Kim
66ade1d030SNamhyung Kim  # perf bench sched messaging creates 400 processes
67ade1d030SNamhyung Kim  if ! perf record --off-cpu -e dummy -o ${perfdata} -- \
689835b742SPatrice Duroux    perf bench sched messaging -g 10 > /dev/null 2>&1
69ade1d030SNamhyung Kim  then
70ade1d030SNamhyung Kim    echo "Child task off-cpu test [Failed record]"
71ade1d030SNamhyung Kim    err=1
72ade1d030SNamhyung Kim    return
73ade1d030SNamhyung Kim  fi
74ade1d030SNamhyung Kim  if ! perf evlist -i ${perfdata} | grep -q "offcpu-time"
75ade1d030SNamhyung Kim  then
76ade1d030SNamhyung Kim    echo "Child task off-cpu test [Failed no event]"
77ade1d030SNamhyung Kim    err=1
78ade1d030SNamhyung Kim    return
79ade1d030SNamhyung Kim  fi
80ade1d030SNamhyung Kim  # each process waits for read and write, so it should be more than 800 events
81ade1d030SNamhyung Kim  if ! perf report -i ${perfdata} -s comm -q -n -t ';' --percent-limit=90 | \
82ade1d030SNamhyung Kim    awk -F ";" '{ if (NF > 3 && int($3) < 800) exit 1; }'
83ade1d030SNamhyung Kim  then
84ade1d030SNamhyung Kim    echo "Child task off-cpu test [Failed invalid output]"
85ade1d030SNamhyung Kim    err=1
86ade1d030SNamhyung Kim    return
87ade1d030SNamhyung Kim  fi
88ade1d030SNamhyung Kim  echo "Child task off-cpu test [Success]"
89ade1d030SNamhyung Kim}
90ade1d030SNamhyung Kim
91ade1d030SNamhyung Kim
92ade1d030SNamhyung Kimtest_offcpu_priv
93ade1d030SNamhyung Kim
94ade1d030SNamhyung Kimif [ $err = 0 ]; then
95ade1d030SNamhyung Kim  test_offcpu_basic
96ade1d030SNamhyung Kimfi
97ade1d030SNamhyung Kim
98ade1d030SNamhyung Kimif [ $err = 0 ]; then
99ade1d030SNamhyung Kim  test_offcpu_child
100ade1d030SNamhyung Kimfi
101831d06c8SNamhyung Kim
102831d06c8SNamhyung Kimcleanup
103831d06c8SNamhyung Kimexit $err
104