This patch set is to add a test for java symbol.
To allow a shell script to know the installed lib path, we need to
export the environment variable "PREFIX" in the C code. We use the
first patch for this purpose. The second patch introduces the java
symbol testing.
The test has been verified on x86_64 machine with perf/core branch with
the latest commit 62e64c9d2fd1 ("perf test: Add basic core_wide
expression test").
Changes from v2:
- Skipped test if jshell is not existed (Namhyung);
- Fixed a typo for s/if/elif/ (Namhyung).
Changes from v1:
- Added Ian's suggested tag;
- Added the search folder for the system lib libperf-jvmti.so;
- Skip the test if fail to find jvmti lib.
Leo Yan (2):
perf subcmd: Set environment variable "PREFIX"
perf test: Introduce script for java symbol testing
tools/lib/subcmd/exec-cmd.c | 3 +
tools/perf/tests/shell/test_java_symbol.sh | 75 ++++++++++++++++++++++
2 files changed, 78 insertions(+)
create mode 100755 tools/perf/tests/shell/test_java_symbol.sh
--
2.34.1
Set environment variable "PREFIX", it will be used by invoked shell
script, e.g. the shell script uses it to find lib paths.
Signed-off-by: Leo Yan <[email protected]>
---
tools/lib/subcmd/exec-cmd.c | 3 +++
1 file changed, 3 insertions(+)
diff --git a/tools/lib/subcmd/exec-cmd.c b/tools/lib/subcmd/exec-cmd.c
index 33e94fb83986..5dbea456973e 100644
--- a/tools/lib/subcmd/exec-cmd.c
+++ b/tools/lib/subcmd/exec-cmd.c
@@ -24,6 +24,9 @@ void exec_cmd_init(const char *exec_name, const char *prefix,
subcmd_config.prefix = prefix;
subcmd_config.exec_path = exec_path;
subcmd_config.exec_path_env = exec_path_env;
+
+ /* Setup environment variable for invoked shell script. */
+ setenv("PREFIX", prefix, 1);
}
#define is_dir_sep(c) ((c) == '/')
--
2.34.1
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 <[email protected]>
Signed-off-by: Leo Yan <[email protected]>
---
tools/perf/tests/shell/test_java_symbol.sh | 75 ++++++++++++++++++++++
1 file changed, 75 insertions(+)
create mode 100755 tools/perf/tests/shell/test_java_symbol.sh
diff --git a/tools/perf/tests/shell/test_java_symbol.sh b/tools/perf/tests/shell/test_java_symbol.sh
new file mode 100755
index 000000000000..f221225808a3
--- /dev/null
+++ b/tools/perf/tests/shell/test_java_symbol.sh
@@ -0,0 +1,75 @@
+#!/bin/bash
+# Test java symbol
+
+# SPDX-License-Identifier: GPL-2.0
+# Leo Yan <[email protected]>, 2022
+
+# skip if there's no jshell
+if ! [ -x "$(command -v jshell)" ]; then
+ echo "skip: no jshell, install JDK"
+ exit 2
+fi
+
+PERF_DATA=$(mktemp /tmp/__perf_test.perf.data.XXXXX)
+PERF_INJ_DATA=$(mktemp /tmp/__perf_test.perf.data.inj.XXXXX)
+
+cleanup_files()
+{
+ echo "Cleaning up files..."
+ rm -f ${PERF_DATA}
+ rm -f ${PERF_INJ_DATA}
+}
+
+trap cleanup_files exit term int
+
+if [ -e "$PWD/tools/perf/libperf-jvmti.so" ]; then
+ LIBJVMTI=$PWD/tools/perf/libperf-jvmti.so
+elif [ -e "$PWD/libperf-jvmti.so" ]; then
+ LIBJVMTI=$PWD/libperf-jvmti.so
+elif [ -e "$PREFIX/lib64/libperf-jvmti.so" ]; then
+ LIBJVMTI=$PREFIX/lib64/libperf-jvmti.so
+elif [ -e "$PREFIX/lib/libperf-jvmti.so" ]; then
+ LIBJVMTI=$PREFIX/lib/libperf-jvmti.so
+elif [ -e "/usr/lib/linux-tools-$(uname -a | awk '{ print $3 }' | sed -r 's/-generic//')/libperf-jvmti.so" ]; then
+ LIBJVMTI=/usr/lib/linux-tools-$(uname -a | awk '{ print $3 }' | sed -r 's/-generic//')/libperf-jvmti.so
+else
+ echo "Fail to find libperf-jvmti.so"
+ # JVMTI is a build option, skip the test if fail to find lib
+ exit 2
+fi
+
+cat <<EOF | perf record -k 1 -o $PERF_DATA jshell -s -J-agentpath:$LIBJVMTI
+int fib(int x) {
+ return x > 1 ? fib(x - 2) + fib(x - 1) : 1;
+}
+
+int q = 0;
+
+for (int i = 0; i < 10; i++)
+ q += fib(i);
+
+System.out.println(q);
+EOF
+
+if [ $? -ne 0 ]; then
+ echo "Fail to record for java program"
+ exit 1
+fi
+
+if ! perf inject -i $PERF_DATA -o $PERF_INJ_DATA -j; then
+ echo "Fail to inject samples"
+ exit 1
+fi
+
+# Below is an example of the instruction samples reporting:
+# 8.18% jshell jitted-50116-29.so [.] Interpreter
+# 0.75% Thread-1 jitted-83602-1670.so [.] jdk.internal.jimage.BasicImageReader.getString(int)
+perf report --stdio -i ${PERF_INJ_DATA} 2>&1 | \
+ egrep " +[0-9]+\.[0-9]+% .* (Interpreter|jdk\.internal).*" > /dev/null 2>&1
+
+if [ $? -ne 0 ]; then
+ echo "Fail to find java symbols"
+ exit 1
+fi
+
+exit 0
--
2.34.1
Em Sun, Sep 25, 2022 at 10:58:33AM +0800, Leo Yan escreveu:
> This patch set is to add a test for java symbol.
>
> To allow a shell script to know the installed lib path, we need to
> export the environment variable "PREFIX" in the C code. We use the
> first patch for this purpose. The second patch introduces the java
> symbol testing.
>
> The test has been verified on x86_64 machine with perf/core branch with
> the latest commit 62e64c9d2fd1 ("perf test: Add basic core_wide
> expression test").
Thanks, applied locally.
- Arnaldo
> Changes from v2:
> - Skipped test if jshell is not existed (Namhyung);
> - Fixed a typo for s/if/elif/ (Namhyung).
>
> Changes from v1:
> - Added Ian's suggested tag;
> - Added the search folder for the system lib libperf-jvmti.so;
> - Skip the test if fail to find jvmti lib.
>
>
> Leo Yan (2):
> perf subcmd: Set environment variable "PREFIX"
> perf test: Introduce script for java symbol testing
>
> tools/lib/subcmd/exec-cmd.c | 3 +
> tools/perf/tests/shell/test_java_symbol.sh | 75 ++++++++++++++++++++++
> 2 files changed, 78 insertions(+)
> create mode 100755 tools/perf/tests/shell/test_java_symbol.sh
>
> --
> 2.34.1
--
- Arnaldo