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

perf test: Introduce script for java symbol testing

This commit introduces a script for testing java symbols.

The test records java program, inject samples with JIT samples, check
specific JIT symbols in the report, the test will pass only when these
two symbols are detected.

Suggested-by: Ian Rogers <irogers@google.com>
Signed-off-by: Leo Yan <leo.yan@linaro.org>
Cc: Alexander Shishkin <alexander.shishkin@linux.intel.com>
Cc: Ingo Molnar <mingo@redhat.com>
Cc: Jiri Olsa <jolsa@kernel.org>
Cc: Mark Rutland <mark.rutland@arm.com>
Cc: Namhyung Kim <namhyung@kernel.org>
Cc: Peter Zijlstra <peterz@infradead.org>
Link: https://lore.kernel.org/r/20220925025835.70364-3-leo.yan@linaro.org
Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>

authored by

Leo Yan and committed by
Arnaldo Carvalho de Melo
1dc86fc7 05844393

+75
+75
tools/perf/tests/shell/test_java_symbol.sh
··· 1 + #!/bin/bash 2 + # Test java symbol 3 + 4 + # SPDX-License-Identifier: GPL-2.0 5 + # Leo Yan <leo.yan@linaro.org>, 2022 6 + 7 + # skip if there's no jshell 8 + if ! [ -x "$(command -v jshell)" ]; then 9 + echo "skip: no jshell, install JDK" 10 + exit 2 11 + fi 12 + 13 + PERF_DATA=$(mktemp /tmp/__perf_test.perf.data.XXXXX) 14 + PERF_INJ_DATA=$(mktemp /tmp/__perf_test.perf.data.inj.XXXXX) 15 + 16 + cleanup_files() 17 + { 18 + echo "Cleaning up files..." 19 + rm -f ${PERF_DATA} 20 + rm -f ${PERF_INJ_DATA} 21 + } 22 + 23 + trap cleanup_files exit term int 24 + 25 + if [ -e "$PWD/tools/perf/libperf-jvmti.so" ]; then 26 + LIBJVMTI=$PWD/tools/perf/libperf-jvmti.so 27 + elif [ -e "$PWD/libperf-jvmti.so" ]; then 28 + LIBJVMTI=$PWD/libperf-jvmti.so 29 + elif [ -e "$PREFIX/lib64/libperf-jvmti.so" ]; then 30 + LIBJVMTI=$PREFIX/lib64/libperf-jvmti.so 31 + elif [ -e "$PREFIX/lib/libperf-jvmti.so" ]; then 32 + LIBJVMTI=$PREFIX/lib/libperf-jvmti.so 33 + elif [ -e "/usr/lib/linux-tools-$(uname -a | awk '{ print $3 }' | sed -r 's/-generic//')/libperf-jvmti.so" ]; then 34 + LIBJVMTI=/usr/lib/linux-tools-$(uname -a | awk '{ print $3 }' | sed -r 's/-generic//')/libperf-jvmti.so 35 + else 36 + echo "Fail to find libperf-jvmti.so" 37 + # JVMTI is a build option, skip the test if fail to find lib 38 + exit 2 39 + fi 40 + 41 + cat <<EOF | perf record -k 1 -o $PERF_DATA jshell -s -J-agentpath:$LIBJVMTI 42 + int fib(int x) { 43 + return x > 1 ? fib(x - 2) + fib(x - 1) : 1; 44 + } 45 + 46 + int q = 0; 47 + 48 + for (int i = 0; i < 10; i++) 49 + q += fib(i); 50 + 51 + System.out.println(q); 52 + EOF 53 + 54 + if [ $? -ne 0 ]; then 55 + echo "Fail to record for java program" 56 + exit 1 57 + fi 58 + 59 + if ! perf inject -i $PERF_DATA -o $PERF_INJ_DATA -j; then 60 + echo "Fail to inject samples" 61 + exit 1 62 + fi 63 + 64 + # Below is an example of the instruction samples reporting: 65 + # 8.18% jshell jitted-50116-29.so [.] Interpreter 66 + # 0.75% Thread-1 jitted-83602-1670.so [.] jdk.internal.jimage.BasicImageReader.getString(int) 67 + perf report --stdio -i ${PERF_INJ_DATA} 2>&1 | \ 68 + egrep " +[0-9]+\.[0-9]+% .* (Interpreter|jdk\.internal).*" > /dev/null 2>&1 69 + 70 + if [ $? -ne 0 ]; then 71 + echo "Fail to find java symbols" 72 + exit 1 73 + fi 74 + 75 + exit 0