1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20#include <stdio.h>
21#include <time.h>
22#include <sys/time.h>
23#include <sys/types.h>
24#include <unistd.h>
25
26#include <sched.h>
27
28#include <cpufreq.h>
29#include <cpupower.h>
30
31#include "config.h"
32#include "system.h"
33
34
35
36
37
38
39
40long long int get_time()
41{
42 struct timeval now;
43
44 gettimeofday(&now, NULL);
45
46 return (long long int)(now.tv_sec * 1000000LL + now.tv_usec);
47}
48
49
50
51
52
53
54
55
56
57
58
59int set_cpufreq_governor(char *governor, unsigned int cpu)
60{
61
62 dprintf("set %s as cpufreq governor\n", governor);
63
64 if (cpupower_is_cpu_online(cpu) != 0) {
65 perror("cpufreq_cpu_exists");
66 fprintf(stderr, "error: cpu %u does not exist\n", cpu);
67 return -1;
68 }
69
70 if (cpufreq_modify_policy_governor(cpu, governor) != 0) {
71 perror("cpufreq_modify_policy_governor");
72 fprintf(stderr, "error: unable to set %s governor\n", governor);
73 return -1;
74 }
75
76 return 0;
77}
78
79
80
81
82
83
84
85
86
87
88int set_cpu_affinity(unsigned int cpu)
89{
90 cpu_set_t cpuset;
91
92 CPU_ZERO(&cpuset);
93 CPU_SET(cpu, &cpuset);
94
95 dprintf("set affinity to cpu #%u\n", cpu);
96
97 if (sched_setaffinity(getpid(), sizeof(cpu_set_t), &cpuset) < 0) {
98 perror("sched_setaffinity");
99 fprintf(stderr, "warning: unable to set cpu affinity\n");
100 return -1;
101 }
102
103 return 0;
104}
105
106
107
108
109
110
111
112
113
114
115int set_process_priority(int priority)
116{
117 struct sched_param param;
118
119 dprintf("set scheduler priority to %i\n", priority);
120
121 param.sched_priority = priority;
122
123 if (sched_setscheduler(0, SCHEDULER, ¶m) < 0) {
124 perror("sched_setscheduler");
125 fprintf(stderr, "warning: unable to set scheduler priority\n");
126 return -1;
127 }
128
129 return 0;
130}
131
132
133
134
135
136
137
138
139void prepare_user(const struct config *config)
140{
141 unsigned long sleep_time = 0;
142 unsigned long load_time = 0;
143 unsigned int round;
144
145 for (round = 0; round < config->rounds; round++) {
146 sleep_time += 2 * config->cycles *
147 (config->sleep + config->sleep_step * round);
148 load_time += 2 * config->cycles *
149 (config->load + config->load_step * round) +
150 (config->load + config->load_step * round * 4);
151 }
152
153 if (config->verbose || config->output != stdout)
154 printf("approx. test duration: %im\n",
155 (int)((sleep_time + load_time) / 60000000));
156}
157
158
159
160
161
162
163
164
165void prepare_system(const struct config *config)
166{
167 if (config->verbose)
168 printf("set cpu affinity to cpu #%u\n", config->cpu);
169
170 set_cpu_affinity(config->cpu);
171
172 switch (config->prio) {
173 case SCHED_HIGH:
174 if (config->verbose)
175 printf("high priority condition requested\n");
176
177 set_process_priority(PRIORITY_HIGH);
178 break;
179 case SCHED_LOW:
180 if (config->verbose)
181 printf("low priority condition requested\n");
182
183 set_process_priority(PRIORITY_LOW);
184 break;
185 default:
186 if (config->verbose)
187 printf("default priority condition requested\n");
188
189 set_process_priority(PRIORITY_DEFAULT);
190 }
191}
192
193