public inbox for linux-kernel@vger.kernel.org
 help / color / mirror / Atom feed
* [PATCH] perf test: Add a new shell test for perf ftrace
@ 2024-08-08  4:49 Namhyung Kim
  2024-08-08 13:01 ` Arnaldo Carvalho de Melo
  0 siblings, 1 reply; 2+ messages in thread
From: Namhyung Kim @ 2024-08-08  4:49 UTC (permalink / raw)
  To: Arnaldo Carvalho de Melo, Ian Rogers, Kan Liang
  Cc: Jiri Olsa, Adrian Hunter, Peter Zijlstra, Ingo Molnar, LKML,
	linux-perf-users, Steven Rostedt

  $ sudo ./perf test ftrace -vv
   86: perf ftrace tests:
  --- start ---
  test child forked, pid 1772223
  perf ftrace list test
  syscalls for sleep:
  __x64_sys_nanosleep
  __ia32_sys_nanosleep
  __x64_sys_clock_nanosleep
  __ia32_sys_clock_nanosleep
  perf ftrace list test  [Success]
  perf ftrace trace test
  # tracer: function_graph
  #
  # CPU  DURATION                  FUNCTION CALLS
  # |     |   |                     |   |   |   |
   0)               |  __x64_sys_clock_nanosleep() {
   0)               |    common_nsleep() {
   0)               |      hrtimer_nanosleep() {
   0)               |        do_nanosleep() {
  perf ftrace trace test  [Success]
  perf ftrace latency test
  target function: __x64_sys_clock_nanosleep
  #   DURATION     |      COUNT | GRAPH                                          |
      32 - 64   ms |          1 | ############################################## |
  perf ftrace latency test  [Success]
  perf ftrace profile test
  # Total (us)   Avg (us)   Max (us)      Count   Function
    100136.400 100136.400 100136.400          1   __x64_sys_clock_nanosleep
    100135.200 100135.200 100135.200          1   common_nsleep
    100134.700 100134.700 100134.700          1   hrtimer_nanosleep
    100133.700 100133.700 100133.700          1   do_nanosleep
    100130.600 100130.600 100130.600          1   schedule
       166.868     55.623     80.299          3   scheduler_tick
         5.926      5.926      5.926          1   native_smp_send_reschedule
       301.941    301.941    301.941          1   __x64_sys_execve
       295.786    295.786    295.786          1   do_execveat_common.isra.0
        71.397     35.699     46.403          2   bprm_execve
         2.519      1.260      1.547          2   sched_mm_cid_before_execve
         1.098      0.549      0.686          2   sched_mm_cid_after_execve
  perf ftrace profile test  [Success]
  ---- end(0) ----
   86: perf ftrace tests                                               : Ok

Signed-off-by: Namhyung Kim <namhyung@kernel.org>
---
 tools/perf/tests/shell/ftrace.sh | 84 ++++++++++++++++++++++++++++++++
 1 file changed, 84 insertions(+)
 create mode 100755 tools/perf/tests/shell/ftrace.sh

diff --git a/tools/perf/tests/shell/ftrace.sh b/tools/perf/tests/shell/ftrace.sh
new file mode 100755
index 000000000000..b1c36d30559a
--- /dev/null
+++ b/tools/perf/tests/shell/ftrace.sh
@@ -0,0 +1,84 @@
+#!/bin/sh
+# perf ftrace tests
+# SPDX-License-Identifier: GPL-2.0
+
+set -e
+
+# perf ftrace commands only works for root
+if [ "$(id -u)" != 0 ]; then
+    echo "perf ftrace test  [Skipped: no permission]"
+    exit 2
+fi
+
+output=$(mktemp /tmp/__perf_test.ftrace.XXXXXX)
+
+cleanup() {
+  rm -f "${output}"
+
+  trap - EXIT TERM INT
+}
+
+trap_cleanup() {
+  cleanup
+  exit 1
+}
+trap trap_cleanup EXIT TERM INT
+
+# this will be set in test_ftrace_trace()
+target_function=
+
+test_ftrace_list() {
+    echo "perf ftrace list test"
+    perf ftrace -F > "${output}"
+    # this will be used in test_ftrace_trace()
+    sleep_functions=$(grep 'sys_.*sleep$' "${output}")
+    echo "syscalls for sleep:"
+    echo "${sleep_functions}"
+    echo "perf ftrace list test  [Success]"
+}
+
+test_ftrace_trace() {
+    echo "perf ftrace trace test"
+    perf ftrace trace --graph-opts depth=5 sleep 0.1 > "${output}"
+    # it should have some function name contains 'sleep'
+    grep "^#" "${output}"
+    grep -F 'sleep()' "${output}"
+    # find actual syscall function name
+    for FN in ${sleep_functions}; do
+	if grep -q "${FN}" "${output}"; then
+	    target_function="${FN}"
+	    echo "perf ftrace trace test  [Success]"
+	    return
+	fi
+    done
+
+    echo "perf ftrace trace test  [Failure: sleep syscall not found]"
+    exit 1
+}
+
+test_ftrace_latency() {
+    echo "perf ftrace latency test"
+    echo "target function: ${target_function}"
+    perf ftrace latency -T "${target_function}" sleep 0.1 > "${output}"
+    grep "^#" "${output}"
+    grep "###" "${output}"
+    echo "perf ftrace latency test  [Success]"
+}
+
+test_ftrace_profile() {
+    echo "perf ftrace profile test"
+    perf ftrace profile sleep 0.1 > "${output}"
+    grep ^# "${output}"
+    grep sleep "${output}"
+    grep schedule "${output}"
+    grep execve "${output}"
+    echo "perf ftrace profile test  [Success]"
+}
+
+test_ftrace_list
+test_ftrace_trace
+test_ftrace_latency
+test_ftrace_profile
+
+cleanup
+exit 0
-- 
2.46.0.rc2.264.g509ed76dc8-goog


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

* Re: [PATCH] perf test: Add a new shell test for perf ftrace
  2024-08-08  4:49 [PATCH] perf test: Add a new shell test for perf ftrace Namhyung Kim
@ 2024-08-08 13:01 ` Arnaldo Carvalho de Melo
  0 siblings, 0 replies; 2+ messages in thread
From: Arnaldo Carvalho de Melo @ 2024-08-08 13:01 UTC (permalink / raw)
  To: Namhyung Kim
  Cc: Ian Rogers, Kan Liang, Jiri Olsa, Adrian Hunter, Peter Zijlstra,
	Ingo Molnar, LKML, linux-perf-users, Steven Rostedt

On Wed, Aug 07, 2024 at 09:49:54PM -0700, Namhyung Kim wrote:
>   $ sudo ./perf test ftrace -vv
>    86: perf ftrace tests:
>   --- start ---
>   test child forked, pid 1772223
>   perf ftrace list test
>   syscalls for sleep:
>   __x64_sys_nanosleep
>   __ia32_sys_nanosleep
>   __x64_sys_clock_nanosleep
>   __ia32_sys_clock_nanosleep
>   perf ftrace list test  [Success]
>   perf ftrace trace test
>   # tracer: function_graph
>   #
>   # CPU  DURATION                  FUNCTION CALLS
>   # |     |   |                     |   |   |   |
>    0)               |  __x64_sys_clock_nanosleep() {
>    0)               |    common_nsleep() {
>    0)               |      hrtimer_nanosleep() {
>    0)               |        do_nanosleep() {
>   perf ftrace trace test  [Success]
>   perf ftrace latency test
>   target function: __x64_sys_clock_nanosleep
>   #   DURATION     |      COUNT | GRAPH                                          |
>       32 - 64   ms |          1 | ############################################## |
>   perf ftrace latency test  [Success]
>   perf ftrace profile test
>   # Total (us)   Avg (us)   Max (us)      Count   Function
>     100136.400 100136.400 100136.400          1   __x64_sys_clock_nanosleep
>     100135.200 100135.200 100135.200          1   common_nsleep
>     100134.700 100134.700 100134.700          1   hrtimer_nanosleep
>     100133.700 100133.700 100133.700          1   do_nanosleep
>     100130.600 100130.600 100130.600          1   schedule
>        166.868     55.623     80.299          3   scheduler_tick
>          5.926      5.926      5.926          1   native_smp_send_reschedule
>        301.941    301.941    301.941          1   __x64_sys_execve
>        295.786    295.786    295.786          1   do_execveat_common.isra.0
>         71.397     35.699     46.403          2   bprm_execve
>          2.519      1.260      1.547          2   sched_mm_cid_before_execve
>          1.098      0.549      0.686          2   sched_mm_cid_after_execve
>   perf ftrace profile test  [Success]
>   ---- end(0) ----
>    86: perf ftrace tests                                               : Ok
> 
> Signed-off-by: Namhyung Kim <namhyung@kernel.org>
> ---
>  tools/perf/tests/shell/ftrace.sh | 84 ++++++++++++++++++++++++++++++++
>  1 file changed, 84 insertions(+)
>  create mode 100755 tools/perf/tests/shell/ftrace.sh
> 
> diff --git a/tools/perf/tests/shell/ftrace.sh b/tools/perf/tests/shell/ftrace.sh
> new file mode 100755
> index 000000000000..b1c36d30559a
> --- /dev/null
> +++ b/tools/perf/tests/shell/ftrace.sh
> @@ -0,0 +1,84 @@
> +#!/bin/sh
> +# perf ftrace tests
> +# SPDX-License-Identifier: GPL-2.0
> +
> +set -e
> +
> +# perf ftrace commands only works for root
> +if [ "$(id -u)" != 0 ]; then
> +    echo "perf ftrace test  [Skipped: no permission]"
> +    exit 2
> +fi
> +
> +output=$(mktemp /tmp/__perf_test.ftrace.XXXXXX)
> +
> +cleanup() {
> +  rm -f "${output}"
> +
> +  trap - EXIT TERM INT
> +}
> +
> +trap_cleanup() {
> +  cleanup
> +  exit 1
> +}
> +trap trap_cleanup EXIT TERM INT
> +
> +# this will be set in test_ftrace_trace()
> +target_function=
> +
> +test_ftrace_list() {
> +    echo "perf ftrace list test"
> +    perf ftrace -F > "${output}"
> +    # this will be used in test_ftrace_trace()
> +    sleep_functions=$(grep 'sys_.*sleep$' "${output}")
> +    echo "syscalls for sleep:"
> +    echo "${sleep_functions}"
> +    echo "perf ftrace list test  [Success]"
> +}
> +
> +test_ftrace_trace() {
> +    echo "perf ftrace trace test"
> +    perf ftrace trace --graph-opts depth=5 sleep 0.1 > "${output}"
> +    # it should have some function name contains 'sleep'
> +    grep "^#" "${output}"
> +    grep -F 'sleep()' "${output}"
> +    # find actual syscall function name
> +    for FN in ${sleep_functions}; do
> +	if grep -q "${FN}" "${output}"; then
> +	    target_function="${FN}"
> +	    echo "perf ftrace trace test  [Success]"
> +	    return
> +	fi
> +    done
> +
> +    echo "perf ftrace trace test  [Failure: sleep syscall not found]"
> +    exit 1
> +}
> +
> +test_ftrace_latency() {
> +    echo "perf ftrace latency test"
> +    echo "target function: ${target_function}"
> +    perf ftrace latency -T "${target_function}" sleep 0.1 > "${output}"
> +    grep "^#" "${output}"
> +    grep "###" "${output}"
> +    echo "perf ftrace latency test  [Success]"
> +}
> +
> +test_ftrace_profile() {
> +    echo "perf ftrace profile test"
> +    perf ftrace profile sleep 0.1 > "${output}"
> +    grep ^# "${output}"
> +    grep sleep "${output}"
> +    grep schedule "${output}"
> +    grep execve "${output}"
> +    echo "perf ftrace profile test  [Success]"
> +}

I think this will cover the problem I reported to you, i.e. strange
times:

root@x1:~# perf ftrace profile sleep 1s > a
root@x1:~# time_re="[[:space:]]+100[[:digit:]]{4}\.[[:digit:]]{3}"
root@x1:~# grep -E "^${time_re}${time_re}${time_re}[[:space:]]+1[[:space:]]+.*clock_nanosleep" a
 1000171.000 1000171.000 1000171.000          1   __x64_sys_clock_nanosleep
root@x1:~#

I.e. we know that we will have just one call to *clock_nanosleep and
that it will take a bit more than 1 second (100 followed by 4 digits to
get to something like 1000171).

So I cooked up the following patch, on top of yours, I tested it
replacing the '10' in the time_re with 20 and it fails, with '10', as
expected, it passes.

- Arnaldo

diff --git a/tools/perf/tests/shell/ftrace.sh b/tools/perf/tests/shell/ftrace.sh
index b1c36d30559a900a..a6ee740f0d7eca07 100755
--- a/tools/perf/tests/shell/ftrace.sh
+++ b/tools/perf/tests/shell/ftrace.sh
@@ -72,6 +72,11 @@ test_ftrace_profile() {
     grep sleep "${output}"
     grep schedule "${output}"
     grep execve "${output}"
+    time_re="[[:space:]]+10[[:digit:]]{4}\.[[:digit:]]{3}"
+    # 100283.000 100283.000 100283.000          1   __x64_sys_clock_nanosleep
+    # Check for one *clock_nanosleep line with a Count of just 1 that takes a bit more than 0.1 seconds
+    # Strip the _x64_sys part to work with other architectures
+    grep -E "^${time_re}${time_re}${time_re}[[:space:]]+1[[:space:]]+.*clock_nanosleep" "${output}"
     echo "perf ftrace profile test  [Success]"
 }
 

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

end of thread, other threads:[~2024-08-08 13:01 UTC | newest]

Thread overview: 2+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2024-08-08  4:49 [PATCH] perf test: Add a new shell test for perf ftrace Namhyung Kim
2024-08-08 13:01 ` Arnaldo Carvalho de Melo

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox