[PATCH 2/6] perf test: Use a test program in perf record tests

From: Namhyung Kim
Date: Wed Sep 07 2022 - 02:47:08 EST


If the system has cc it could build a test program with two threads
and then use it for more detailed testing. Also it adds initial delay
of 3ms to profile a multi-threaded target. This change make the test
failing but that's what we want to check for now.

If cc is not found, it falls back to use the default value 'true'.

Signed-off-by: Namhyung Kim <namhyung@xxxxxxxxxx>
---
tools/perf/tests/shell/record.sh | 58 +++++++++++++++++++++++++++++---
1 file changed, 54 insertions(+), 4 deletions(-)

diff --git a/tools/perf/tests/shell/record.sh b/tools/perf/tests/shell/record.sh
index 40b087bfdb76..cea3c7b7e2cd 100755
--- a/tools/perf/tests/shell/record.sh
+++ b/tools/perf/tests/shell/record.sh
@@ -6,10 +6,18 @@ set -e

err=0
perfdata=$(mktemp /tmp/__perf_test.perf.data.XXXXX)
+testprog=$(mktemp /tmp/__perf_test.prog.XXXXXX)
+testsym="test_loop"
+testopt="-D 3"

cleanup() {
rm -f ${perfdata}
rm -f ${perfdata}.old
+
+ if [ "${testprog}" != "true" ]; then
+ rm -f ${testprog}
+ fi
+
trap - exit term int
}

@@ -19,9 +27,49 @@ trap_cleanup() {
}
trap trap_cleanup exit term int

+build_test_program() {
+ if ! [ -x "$(command -v cc)" ]; then
+ # No CC found. Fall back to 'true'
+ testprog=true
+ testsym=true
+ testopt=''
+ return
+ fi
+
+ echo "Build a test program"
+ cat <<EOF | cc -o ${testprog} -xc - -pthread
+#include <stdio.h>
+#include <unistd.h>
+#include <pthread.h>
+
+void test_loop(void) {
+ volatile int count = 1000000;
+
+ // wait for perf record
+ usleep(5000);
+
+ while (count--)
+ continue;
+}
+
+void *thfunc(void *arg) {
+ test_loop();
+ return NULL;
+}
+
+int main(void) {
+ pthread_t th;
+ pthread_create(&th, NULL, thfunc, NULL);
+ test_loop();
+ pthread_join(th, NULL);
+ return 0;
+}
+EOF
+}
+
test_per_thread() {
echo "Basic --per-thread mode test"
- if ! perf record -o /dev/null --quiet true 2> /dev/null
+ if ! perf record -o /dev/null --quiet ${testprog} 2> /dev/null
then
echo "Per-thread record [Skipped event not supported]"
if [ $err -ne 1 ]
@@ -30,13 +78,13 @@ test_per_thread() {
fi
return
fi
- if ! perf record --per-thread -o ${perfdata} true 2> /dev/null
+ if ! perf record --per-thread ${testopt} -o ${perfdata} ${testprog} 2> /dev/null
then
echo "Per-thread record [Failed record]"
err=1
return
fi
- if ! perf report -i ${perfdata} -q | egrep -q true
+ if ! perf report -i ${perfdata} -q | egrep -q ${testsym}
then
echo "Per-thread record [Failed missing output]"
err=1
@@ -62,7 +110,7 @@ test_register_capture() {
return
fi
if ! perf record -o - --intr-regs=di,r8,dx,cx -e cpu/br_inst_retired.near_call/p \
- -c 1000 --per-thread true 2> /dev/null \
+ -c 1000 --per-thread ${testopt} ${testprog} 2> /dev/null \
| perf script -F ip,sym,iregs -i - 2> /dev/null \
| egrep -q "DI:"
then
@@ -73,6 +121,8 @@ test_register_capture() {
echo "Register capture test [Success]"
}

+build_test_program
+
test_per_thread
test_register_capture

--
2.37.2.789.g6183377224-goog