xref: /linux/tools/perf/tests/workloads/inlineloop.c (revision bf4afc53b77aeaa48b5409da5c8da6bb4eff7f43)
1 // SPDX-License-Identifier: GPL-2.0
2 #include <pthread.h>
3 #include <stdlib.h>
4 #include <signal.h>
5 #include <unistd.h>
6 #include <linux/compiler.h>
7 #include "../tests.h"
8 
9 static volatile int a;
10 static volatile sig_atomic_t done;
11 
12 static void sighandler(int sig __maybe_unused)
13 {
14 	done = 1;
15 }
16 
17 static inline void __attribute__((always_inline)) leaf(int b)
18 {
19 again:
20 	a += b;
21 	if (!done)
22 		goto again;
23 }
24 
25 static inline void __attribute__((always_inline)) middle(int b)
26 {
27 	leaf(b);
28 }
29 
30 static noinline void parent(int b)
31 {
32 	middle(b);
33 }
34 
35 static int inlineloop(int argc, const char **argv)
36 {
37 	int sec = 1;
38 
39 	pthread_setname_np(pthread_self(), "perf-inlineloop");
40 	if (argc > 0)
41 		sec = atoi(argv[0]);
42 
43 	signal(SIGINT, sighandler);
44 	signal(SIGALRM, sighandler);
45 	alarm(sec);
46 
47 	parent(sec);
48 
49 	return 0;
50 }
51 
52 DEFINE_WORKLOAD(inlineloop);
53