]> git.ipfire.org Git - thirdparty/linux.git/commitdiff
perf test workload: Add inlineloop test workload
authorIan Rogers <irogers@google.com>
Sun, 11 Jan 2026 04:13:37 +0000 (20:13 -0800)
committerArnaldo Carvalho de Melo <acme@redhat.com>
Mon, 12 Jan 2026 19:11:15 +0000 (16:11 -0300)
The purpose of this workload is to gather samples in an inlined
function. This can be used to test whether inlined addr2line works
correctly.

Committer testing:

  $ perf record perf test -w inlineloop 1
  [ perf record: Woken up 2 times to write data ]
  [ perf record: Captured and wrote 0.161 MB perf.data (4005 samples) ]
  $ perf report --stdio --dso perf -s srcfile,srcline
  #
  # Total Lost Samples: 0
  #
  # Samples: 4K of event 'cpu/cycles/Pu'
  # Event count (approx.): 5535180842
  #
  # Overhead  Source File   Source:Line
  # ........  ............  ...............
  #
      99.04%  inlineloop.c  inlineloop.c:21
       0.46%  inlineloop.c  inlineloop.c:20
  #
  $

Reviewed-by: James Clark <james.clark@linaro.org>
Signed-off-by: Ian Rogers <irogers@google.com>
Tested-by: Arnaldo Carvalho de Melo <acme@redhat.com>
Cc: Adrian Hunter <adrian.hunter@intel.com>
Cc: Alexander Shishkin <alexander.shishkin@linux.intel.com>
Cc: Howard Chu <howardchu95@gmail.com>
Cc: Ingo Molnar <mingo@redhat.com>
Cc: Jiri Olsa <jolsa@kernel.org>
Cc: Namhyung Kim <namhyung@kernel.org>
Cc: Peter Zijlstra <peterz@infradead.org>
Cc: Stephen Brennan <stephen.s.brennan@oracle.com>
Cc: Tony Jones <tonyj@suse.de>
Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
tools/perf/tests/builtin-test.c
tools/perf/tests/tests.h
tools/perf/tests/workloads/Build
tools/perf/tests/workloads/inlineloop.c [new file with mode: 0644]

index bd6ffa8e4578431adfb9ae9f2bc89085f5679d1a..e2490652f0308196e92cf17b5ec1c9026331ea7f 100644 (file)
@@ -153,6 +153,7 @@ static struct test_workload *workloads[] = {
        &workload__datasym,
        &workload__landlock,
        &workload__traploop,
+       &workload__inlineloop,
 };
 
 #define workloads__for_each(workload) \
index cb67ddbd037535315080ead26b866f9aa04d8f89..1f0f8b267fb1a2fbc64761a75366020a959b34ef 100644 (file)
@@ -240,6 +240,7 @@ DECLARE_WORKLOAD(brstack);
 DECLARE_WORKLOAD(datasym);
 DECLARE_WORKLOAD(landlock);
 DECLARE_WORKLOAD(traploop);
+DECLARE_WORKLOAD(inlineloop);
 
 extern const char *dso_to_test;
 extern const char *test_objdump_path;
index fb1012cc4fc31e2be2950667144c45cb6f247870..866a00bd14a0cf89e612266d45941d66b2b88caf 100644 (file)
@@ -8,9 +8,11 @@ perf-test-y += brstack.o
 perf-test-y += datasym.o
 perf-test-y += landlock.o
 perf-test-y += traploop.o
+perf-test-y += inlineloop.o
 
 CFLAGS_sqrtloop.o         = -g -O0 -fno-inline -U_FORTIFY_SOURCE
 CFLAGS_leafloop.o         = -g -O0 -fno-inline -fno-omit-frame-pointer -U_FORTIFY_SOURCE
 CFLAGS_brstack.o          = -g -O0 -fno-inline -U_FORTIFY_SOURCE
 CFLAGS_datasym.o          = -g -O0 -fno-inline -U_FORTIFY_SOURCE
 CFLAGS_traploop.o         = -g -O0 -fno-inline -U_FORTIFY_SOURCE
+CFLAGS_inlineloop.o       = -g -O2
diff --git a/tools/perf/tests/workloads/inlineloop.c b/tools/perf/tests/workloads/inlineloop.c
new file mode 100644 (file)
index 0000000..bc82dfc
--- /dev/null
@@ -0,0 +1,52 @@
+// SPDX-License-Identifier: GPL-2.0
+#include <pthread.h>
+#include <stdlib.h>
+#include <signal.h>
+#include <unistd.h>
+#include <linux/compiler.h>
+#include "../tests.h"
+
+static volatile int a;
+static volatile sig_atomic_t done;
+
+static void sighandler(int sig __maybe_unused)
+{
+       done = 1;
+}
+
+static inline void __attribute__((always_inline)) leaf(int b)
+{
+again:
+       a += b;
+       if (!done)
+               goto again;
+}
+
+static inline void __attribute__((always_inline)) middle(int b)
+{
+       leaf(b);
+}
+
+static noinline void parent(int b)
+{
+       middle(b);
+}
+
+static int inlineloop(int argc, const char **argv)
+{
+       int sec = 1;
+
+       pthread_setname_np(pthread_self(), "perf-inlineloop");
+       if (argc > 0)
+               sec = atoi(argv[0]);
+
+       signal(SIGINT, sighandler);
+       signal(SIGALRM, sighandler);
+       alarm(sec);
+
+       parent(sec);
+
+       return 0;
+}
+
+DEFINE_WORKLOAD(inlineloop);