Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux
1
fork

Configure Feed

Select the types of activity you want to include in your feed.

perf test: Add direct off-cpu tests

Since we added --off-cpu-thresh, add tests for when a sample's off-cpu
time is above the threshold, and when it's below the threshold.

Note that the basic test performed in test_offcpu_basic() collects a
direct sample now, since sleep 1 has duration of 1000ms, higher than the
default value of --off-cpu-thresh of 500ms, resulting in a direct
sample.

An example:

$ sudo perf test offcpu
124: perf record offcpu profiling tests : Ok
$

Committer testing:

root@number:~# perf test offcpu
126: perf record offcpu profiling tests : Ok
root@number:~# perf test -v offcpu
126: perf record offcpu profiling tests : Ok
root@number:~# perf test -vv offcpu
126: perf record offcpu profiling tests:
--- start ---
test child forked, pid 1410791
Checking off-cpu privilege
Basic off-cpu test
Basic off-cpu test [Success]
Child task off-cpu test
Child task off-cpu test [Success]
Threshold test (above threshold)
Threshold test (above threshold) [Success]
Threshold test (below threshold)
Threshold test (below threshold) [Success]
---- end(0) ----
126: perf record offcpu profiling tests : Ok
root@number:~#

Suggested-by: Namhyung Kim <namhyung@kernel.org>
Reviewed-by: Ian Rogers <irogers@google.com>
Signed-off-by: Howard Chu <howardchu95@gmail.com>
Tested-by: Arnaldo Carvalho de Melo <acme@redhat.com>
Tested-by: Gautam Menghani <gautam@linux.ibm.com>
Tested-by: Ian Rogers <irogers@google.com>
Acked-by: Namhyung Kim <namhyung@kernel.org>
Cc: Adrian Hunter <adrian.hunter@intel.com>
Cc: Alexander Shishkin <alexander.shishkin@linux.intel.com>
Cc: Ingo Molnar <mingo@redhat.com>
Cc: Jiri Olsa <jolsa@kernel.org>
Cc: Kan Liang <kan.liang@linux.intel.com>
Cc: Mark Rutland <mark.rutland@arm.com>
Cc: Peter Zijlstra <peterz@infradead.org>
Link: https://lore.kernel.org/r/20250501022809.449767-11-howardchu95@gmail.com
Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>

authored by

Howard Chu and committed by
Arnaldo Carvalho de Melo
8feafba5 9557c000

+71
+71
tools/perf/tests/shell/record_offcpu.sh
··· 7 7 err=0 8 8 perfdata=$(mktemp /tmp/__perf_test.perf.data.XXXXX) 9 9 10 + ts=$(printf "%u" $((~0 << 32))) # OFF_CPU_TIMESTAMP 11 + dummy_timestamp=${ts%???} # remove the last 3 digits to match perf script 12 + 10 13 cleanup() { 11 14 rm -f ${perfdata} 12 15 rm -f ${perfdata}.old ··· 21 18 exit 1 22 19 } 23 20 trap trap_cleanup EXIT TERM INT 21 + 22 + test_above_thresh="Threshold test (above threshold)" 23 + test_below_thresh="Threshold test (below threshold)" 24 24 25 25 test_offcpu_priv() { 26 26 echo "Checking off-cpu privilege" ··· 94 88 echo "Child task off-cpu test [Success]" 95 89 } 96 90 91 + # task blocks longer than the --off-cpu-thresh, perf should collect a direct sample 92 + test_offcpu_above_thresh() { 93 + echo "${test_above_thresh}" 94 + 95 + # collect direct off-cpu samples for tasks blocked for more than 999ms 96 + if ! perf record -e dummy --off-cpu --off-cpu-thresh 999 -o ${perfdata} -- sleep 1 2> /dev/null 97 + then 98 + echo "${test_above_thresh} [Failed record]" 99 + err=1 100 + return 101 + fi 102 + # direct sample's timestamp should be lower than the dummy_timestamp of the at-the-end sample 103 + # check if a direct sample exists 104 + if ! perf script --time "0, ${dummy_timestamp}" -i ${perfdata} -F event | grep -q "offcpu-time" 105 + then 106 + echo "${test_above_thresh} [Failed missing direct samples]" 107 + err=1 108 + return 109 + fi 110 + # there should only be one direct sample, and its period should be higher than off-cpu-thresh 111 + if ! perf script --time "0, ${dummy_timestamp}" -i ${perfdata} -F period | \ 112 + awk '{ if (int($1) > 999000000) exit 0; else exit 1; }' 113 + then 114 + echo "${test_above_thresh} [Failed off-cpu time too short]" 115 + err=1 116 + return 117 + fi 118 + echo "${test_above_thresh} [Success]" 119 + } 120 + 121 + # task blocks shorter than the --off-cpu-thresh, perf should collect an at-the-end sample 122 + test_offcpu_below_thresh() { 123 + echo "${test_below_thresh}" 124 + 125 + # collect direct off-cpu samples for tasks blocked for more than 1.2s 126 + if ! perf record -e dummy --off-cpu --off-cpu-thresh 1200 -o ${perfdata} -- sleep 1 2> /dev/null 127 + then 128 + echo "${test_below_thresh} [Failed record]" 129 + err=1 130 + return 131 + fi 132 + # see if there's an at-the-end sample 133 + if ! perf script --time "${dummy_timestamp}," -i ${perfdata} -F event | grep -q 'offcpu-time' 134 + then 135 + echo "${test_below_thresh} [Failed at-the-end samples cannot be found]" 136 + err=1 137 + return 138 + fi 139 + # plus there shouldn't be any direct samples 140 + if perf script --time "0, ${dummy_timestamp}" -i ${perfdata} -F event | grep -q 'offcpu-time' 141 + then 142 + echo "${test_below_thresh} [Failed direct samples are found when they shouldn't be]" 143 + err=1 144 + return 145 + fi 146 + echo "${test_below_thresh} [Success]" 147 + } 97 148 98 149 test_offcpu_priv 99 150 ··· 160 97 161 98 if [ $err = 0 ]; then 162 99 test_offcpu_child 100 + fi 101 + 102 + if [ $err = 0 ]; then 103 + test_offcpu_above_thresh 104 + fi 105 + 106 + if [ $err = 0 ]; then 107 + test_offcpu_below_thresh 163 108 fi 164 109 165 110 cleanup