diff options
Diffstat (limited to 'tools/perf/builtin-bench.c')
-rw-r--r-- | tools/perf/builtin-bench.c | 57 |
1 files changed, 53 insertions, 4 deletions
diff --git a/tools/perf/builtin-bench.c b/tools/perf/builtin-bench.c index e043eb83092a..46996774e559 100644 --- a/tools/perf/builtin-bench.c +++ b/tools/perf/builtin-bench.c | |||
@@ -31,6 +31,9 @@ struct bench_suite { | |||
31 | const char *summary; | 31 | const char *summary; |
32 | int (*fn)(int, const char **, const char *); | 32 | int (*fn)(int, const char **, const char *); |
33 | }; | 33 | }; |
34 | \ | ||
35 | /* sentinel: easy for help */ | ||
36 | #define suite_all { "all", "test all suite (pseudo suite)", NULL } | ||
34 | 37 | ||
35 | static struct bench_suite sched_suites[] = { | 38 | static struct bench_suite sched_suites[] = { |
36 | { "messaging", | 39 | { "messaging", |
@@ -39,6 +42,7 @@ static struct bench_suite sched_suites[] = { | |||
39 | { "pipe", | 42 | { "pipe", |
40 | "Flood of communication over pipe() between two processes", | 43 | "Flood of communication over pipe() between two processes", |
41 | bench_sched_pipe }, | 44 | bench_sched_pipe }, |
45 | suite_all, | ||
42 | { NULL, | 46 | { NULL, |
43 | NULL, | 47 | NULL, |
44 | NULL } | 48 | NULL } |
@@ -48,6 +52,7 @@ static struct bench_suite mem_suites[] = { | |||
48 | { "memcpy", | 52 | { "memcpy", |
49 | "Simple memory copy in various ways", | 53 | "Simple memory copy in various ways", |
50 | bench_mem_memcpy }, | 54 | bench_mem_memcpy }, |
55 | suite_all, | ||
51 | { NULL, | 56 | { NULL, |
52 | NULL, | 57 | NULL, |
53 | NULL } | 58 | NULL } |
@@ -66,6 +71,9 @@ static struct bench_subsys subsystems[] = { | |||
66 | { "mem", | 71 | { "mem", |
67 | "memory access performance", | 72 | "memory access performance", |
68 | mem_suites }, | 73 | mem_suites }, |
74 | { "all", /* sentinel: easy for help */ | ||
75 | "test all subsystem (pseudo subsystem)", | ||
76 | NULL }, | ||
69 | { NULL, | 77 | { NULL, |
70 | NULL, | 78 | NULL, |
71 | NULL } | 79 | NULL } |
@@ -75,11 +83,11 @@ static void dump_suites(int subsys_index) | |||
75 | { | 83 | { |
76 | int i; | 84 | int i; |
77 | 85 | ||
78 | printf("List of available suites for %s...\n\n", | 86 | printf("# List of available suites for %s...\n\n", |
79 | subsystems[subsys_index].name); | 87 | subsystems[subsys_index].name); |
80 | 88 | ||
81 | for (i = 0; subsystems[subsys_index].suites[i].name; i++) | 89 | for (i = 0; subsystems[subsys_index].suites[i].name; i++) |
82 | printf("\t%s: %s\n", | 90 | printf("%14s: %s\n", |
83 | subsystems[subsys_index].suites[i].name, | 91 | subsystems[subsys_index].suites[i].name, |
84 | subsystems[subsys_index].suites[i].summary); | 92 | subsystems[subsys_index].suites[i].summary); |
85 | 93 | ||
@@ -110,10 +118,10 @@ static void print_usage(void) | |||
110 | printf("\t%s\n", bench_usage[i]); | 118 | printf("\t%s\n", bench_usage[i]); |
111 | printf("\n"); | 119 | printf("\n"); |
112 | 120 | ||
113 | printf("List of available subsystems...\n\n"); | 121 | printf("# List of available subsystems...\n\n"); |
114 | 122 | ||
115 | for (i = 0; subsystems[i].name; i++) | 123 | for (i = 0; subsystems[i].name; i++) |
116 | printf("\t%s: %s\n", | 124 | printf("%14s: %s\n", |
117 | subsystems[i].name, subsystems[i].summary); | 125 | subsystems[i].name, subsystems[i].summary); |
118 | printf("\n"); | 126 | printf("\n"); |
119 | } | 127 | } |
@@ -131,6 +139,37 @@ static int bench_str2int(char *str) | |||
131 | return BENCH_FORMAT_UNKNOWN; | 139 | return BENCH_FORMAT_UNKNOWN; |
132 | } | 140 | } |
133 | 141 | ||
142 | static void all_suite(struct bench_subsys *subsys) /* FROM HERE */ | ||
143 | { | ||
144 | int i; | ||
145 | const char *argv[2]; | ||
146 | struct bench_suite *suites = subsys->suites; | ||
147 | |||
148 | argv[1] = NULL; | ||
149 | /* | ||
150 | * TODO: | ||
151 | * preparing preset parameters for | ||
152 | * embedded, ordinary PC, HPC, etc... | ||
153 | * will be helpful | ||
154 | */ | ||
155 | for (i = 0; suites[i].fn; i++) { | ||
156 | printf("# Running %s/%s benchmark...\n", | ||
157 | subsys->name, | ||
158 | suites[i].name); | ||
159 | |||
160 | argv[1] = suites[i].name; | ||
161 | suites[i].fn(1, argv, NULL); | ||
162 | printf("\n"); | ||
163 | } | ||
164 | } | ||
165 | |||
166 | static void all_subsystem(void) | ||
167 | { | ||
168 | int i; | ||
169 | for (i = 0; subsystems[i].suites; i++) | ||
170 | all_suite(&subsystems[i]); | ||
171 | } | ||
172 | |||
134 | int cmd_bench(int argc, const char **argv, const char *prefix __used) | 173 | int cmd_bench(int argc, const char **argv, const char *prefix __used) |
135 | { | 174 | { |
136 | int i, j, status = 0; | 175 | int i, j, status = 0; |
@@ -155,6 +194,11 @@ int cmd_bench(int argc, const char **argv, const char *prefix __used) | |||
155 | goto end; | 194 | goto end; |
156 | } | 195 | } |
157 | 196 | ||
197 | if (!strcmp(argv[0], "all")) { | ||
198 | all_subsystem(); | ||
199 | goto end; | ||
200 | } | ||
201 | |||
158 | for (i = 0; subsystems[i].name; i++) { | 202 | for (i = 0; subsystems[i].name; i++) { |
159 | if (strcmp(subsystems[i].name, argv[0])) | 203 | if (strcmp(subsystems[i].name, argv[0])) |
160 | continue; | 204 | continue; |
@@ -165,6 +209,11 @@ int cmd_bench(int argc, const char **argv, const char *prefix __used) | |||
165 | goto end; | 209 | goto end; |
166 | } | 210 | } |
167 | 211 | ||
212 | if (!strcmp(argv[1], "all")) { | ||
213 | all_suite(&subsystems[i]); | ||
214 | goto end; | ||
215 | } | ||
216 | |||
168 | for (j = 0; subsystems[i].suites[j].name; j++) { | 217 | for (j = 0; subsystems[i].suites[j].name; j++) { |
169 | if (strcmp(subsystems[i].suites[j].name, argv[1])) | 218 | if (strcmp(subsystems[i].suites[j].name, argv[1])) |
170 | continue; | 219 | continue; |