All of lore.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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.