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 sig_atomic_t done;
10 static volatile unsigned count;
11
12 /* We want to check this symbol in perf report */
13 noinline void test_loop(void);
14
sighandler(int sig __maybe_unused)15 static void sighandler(int sig __maybe_unused)
16 {
17 done = 1;
18 }
19
test_loop(void)20 noinline void test_loop(void)
21 {
22 while (!done)
23 __atomic_fetch_add(&count, 1, __ATOMIC_RELAXED);
24 }
25
thfunc(void * arg)26 static void *thfunc(void *arg)
27 {
28 void (*loop_fn)(void) = arg;
29
30 loop_fn();
31 return NULL;
32 }
33
thloop(int argc,const char ** argv)34 static int thloop(int argc, const char **argv)
35 {
36 int sec = 1;
37 pthread_t th;
38
39 if (argc > 0)
40 sec = atoi(argv[0]);
41
42 signal(SIGINT, sighandler);
43 signal(SIGALRM, sighandler);
44 alarm(sec);
45
46 pthread_create(&th, NULL, thfunc, test_loop);
47 test_loop();
48 pthread_join(th, NULL);
49
50 return 0;
51 }
52
53 DEFINE_WORKLOAD(thloop);
54