Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
torvalds
GitHub Repository: torvalds/linux
Path: blob/master/tools/power/cpupower/bench/main.c
26292 views
1
// SPDX-License-Identifier: GPL-2.0-or-later
2
/* cpufreq-bench CPUFreq microbenchmark
3
*
4
* Copyright (C) 2008 Christian Kornacker <[email protected]>
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
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
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
191