linux-perf-users.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* [PATCH v2 0/2] perf test: Add test for java symbol
@ 2022-09-18  3:15 Leo Yan
  2022-09-18  3:15 ` [PATCH v2 1/2] perf subcmd: Set environment variable "PREFIX" Leo Yan
  2022-09-18  3:15 ` [PATCH v2 2/2] perf test: Introduce script for java symbol testing Leo Yan
  0 siblings, 2 replies; 5+ messages in thread
From: Leo Yan @ 2022-09-18  3:15 UTC (permalink / raw)
  To: Arnaldo Carvalho de Melo, Peter Zijlstra, Ingo Molnar,
	Mark Rutland, Alexander Shishkin, Jiri Olsa, Namhyung Kim,
	linux-kernel, linux-perf-users
  Cc: Leo Yan

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 mainline kernel, with
the latest commit 62e64c9d2fd1 ("perf test: Add basic core_wide
expression test").

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 | 69 ++++++++++++++++++++++
 2 files changed, 72 insertions(+)
 create mode 100755 tools/perf/tests/shell/test_java_symbol.sh

-- 
2.34.1


^ permalink raw reply	[flat|nested] 5+ messages in thread

* [PATCH v2 1/2] perf subcmd: Set environment variable "PREFIX"
  2022-09-18  3:15 [PATCH v2 0/2] perf test: Add test for java symbol Leo Yan
@ 2022-09-18  3:15 ` Leo Yan
  2022-09-18  3:15 ` [PATCH v2 2/2] perf test: Introduce script for java symbol testing Leo Yan
  1 sibling, 0 replies; 5+ messages in thread
From: Leo Yan @ 2022-09-18  3:15 UTC (permalink / raw)
  To: Arnaldo Carvalho de Melo, Peter Zijlstra, Ingo Molnar,
	Mark Rutland, Alexander Shishkin, Jiri Olsa, Namhyung Kim,
	linux-kernel, linux-perf-users
  Cc: Leo Yan

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 <leo.yan@linaro.org>
---
 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


^ permalink raw reply related	[flat|nested] 5+ messages in thread

* [PATCH v2 2/2] perf test: Introduce script for java symbol testing
  2022-09-18  3:15 [PATCH v2 0/2] perf test: Add test for java symbol Leo Yan
  2022-09-18  3:15 ` [PATCH v2 1/2] perf subcmd: Set environment variable "PREFIX" Leo Yan
@ 2022-09-18  3:15 ` Leo Yan
  2022-09-20 21:47   ` Namhyung Kim
  1 sibling, 1 reply; 5+ messages in thread
From: Leo Yan @ 2022-09-18  3:15 UTC (permalink / raw)
  To: Arnaldo Carvalho de Melo, Peter Zijlstra, Ingo Molnar,
	Mark Rutland, Alexander Shishkin, Jiri Olsa, Namhyung Kim,
	linux-kernel, linux-perf-users
  Cc: Leo Yan, Ian Rogers

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>
---
 tools/perf/tests/shell/test_java_symbol.sh | 69 ++++++++++++++++++++++
 1 file changed, 69 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..d96fea405ea9
--- /dev/null
+++ b/tools/perf/tests/shell/test_java_symbol.sh
@@ -0,0 +1,69 @@
+#!/bin/bash
+# Test java symbol
+
+# SPDX-License-Identifier: GPL-2.0
+# Leo Yan <leo.yan@linaro.org>, 2022
+
+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
+if [ -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


^ permalink raw reply related	[flat|nested] 5+ messages in thread

* Re: [PATCH v2 2/2] perf test: Introduce script for java symbol testing
  2022-09-18  3:15 ` [PATCH v2 2/2] perf test: Introduce script for java symbol testing Leo Yan
@ 2022-09-20 21:47   ` Namhyung Kim
  2022-09-21  1:33     ` Leo Yan
  0 siblings, 1 reply; 5+ messages in thread
From: Namhyung Kim @ 2022-09-20 21:47 UTC (permalink / raw)
  To: Leo Yan
  Cc: Arnaldo Carvalho de Melo, Peter Zijlstra, Ingo Molnar,
	Mark Rutland, Alexander Shishkin, Jiri Olsa, linux-kernel,
	linux-perf-users, Ian Rogers

Hi Leo,

On Sat, Sep 17, 2022 at 8:15 PM Leo Yan <leo.yan@linaro.org> wrote:
>
> 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>
> ---
>  tools/perf/tests/shell/test_java_symbol.sh | 69 ++++++++++++++++++++++
>  1 file changed, 69 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..d96fea405ea9
> --- /dev/null
> +++ b/tools/perf/tests/shell/test_java_symbol.sh
> @@ -0,0 +1,69 @@
> +#!/bin/bash
> +# Test java symbol
> +
> +# SPDX-License-Identifier: GPL-2.0
> +# Leo Yan <leo.yan@linaro.org>, 2022
> +
> +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
> +if [ -e "/usr/lib/linux-tools-$(uname -a | awk '{ print $3 }' | sed -r 's/-generic//')/libperf-jvmti.so" ]; then

s/if/elif/ ?

> +       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

Wouldn't it check if jshell is available first?

Thanks,
Namhyung


> +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
>

^ permalink raw reply	[flat|nested] 5+ messages in thread

* Re: [PATCH v2 2/2] perf test: Introduce script for java symbol testing
  2022-09-20 21:47   ` Namhyung Kim
@ 2022-09-21  1:33     ` Leo Yan
  0 siblings, 0 replies; 5+ messages in thread
From: Leo Yan @ 2022-09-21  1:33 UTC (permalink / raw)
  To: Namhyung Kim
  Cc: Arnaldo Carvalho de Melo, Peter Zijlstra, Ingo Molnar,
	Mark Rutland, Alexander Shishkin, Jiri Olsa, linux-kernel,
	linux-perf-users, Ian Rogers

Hi Namhyung,

On Tue, Sep 20, 2022 at 02:47:05PM -0700, Namhyung Kim wrote:

[...]

> > +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
> > +if [ -e "/usr/lib/linux-tools-$(uname -a | awk '{ print $3 }' | sed -r 's/-generic//')/libperf-jvmti.so" ]; then
> 
> s/if/elif/ ?

Ouch, will fix.

> > +       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
> 
> Wouldn't it check if jshell is available first?

Indeed.  Will check jshell and skip the testing if jshell doesn't
exist.

Thanks for reviewing.

Leo

^ permalink raw reply	[flat|nested] 5+ messages in thread

end of thread, other threads:[~2022-09-21  1:33 UTC | newest]

Thread overview: 5+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2022-09-18  3:15 [PATCH v2 0/2] perf test: Add test for java symbol Leo Yan
2022-09-18  3:15 ` [PATCH v2 1/2] perf subcmd: Set environment variable "PREFIX" Leo Yan
2022-09-18  3:15 ` [PATCH v2 2/2] perf test: Introduce script for java symbol testing Leo Yan
2022-09-20 21:47   ` Namhyung Kim
2022-09-21  1:33     ` Leo Yan

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).