1 // SPDX-License-Identifier: GPL-2.0-or-later
2 /* cpufreq-bench CPUFreq microbenchmark
3 *
4 * Copyright (C) 2008 Christian Kornacker <ckornacker@suse.de>
5 */
6
7 #include <stdio.h>
8 #include <stdlib.h>
9 #include <string.h>
10 #include <unistd.h>
11 #include <getopt.h>
12 #include <errno.h>
13
14 #include "config.h"
15 #include "system.h"
16 #include "benchmark.h"
17
18 static struct option long_options[] = {
19 {"output", 1, 0, 'o'},
20 {"sleep", 1, 0, 's'},
21 {"load", 1, 0, 'l'},
22 {"verbose", 0, 0, 'v'},
23 {"cpu", 1, 0, 'c'},
24 {"governor", 1, 0, 'g'},
25 {"prio", 1, 0, 'p'},
26 {"file", 1, 0, 'f'},
27 {"cycles", 1, 0, 'n'},
28 {"rounds", 1, 0, 'r'},
29 {"load-step", 1, 0, 'x'},
30 {"sleep-step", 1, 0, 'y'},
31 {"help", 0, 0, 'h'},
32 {0, 0, 0, 0}
33 };
34
35 /*******************************************************************
36 usage
37 *******************************************************************/
38
usage()39 void usage()
40 {
41 printf("usage: ./bench\n");
42 printf("Options:\n");
43 printf(" -l, --load=<long int>\t\tinitial load time in us\n");
44 printf(" -s, --sleep=<long int>\t\tinitial sleep time in us\n");
45 printf(" -x, --load-step=<long int>\ttime to be added to load time, in us\n");
46 printf(" -y, --sleep-step=<long int>\ttime to be added to sleep time, in us\n");
47 printf(" -c, --cpu=<cpu #>\t\t\tCPU Nr. to use, starting at 0\n");
48 printf(" -p, --prio=<priority>\t\t\tscheduler priority, HIGH, LOW or DEFAULT\n");
49 printf(" -g, --governor=<governor>\t\tcpufreq governor to test\n");
50 printf(" -n, --cycles=<int>\t\t\tload/sleep cycles\n");
51 printf(" -r, --rounds<int>\t\t\tload/sleep rounds\n");
52 printf(" -f, --file=<configfile>\t\tconfig file to use\n");
53 printf(" -o, --output=<dir>\t\t\toutput path. Filename will be OUTPUTPATH/benchmark_TIMESTAMP.log\n");
54 printf(" -v, --verbose\t\t\t\tverbose output on/off\n");
55 printf(" -h, --help\t\t\t\tPrint this help screen\n");
56 exit(1);
57 }
58
59 /*******************************************************************
60 main
61 *******************************************************************/
62
main(int argc,char ** argv)63 int main(int argc, char **argv)
64 {
65 int c;
66 int option_index = 0;
67 struct config *config = NULL;
68
69 config = prepare_default_config();
70
71 if (config == NULL)
72 return EXIT_FAILURE;
73
74 while (1) {
75 c = getopt_long (argc, argv, "hg:o:s:l:vc:p:f:n:r:x:y:",
76 long_options, &option_index);
77 if (c == -1)
78 break;
79
80 switch (c) {
81 case 'o':
82 if (config->output != NULL)
83 fclose(config->output);
84
85 config->output = prepare_output(optarg);
86
87 if (config->output == NULL)
88 return EXIT_FAILURE;
89
90 dprintf("user output path -> %s\n", optarg);
91 break;
92 case 's':
93 sscanf(optarg, "%li", &config->sleep);
94 dprintf("user sleep time -> %s\n", optarg);
95 break;
96 case 'l':
97 sscanf(optarg, "%li", &config->load);
98 dprintf("user load time -> %s\n", optarg);
99 break;
100 case 'c':
101 sscanf(optarg, "%u", &config->cpu);
102 dprintf("user cpu -> %s\n", optarg);
103 break;
104 case 'g':
105 strncpy(config->governor, optarg, 14);
106 dprintf("user governor -> %s\n", optarg);
107 break;
108 case 'p':
109 if (string_to_prio(optarg) != SCHED_ERR) {
110 config->prio = string_to_prio(optarg);
111 dprintf("user prio -> %s\n", optarg);
112 } else {
113 if (config != NULL) {
114 if (config->output != NULL)
115 fclose(config->output);
116 free(config);
117 }
118 usage();
119 }
120 break;
121 case 'n':
122 sscanf(optarg, "%u", &config->cycles);
123 dprintf("user cycles -> %s\n", optarg);
124 break;
125 case 'r':
126 sscanf(optarg, "%u", &config->rounds);
127 dprintf("user rounds -> %s\n", optarg);
128 break;
129 case 'x':
130 sscanf(optarg, "%li", &config->load_step);
131 dprintf("user load_step -> %s\n", optarg);
132 break;
133 case 'y':
134 sscanf(optarg, "%li", &config->sleep_step);
135 dprintf("user sleep_step -> %s\n", optarg);
136 break;
137 case 'f':
138 if (prepare_config(optarg, config))
139 return EXIT_FAILURE;
140 break;
141 case 'v':
142 config->verbose = 1;
143 dprintf("verbose output enabled\n");
144 break;
145 case 'h':
146 case '?':
147 default:
148 if (config != NULL) {
149 if (config->output != NULL)
150 fclose(config->output);
151 free(config);
152 }
153 usage();
154 }
155 }
156
157 if (config->verbose) {
158 printf("starting benchmark with parameters:\n");
159 printf("config:\n\t"
160 "sleep=%li\n\t"
161 "load=%li\n\t"
162 "sleep_step=%li\n\t"
163 "load_step=%li\n\t"
164 "cpu=%u\n\t"
165 "cycles=%u\n\t"
166 "rounds=%u\n\t"
167 "governor=%s\n\n",
168 config->sleep,
169 config->load,
170 config->sleep_step,
171 config->load_step,
172 config->cpu,
173 config->cycles,
174 config->rounds,
175 config->governor);
176 }
177
178 prepare_user(config);
179 prepare_system(config);
180 start_benchmark(config);
181
182 if (config->output != stdout)
183 fclose(config->output);
184
185 free(config);
186
187 return EXIT_SUCCESS;
188 }
189
190