mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
synced 2026-04-05 00:04:34 -04:00
perf test workload: Add inlineloop test workload
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>
This commit is contained in:
committed by
Arnaldo Carvalho de Melo
parent
f815fc0c66
commit
27fc6f565d
@@ -153,6 +153,7 @@ static struct test_workload *workloads[] = {
|
||||
&workload__datasym,
|
||||
&workload__landlock,
|
||||
&workload__traploop,
|
||||
&workload__inlineloop,
|
||||
};
|
||||
|
||||
#define workloads__for_each(workload) \
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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
|
||||
|
||||
52
tools/perf/tests/workloads/inlineloop.c
Normal file
52
tools/perf/tests/workloads/inlineloop.c
Normal file
@@ -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);
|
||||
Reference in New Issue
Block a user