aboutsummaryrefslogtreecommitdiffstats
path: root/tools/perf
diff options
context:
space:
mode:
Diffstat (limited to 'tools/perf')
-rw-r--r--tools/perf/Makefile1
-rw-r--r--tools/perf/tests/builtin-test.c4
-rw-r--r--tools/perf/tests/sw-clock.c119
-rw-r--r--tools/perf/tests/tests.h1
4 files changed, 125 insertions, 0 deletions
diff --git a/tools/perf/Makefile b/tools/perf/Makefile
index 8e1bba35a1ee..0230b75ed7f9 100644
--- a/tools/perf/Makefile
+++ b/tools/perf/Makefile
@@ -514,6 +514,7 @@ LIB_OBJS += $(OUTPUT)tests/python-use.o
514LIB_OBJS += $(OUTPUT)tests/bp_signal.o 514LIB_OBJS += $(OUTPUT)tests/bp_signal.o
515LIB_OBJS += $(OUTPUT)tests/bp_signal_overflow.o 515LIB_OBJS += $(OUTPUT)tests/bp_signal_overflow.o
516LIB_OBJS += $(OUTPUT)tests/task-exit.o 516LIB_OBJS += $(OUTPUT)tests/task-exit.o
517LIB_OBJS += $(OUTPUT)tests/sw-clock.o
517 518
518BUILTIN_OBJS += $(OUTPUT)builtin-annotate.o 519BUILTIN_OBJS += $(OUTPUT)builtin-annotate.o
519BUILTIN_OBJS += $(OUTPUT)builtin-bench.o 520BUILTIN_OBJS += $(OUTPUT)builtin-bench.o
diff --git a/tools/perf/tests/builtin-test.c b/tools/perf/tests/builtin-test.c
index 9b5c70a180d2..0918ada4cc41 100644
--- a/tools/perf/tests/builtin-test.c
+++ b/tools/perf/tests/builtin-test.c
@@ -90,6 +90,10 @@ static struct test {
90 .func = test__task_exit, 90 .func = test__task_exit,
91 }, 91 },
92 { 92 {
93 .desc = "Test software clock events have valid period values",
94 .func = test__sw_clock_freq,
95 },
96 {
93 .func = NULL, 97 .func = NULL,
94 }, 98 },
95}; 99};
diff --git a/tools/perf/tests/sw-clock.c b/tools/perf/tests/sw-clock.c
new file mode 100644
index 000000000000..2e41e2d32ccc
--- /dev/null
+++ b/tools/perf/tests/sw-clock.c
@@ -0,0 +1,119 @@
1#include <unistd.h>
2#include <stdlib.h>
3#include <signal.h>
4#include <sys/mman.h>
5
6#include "tests.h"
7#include "util/evsel.h"
8#include "util/evlist.h"
9#include "util/cpumap.h"
10#include "util/thread_map.h"
11
12#define NR_LOOPS 1000000
13
14/*
15 * This test will open software clock events (cpu-clock, task-clock)
16 * then check their frequency -> period conversion has no artifact of
17 * setting period to 1 forcefully.
18 */
19static int __test__sw_clock_freq(enum perf_sw_ids clock_id)
20{
21 int i, err = -1;
22 volatile int tmp = 0;
23 u64 total_periods = 0;
24 int nr_samples = 0;
25 union perf_event *event;
26 struct perf_evsel *evsel;
27 struct perf_evlist *evlist;
28 struct perf_event_attr attr = {
29 .type = PERF_TYPE_SOFTWARE,
30 .config = clock_id,
31 .sample_type = PERF_SAMPLE_PERIOD,
32 .exclude_kernel = 1,
33 .disabled = 1,
34 .freq = 1,
35 };
36
37 attr.sample_freq = 10000;
38
39 evlist = perf_evlist__new();
40 if (evlist == NULL) {
41 pr_debug("perf_evlist__new\n");
42 return -1;
43 }
44
45 evsel = perf_evsel__new(&attr, 0);
46 if (evsel == NULL) {
47 pr_debug("perf_evsel__new\n");
48 goto out_free_evlist;
49 }
50 perf_evlist__add(evlist, evsel);
51
52 evlist->cpus = cpu_map__dummy_new();
53 evlist->threads = thread_map__new_by_tid(getpid());
54 if (!evlist->cpus || !evlist->threads) {
55 err = -ENOMEM;
56 pr_debug("Not enough memory to create thread/cpu maps\n");
57 goto out_delete_maps;
58 }
59
60 perf_evlist__open(evlist);
61
62 err = perf_evlist__mmap(evlist, 128, true);
63 if (err < 0) {
64 pr_debug("failed to mmap event: %d (%s)\n", errno,
65 strerror(errno));
66 goto out_close_evlist;
67 }
68
69 perf_evlist__enable(evlist);
70
71 /* collect samples */
72 for (i = 0; i < NR_LOOPS; i++)
73 tmp++;
74
75 perf_evlist__disable(evlist);
76
77 while ((event = perf_evlist__mmap_read(evlist, 0)) != NULL) {
78 struct perf_sample sample;
79
80 if (event->header.type != PERF_RECORD_SAMPLE)
81 continue;
82
83 err = perf_evlist__parse_sample(evlist, event, &sample);
84 if (err < 0) {
85 pr_debug("Error during parse sample\n");
86 goto out_unmap_evlist;
87 }
88
89 total_periods += sample.period;
90 nr_samples++;
91 }
92
93 if ((u64) nr_samples == total_periods) {
94 pr_debug("All (%d) samples have period value of 1!\n",
95 nr_samples);
96 err = -1;
97 }
98
99out_unmap_evlist:
100 perf_evlist__munmap(evlist);
101out_close_evlist:
102 perf_evlist__close(evlist);
103out_delete_maps:
104 perf_evlist__delete_maps(evlist);
105out_free_evlist:
106 perf_evlist__delete(evlist);
107 return err;
108}
109
110int test__sw_clock_freq(void)
111{
112 int ret;
113
114 ret = __test__sw_clock_freq(PERF_COUNT_SW_CPU_CLOCK);
115 if (!ret)
116 ret = __test__sw_clock_freq(PERF_COUNT_SW_TASK_CLOCK);
117
118 return ret;
119}
diff --git a/tools/perf/tests/tests.h b/tools/perf/tests/tests.h
index b33b3286ad6e..dd7feae2d37b 100644
--- a/tools/perf/tests/tests.h
+++ b/tools/perf/tests/tests.h
@@ -26,5 +26,6 @@ int test__python_use(void);
26int test__bp_signal(void); 26int test__bp_signal(void);
27int test__bp_signal_overflow(void); 27int test__bp_signal_overflow(void);
28int test__task_exit(void); 28int test__task_exit(void);
29int test__sw_clock_freq(void);
29 30
30#endif /* TESTS_H */ 31#endif /* TESTS_H */