blob: 4366f3d3bce120542904166f786c6c8a2af3717b [file] [log] [blame]
Mark Salyzynfb2a5da2013-11-22 12:39:43 -08001/*
2 * Copyright (C) 2013-2014 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
Mark Salyzyn4fa06c42015-12-16 13:11:36 -080017#include <fcntl.h>
Mark Salyzyn777ea342016-09-21 09:24:13 -070018#include <inttypes.h>
19#include <poll.h>
Tom Cherryec2dea72019-10-14 15:28:35 -070020#include <sched.h>
Mark Salyzynfb2a5da2013-11-22 12:39:43 -080021#include <sys/socket.h>
Mark Salyzyn952a58b2017-09-11 13:29:59 -070022#include <sys/syscall.h>
Mark Salyzyn4fa06c42015-12-16 13:11:36 -080023#include <sys/types.h>
Tom Cherryebebf692019-01-16 14:17:08 -080024#include <sys/uio.h>
Mark Salyzyn4fa06c42015-12-16 13:11:36 -080025#include <unistd.h>
26
Mark Salyzyna2b5b562016-11-22 13:08:59 -080027#include <unordered_set>
28
Mark Salyzyn777ea342016-09-21 09:24:13 -070029#include <android-base/file.h>
Tom Cherry71054b22020-02-21 15:08:40 -080030#include <android-base/properties.h>
Mark Salyzyncecd60d2018-01-11 11:20:24 -080031#include <benchmark/benchmark.h>
Mark Salyzynfb2a5da2013-11-22 12:39:43 -080032#include <cutils/sockets.h>
Mark Salyzyna2b5b562016-11-22 13:08:59 -080033#include <log/event_tag_map.h>
Mark Salyzyn4fa06c42015-12-16 13:11:36 -080034#include <private/android_logger.h>
Mark Salyzynfb2a5da2013-11-22 12:39:43 -080035
Mark Salyzyncecd60d2018-01-11 11:20:24 -080036BENCHMARK_MAIN();
Mark Salyzynfb2a5da2013-11-22 12:39:43 -080037
38// enhanced version of LOG_FAILURE_RETRY to add support for EAGAIN and
39// non-syscall libs. Since we are benchmarking, or using this in the emergency
40// signal to stuff a terminating code, we do NOT want to introduce
41// a syscall or usleep on EAGAIN retry.
Mark Salyzyn6e315682017-03-09 08:09:43 -080042#define LOG_FAILURE_RETRY(exp) \
43 ({ \
44 typeof(exp) _rc; \
45 do { \
46 _rc = (exp); \
47 } while (((_rc == -1) && ((errno == EINTR) || (errno == EAGAIN))) || \
48 (_rc == -EINTR) || (_rc == -EAGAIN)); \
49 _rc; \
50 })
Mark Salyzynfb2a5da2013-11-22 12:39:43 -080051
52/*
53 * Measure the fastest rate we can reliabley stuff print messages into
54 * the log at high pressure. Expect this to be less than double the process
55 * wakeup time (2ms?)
56 */
Mark Salyzyncecd60d2018-01-11 11:20:24 -080057static void BM_log_maximum_retry(benchmark::State& state) {
58 while (state.KeepRunning()) {
Haibo Huang629b22b2019-06-06 21:27:48 -070059 LOG_FAILURE_RETRY(__android_log_print(ANDROID_LOG_INFO, "BM_log_maximum_retry", "%" PRIu64,
60 state.iterations()));
Mark Salyzyn6e315682017-03-09 08:09:43 -080061 }
Mark Salyzynfb2a5da2013-11-22 12:39:43 -080062}
63BENCHMARK(BM_log_maximum_retry);
64
65/*
66 * Measure the fastest rate we can stuff print messages into the log
67 * at high pressure. Expect this to be less than double the process wakeup
68 * time (2ms?)
69 */
Mark Salyzyncecd60d2018-01-11 11:20:24 -080070static void BM_log_maximum(benchmark::State& state) {
71 while (state.KeepRunning()) {
Haibo Huang629b22b2019-06-06 21:27:48 -070072 __android_log_print(ANDROID_LOG_INFO, "BM_log_maximum", "%" PRIu64, state.iterations());
Mark Salyzyn6e315682017-03-09 08:09:43 -080073 }
Mark Salyzynfb2a5da2013-11-22 12:39:43 -080074}
75BENCHMARK(BM_log_maximum);
76
77/*
Mark Salyzyn4189ccc2015-02-04 12:40:55 -080078 * Measure the time it takes to collect the time using
Mark Salyzyncecd60d2018-01-11 11:20:24 -080079 * discrete acquisition (state.PauseTiming() to state.ResumeTiming())
Mark Salyzyn4189ccc2015-02-04 12:40:55 -080080 * under light load. Expect this to be a syscall period (2us) or
81 * data read time if zero-syscall.
82 *
83 * vdso support in the kernel and the library can allow
Mark Salyzyncecd60d2018-01-11 11:20:24 -080084 * clock_gettime to be zero-syscall, but there there does remain some
85 * benchmarking overhead to pause and resume; assumptions are both are
86 * covered.
Mark Salyzynfb2a5da2013-11-22 12:39:43 -080087 */
Mark Salyzyncecd60d2018-01-11 11:20:24 -080088static void BM_clock_overhead(benchmark::State& state) {
89 while (state.KeepRunning()) {
90 state.PauseTiming();
91 state.ResumeTiming();
Mark Salyzyn6e315682017-03-09 08:09:43 -080092 }
Mark Salyzynfb2a5da2013-11-22 12:39:43 -080093}
94BENCHMARK(BM_clock_overhead);
95
Mark Salyzyn952a58b2017-09-11 13:29:59 -070096static void do_clock_overhead(benchmark::State& state, clockid_t clk_id) {
97 timespec t;
98 while (state.KeepRunning()) {
99 clock_gettime(clk_id, &t);
100 }
101}
102
103static void BM_time_clock_gettime_REALTIME(benchmark::State& state) {
104 do_clock_overhead(state, CLOCK_REALTIME);
105}
106BENCHMARK(BM_time_clock_gettime_REALTIME);
107
108static void BM_time_clock_gettime_MONOTONIC(benchmark::State& state) {
109 do_clock_overhead(state, CLOCK_MONOTONIC);
110}
111BENCHMARK(BM_time_clock_gettime_MONOTONIC);
112
113static void BM_time_clock_gettime_MONOTONIC_syscall(benchmark::State& state) {
114 timespec t;
115 while (state.KeepRunning()) {
116 syscall(__NR_clock_gettime, CLOCK_MONOTONIC, &t);
117 }
118}
119BENCHMARK(BM_time_clock_gettime_MONOTONIC_syscall);
120
121static void BM_time_clock_gettime_MONOTONIC_RAW(benchmark::State& state) {
122 do_clock_overhead(state, CLOCK_MONOTONIC_RAW);
123}
124BENCHMARK(BM_time_clock_gettime_MONOTONIC_RAW);
125
126static void BM_time_clock_gettime_BOOTTIME(benchmark::State& state) {
127 do_clock_overhead(state, CLOCK_BOOTTIME);
128}
129BENCHMARK(BM_time_clock_gettime_BOOTTIME);
130
131static void BM_time_clock_getres_MONOTONIC(benchmark::State& state) {
132 timespec t;
133 while (state.KeepRunning()) {
134 clock_getres(CLOCK_MONOTONIC, &t);
135 }
136}
137BENCHMARK(BM_time_clock_getres_MONOTONIC);
138
139static void BM_time_clock_getres_MONOTONIC_syscall(benchmark::State& state) {
140 timespec t;
141 while (state.KeepRunning()) {
142 syscall(__NR_clock_getres, CLOCK_MONOTONIC, &t);
143 }
144}
145BENCHMARK(BM_time_clock_getres_MONOTONIC_syscall);
146
147static void BM_time_time(benchmark::State& state) {
148 while (state.KeepRunning()) {
149 time_t now;
150 now = time(&now);
151 }
152}
153BENCHMARK(BM_time_time);
154
Mark Salyzynfb2a5da2013-11-22 12:39:43 -0800155/*
Mark Salyzyn4fa06c42015-12-16 13:11:36 -0800156 * Measure the time it takes to submit the android logging data to pstore
157 */
Mark Salyzyncecd60d2018-01-11 11:20:24 -0800158static void BM_pmsg_short(benchmark::State& state) {
Tom Cherry96e06ea2019-02-12 11:26:23 -0800159 int pstore_fd = TEMP_FAILURE_RETRY(open("/dev/pmsg0", O_WRONLY | O_CLOEXEC));
Mark Salyzyn6e315682017-03-09 08:09:43 -0800160 if (pstore_fd < 0) {
Mark Salyzyncecd60d2018-01-11 11:20:24 -0800161 state.SkipWithError("/dev/pmsg0");
Mark Salyzyn6e315682017-03-09 08:09:43 -0800162 return;
163 }
Mark Salyzyn4fa06c42015-12-16 13:11:36 -0800164
Mark Salyzyn6e315682017-03-09 08:09:43 -0800165 /*
166 * struct {
167 * // what we provide to pstore
168 * android_pmsg_log_header_t pmsg_header;
169 * // what we provide to socket
170 * android_log_header_t header;
171 * // caller provides
172 * union {
173 * struct {
174 * char prio;
175 * char payload[];
176 * } string;
177 * struct {
178 * uint32_t tag
179 * char payload[];
180 * } binary;
181 * };
182 * };
183 */
Mark Salyzyn4fa06c42015-12-16 13:11:36 -0800184
Mark Salyzyn6e315682017-03-09 08:09:43 -0800185 struct timespec ts;
186 clock_gettime(android_log_clockid(), &ts);
Mark Salyzyn4fa06c42015-12-16 13:11:36 -0800187
Mark Salyzyn6e315682017-03-09 08:09:43 -0800188 android_pmsg_log_header_t pmsg_header;
189 pmsg_header.magic = LOGGER_MAGIC;
190 pmsg_header.len =
191 sizeof(android_pmsg_log_header_t) + sizeof(android_log_header_t);
192 pmsg_header.uid = getuid();
193 pmsg_header.pid = getpid();
Mark Salyzyn4fa06c42015-12-16 13:11:36 -0800194
Mark Salyzyn6e315682017-03-09 08:09:43 -0800195 android_log_header_t header;
196 header.tid = gettid();
197 header.realtime.tv_sec = ts.tv_sec;
198 header.realtime.tv_nsec = ts.tv_nsec;
Mark Salyzyn4fa06c42015-12-16 13:11:36 -0800199
Mark Salyzyn6e315682017-03-09 08:09:43 -0800200 static const unsigned nr = 1;
201 static const unsigned header_length = 2;
202 struct iovec newVec[nr + header_length];
Mark Salyzyn4fa06c42015-12-16 13:11:36 -0800203
Mark Salyzyn6e315682017-03-09 08:09:43 -0800204 newVec[0].iov_base = (unsigned char*)&pmsg_header;
205 newVec[0].iov_len = sizeof(pmsg_header);
206 newVec[1].iov_base = (unsigned char*)&header;
207 newVec[1].iov_len = sizeof(header);
Mark Salyzyn4fa06c42015-12-16 13:11:36 -0800208
Mark Salyzyn6e315682017-03-09 08:09:43 -0800209 android_log_event_int_t buffer;
Mark Salyzyn4fa06c42015-12-16 13:11:36 -0800210
Mark Salyzyn6e315682017-03-09 08:09:43 -0800211 header.id = LOG_ID_EVENTS;
212 buffer.header.tag = 0;
213 buffer.payload.type = EVENT_TYPE_INT;
214 uint32_t snapshot = 0;
Tom Cherryabcdd122019-09-30 14:33:46 -0700215 buffer.payload.data = snapshot;
Mark Salyzyn4fa06c42015-12-16 13:11:36 -0800216
Mark Salyzyn6e315682017-03-09 08:09:43 -0800217 newVec[2].iov_base = &buffer;
218 newVec[2].iov_len = sizeof(buffer);
219
Mark Salyzyncecd60d2018-01-11 11:20:24 -0800220 while (state.KeepRunning()) {
Mark Salyzyn6e315682017-03-09 08:09:43 -0800221 ++snapshot;
Tom Cherryabcdd122019-09-30 14:33:46 -0700222 buffer.payload.data = snapshot;
Mark Salyzyn6e315682017-03-09 08:09:43 -0800223 writev(pstore_fd, newVec, nr);
224 }
Mark Salyzyncecd60d2018-01-11 11:20:24 -0800225 state.PauseTiming();
Mark Salyzyn6e315682017-03-09 08:09:43 -0800226 close(pstore_fd);
Mark Salyzyn4fa06c42015-12-16 13:11:36 -0800227}
228BENCHMARK(BM_pmsg_short);
229
230/*
231 * Measure the time it takes to submit the android logging data to pstore
232 * best case aligned single block.
233 */
Mark Salyzyncecd60d2018-01-11 11:20:24 -0800234static void BM_pmsg_short_aligned(benchmark::State& state) {
Tom Cherry96e06ea2019-02-12 11:26:23 -0800235 int pstore_fd = TEMP_FAILURE_RETRY(open("/dev/pmsg0", O_WRONLY | O_CLOEXEC));
Mark Salyzyn6e315682017-03-09 08:09:43 -0800236 if (pstore_fd < 0) {
Mark Salyzyncecd60d2018-01-11 11:20:24 -0800237 state.SkipWithError("/dev/pmsg0");
Mark Salyzyn6e315682017-03-09 08:09:43 -0800238 return;
239 }
Mark Salyzyn4fa06c42015-12-16 13:11:36 -0800240
Mark Salyzyn6e315682017-03-09 08:09:43 -0800241 /*
242 * struct {
243 * // what we provide to pstore
244 * android_pmsg_log_header_t pmsg_header;
245 * // what we provide to socket
246 * android_log_header_t header;
247 * // caller provides
248 * union {
249 * struct {
250 * char prio;
251 * char payload[];
252 * } string;
253 * struct {
254 * uint32_t tag
255 * char payload[];
256 * } binary;
257 * };
258 * };
259 */
Mark Salyzyn4fa06c42015-12-16 13:11:36 -0800260
Mark Salyzyn6e315682017-03-09 08:09:43 -0800261 struct timespec ts;
262 clock_gettime(android_log_clockid(), &ts);
Mark Salyzyn4fa06c42015-12-16 13:11:36 -0800263
Mark Salyzyn6e315682017-03-09 08:09:43 -0800264 struct packet {
265 android_pmsg_log_header_t pmsg_header;
266 android_log_header_t header;
267 android_log_event_int_t payload;
268 };
269 alignas(8) char buf[sizeof(struct packet) + 8];
270 memset(buf, 0, sizeof(buf));
271 struct packet* buffer = (struct packet*)(((uintptr_t)buf + 7) & ~7);
272 if (((uintptr_t)&buffer->pmsg_header) & 7) {
Haibo Huang629b22b2019-06-06 21:27:48 -0700273 fprintf(stderr, "&buffer=0x%p iterations=%" PRIu64 "\n", &buffer->pmsg_header,
Mark Salyzyncecd60d2018-01-11 11:20:24 -0800274 state.iterations());
Mark Salyzyn6e315682017-03-09 08:09:43 -0800275 }
Mark Salyzyn4fa06c42015-12-16 13:11:36 -0800276
Mark Salyzyn6e315682017-03-09 08:09:43 -0800277 buffer->pmsg_header.magic = LOGGER_MAGIC;
278 buffer->pmsg_header.len =
279 sizeof(android_pmsg_log_header_t) + sizeof(android_log_header_t);
280 buffer->pmsg_header.uid = getuid();
281 buffer->pmsg_header.pid = getpid();
Mark Salyzyn4fa06c42015-12-16 13:11:36 -0800282
Mark Salyzyn6e315682017-03-09 08:09:43 -0800283 buffer->header.tid = gettid();
284 buffer->header.realtime.tv_sec = ts.tv_sec;
285 buffer->header.realtime.tv_nsec = ts.tv_nsec;
Mark Salyzyn4fa06c42015-12-16 13:11:36 -0800286
Mark Salyzyn6e315682017-03-09 08:09:43 -0800287 buffer->header.id = LOG_ID_EVENTS;
288 buffer->payload.header.tag = 0;
289 buffer->payload.payload.type = EVENT_TYPE_INT;
290 uint32_t snapshot = 0;
Tom Cherryabcdd122019-09-30 14:33:46 -0700291 buffer->payload.payload.data = snapshot;
Mark Salyzyn4fa06c42015-12-16 13:11:36 -0800292
Mark Salyzyncecd60d2018-01-11 11:20:24 -0800293 while (state.KeepRunning()) {
Mark Salyzyn6e315682017-03-09 08:09:43 -0800294 ++snapshot;
Tom Cherryabcdd122019-09-30 14:33:46 -0700295 buffer->payload.payload.data = snapshot;
Mark Salyzyn6e315682017-03-09 08:09:43 -0800296 write(pstore_fd, &buffer->pmsg_header,
297 sizeof(android_pmsg_log_header_t) + sizeof(android_log_header_t) +
298 sizeof(android_log_event_int_t));
299 }
Mark Salyzyncecd60d2018-01-11 11:20:24 -0800300 state.PauseTiming();
Mark Salyzyn6e315682017-03-09 08:09:43 -0800301 close(pstore_fd);
Mark Salyzyn4fa06c42015-12-16 13:11:36 -0800302}
303BENCHMARK(BM_pmsg_short_aligned);
304
305/*
306 * Measure the time it takes to submit the android logging data to pstore
307 * best case aligned single block.
308 */
Mark Salyzyncecd60d2018-01-11 11:20:24 -0800309static void BM_pmsg_short_unaligned1(benchmark::State& state) {
Tom Cherry96e06ea2019-02-12 11:26:23 -0800310 int pstore_fd = TEMP_FAILURE_RETRY(open("/dev/pmsg0", O_WRONLY | O_CLOEXEC));
Mark Salyzyn6e315682017-03-09 08:09:43 -0800311 if (pstore_fd < 0) {
Mark Salyzyncecd60d2018-01-11 11:20:24 -0800312 state.SkipWithError("/dev/pmsg0");
Mark Salyzyn6e315682017-03-09 08:09:43 -0800313 return;
314 }
Mark Salyzyn4fa06c42015-12-16 13:11:36 -0800315
Mark Salyzyn6e315682017-03-09 08:09:43 -0800316 /*
317 * struct {
318 * // what we provide to pstore
319 * android_pmsg_log_header_t pmsg_header;
320 * // what we provide to socket
321 * android_log_header_t header;
322 * // caller provides
323 * union {
324 * struct {
325 * char prio;
326 * char payload[];
327 * } string;
328 * struct {
329 * uint32_t tag
330 * char payload[];
331 * } binary;
332 * };
333 * };
334 */
Mark Salyzyn4fa06c42015-12-16 13:11:36 -0800335
Mark Salyzyn6e315682017-03-09 08:09:43 -0800336 struct timespec ts;
337 clock_gettime(android_log_clockid(), &ts);
Mark Salyzyn4fa06c42015-12-16 13:11:36 -0800338
Mark Salyzyn6e315682017-03-09 08:09:43 -0800339 struct packet {
340 android_pmsg_log_header_t pmsg_header;
341 android_log_header_t header;
342 android_log_event_int_t payload;
343 };
344 alignas(8) char buf[sizeof(struct packet) + 8];
345 memset(buf, 0, sizeof(buf));
346 struct packet* buffer = (struct packet*)((((uintptr_t)buf + 7) & ~7) + 1);
347 if ((((uintptr_t)&buffer->pmsg_header) & 7) != 1) {
Haibo Huang629b22b2019-06-06 21:27:48 -0700348 fprintf(stderr, "&buffer=0x%p iterations=%" PRIu64 "\n", &buffer->pmsg_header,
Mark Salyzyncecd60d2018-01-11 11:20:24 -0800349 state.iterations());
Mark Salyzyn6e315682017-03-09 08:09:43 -0800350 }
Mark Salyzyn4fa06c42015-12-16 13:11:36 -0800351
Mark Salyzyn6e315682017-03-09 08:09:43 -0800352 buffer->pmsg_header.magic = LOGGER_MAGIC;
353 buffer->pmsg_header.len =
354 sizeof(android_pmsg_log_header_t) + sizeof(android_log_header_t);
355 buffer->pmsg_header.uid = getuid();
356 buffer->pmsg_header.pid = getpid();
Mark Salyzyn4fa06c42015-12-16 13:11:36 -0800357
Mark Salyzyn6e315682017-03-09 08:09:43 -0800358 buffer->header.tid = gettid();
359 buffer->header.realtime.tv_sec = ts.tv_sec;
360 buffer->header.realtime.tv_nsec = ts.tv_nsec;
Mark Salyzyn4fa06c42015-12-16 13:11:36 -0800361
Mark Salyzyn6e315682017-03-09 08:09:43 -0800362 buffer->header.id = LOG_ID_EVENTS;
363 buffer->payload.header.tag = 0;
364 buffer->payload.payload.type = EVENT_TYPE_INT;
365 uint32_t snapshot = 0;
Tom Cherryabcdd122019-09-30 14:33:46 -0700366 buffer->payload.payload.data = snapshot;
Mark Salyzyn4fa06c42015-12-16 13:11:36 -0800367
Mark Salyzyncecd60d2018-01-11 11:20:24 -0800368 while (state.KeepRunning()) {
Mark Salyzyn6e315682017-03-09 08:09:43 -0800369 ++snapshot;
Tom Cherryabcdd122019-09-30 14:33:46 -0700370 buffer->payload.payload.data = snapshot;
Mark Salyzyn6e315682017-03-09 08:09:43 -0800371 write(pstore_fd, &buffer->pmsg_header,
372 sizeof(android_pmsg_log_header_t) + sizeof(android_log_header_t) +
373 sizeof(android_log_event_int_t));
374 }
Mark Salyzyncecd60d2018-01-11 11:20:24 -0800375 state.PauseTiming();
Mark Salyzyn6e315682017-03-09 08:09:43 -0800376 close(pstore_fd);
Mark Salyzyn4fa06c42015-12-16 13:11:36 -0800377}
378BENCHMARK(BM_pmsg_short_unaligned1);
379
380/*
381 * Measure the time it takes to submit the android logging data to pstore
382 * best case aligned single block.
383 */
Mark Salyzyncecd60d2018-01-11 11:20:24 -0800384static void BM_pmsg_long_aligned(benchmark::State& state) {
Tom Cherry96e06ea2019-02-12 11:26:23 -0800385 int pstore_fd = TEMP_FAILURE_RETRY(open("/dev/pmsg0", O_WRONLY | O_CLOEXEC));
Mark Salyzyn6e315682017-03-09 08:09:43 -0800386 if (pstore_fd < 0) {
Mark Salyzyncecd60d2018-01-11 11:20:24 -0800387 state.SkipWithError("/dev/pmsg0");
Mark Salyzyn6e315682017-03-09 08:09:43 -0800388 return;
389 }
Mark Salyzyn4fa06c42015-12-16 13:11:36 -0800390
Mark Salyzyn6e315682017-03-09 08:09:43 -0800391 /*
392 * struct {
393 * // what we provide to pstore
394 * android_pmsg_log_header_t pmsg_header;
395 * // what we provide to socket
396 * android_log_header_t header;
397 * // caller provides
398 * union {
399 * struct {
400 * char prio;
401 * char payload[];
402 * } string;
403 * struct {
404 * uint32_t tag
405 * char payload[];
406 * } binary;
407 * };
408 * };
409 */
Mark Salyzyn4fa06c42015-12-16 13:11:36 -0800410
Mark Salyzyn6e315682017-03-09 08:09:43 -0800411 struct timespec ts;
412 clock_gettime(android_log_clockid(), &ts);
Mark Salyzyn4fa06c42015-12-16 13:11:36 -0800413
Mark Salyzyn6e315682017-03-09 08:09:43 -0800414 struct packet {
415 android_pmsg_log_header_t pmsg_header;
416 android_log_header_t header;
417 android_log_event_int_t payload;
418 };
419 alignas(8) char buf[sizeof(struct packet) + 8 + LOGGER_ENTRY_MAX_PAYLOAD];
420 memset(buf, 0, sizeof(buf));
421 struct packet* buffer = (struct packet*)(((uintptr_t)buf + 7) & ~7);
422 if (((uintptr_t)&buffer->pmsg_header) & 7) {
Haibo Huang629b22b2019-06-06 21:27:48 -0700423 fprintf(stderr, "&buffer=0x%p iterations=%" PRIu64 "\n", &buffer->pmsg_header,
Mark Salyzyncecd60d2018-01-11 11:20:24 -0800424 state.iterations());
Mark Salyzyn6e315682017-03-09 08:09:43 -0800425 }
Mark Salyzyn4fa06c42015-12-16 13:11:36 -0800426
Mark Salyzyn6e315682017-03-09 08:09:43 -0800427 buffer->pmsg_header.magic = LOGGER_MAGIC;
428 buffer->pmsg_header.len =
429 sizeof(android_pmsg_log_header_t) + sizeof(android_log_header_t);
430 buffer->pmsg_header.uid = getuid();
431 buffer->pmsg_header.pid = getpid();
Mark Salyzyn4fa06c42015-12-16 13:11:36 -0800432
Mark Salyzyn6e315682017-03-09 08:09:43 -0800433 buffer->header.tid = gettid();
434 buffer->header.realtime.tv_sec = ts.tv_sec;
435 buffer->header.realtime.tv_nsec = ts.tv_nsec;
Mark Salyzyn4fa06c42015-12-16 13:11:36 -0800436
Mark Salyzyn6e315682017-03-09 08:09:43 -0800437 buffer->header.id = LOG_ID_EVENTS;
438 buffer->payload.header.tag = 0;
439 buffer->payload.payload.type = EVENT_TYPE_INT;
440 uint32_t snapshot = 0;
Tom Cherryabcdd122019-09-30 14:33:46 -0700441 buffer->payload.payload.data = snapshot;
Mark Salyzyn4fa06c42015-12-16 13:11:36 -0800442
Mark Salyzyncecd60d2018-01-11 11:20:24 -0800443 while (state.KeepRunning()) {
Mark Salyzyn6e315682017-03-09 08:09:43 -0800444 ++snapshot;
Tom Cherryabcdd122019-09-30 14:33:46 -0700445 buffer->payload.payload.data = snapshot;
Mark Salyzyn6e315682017-03-09 08:09:43 -0800446 write(pstore_fd, &buffer->pmsg_header, LOGGER_ENTRY_MAX_PAYLOAD);
447 }
Mark Salyzyncecd60d2018-01-11 11:20:24 -0800448 state.PauseTiming();
Mark Salyzyn6e315682017-03-09 08:09:43 -0800449 close(pstore_fd);
Mark Salyzyn4fa06c42015-12-16 13:11:36 -0800450}
451BENCHMARK(BM_pmsg_long_aligned);
452
453/*
454 * Measure the time it takes to submit the android logging data to pstore
455 * best case aligned single block.
456 */
Mark Salyzyncecd60d2018-01-11 11:20:24 -0800457static void BM_pmsg_long_unaligned1(benchmark::State& state) {
Tom Cherry96e06ea2019-02-12 11:26:23 -0800458 int pstore_fd = TEMP_FAILURE_RETRY(open("/dev/pmsg0", O_WRONLY | O_CLOEXEC));
Mark Salyzyn6e315682017-03-09 08:09:43 -0800459 if (pstore_fd < 0) {
Mark Salyzyncecd60d2018-01-11 11:20:24 -0800460 state.SkipWithError("/dev/pmsg0");
Mark Salyzyn6e315682017-03-09 08:09:43 -0800461 return;
462 }
Mark Salyzyn4fa06c42015-12-16 13:11:36 -0800463
Mark Salyzyn6e315682017-03-09 08:09:43 -0800464 /*
465 * struct {
466 * // what we provide to pstore
467 * android_pmsg_log_header_t pmsg_header;
468 * // what we provide to socket
469 * android_log_header_t header;
470 * // caller provides
471 * union {
472 * struct {
473 * char prio;
474 * char payload[];
475 * } string;
476 * struct {
477 * uint32_t tag
478 * char payload[];
479 * } binary;
480 * };
481 * };
482 */
Mark Salyzyn4fa06c42015-12-16 13:11:36 -0800483
Mark Salyzyn6e315682017-03-09 08:09:43 -0800484 struct timespec ts;
485 clock_gettime(android_log_clockid(), &ts);
Mark Salyzyn4fa06c42015-12-16 13:11:36 -0800486
Mark Salyzyn6e315682017-03-09 08:09:43 -0800487 struct packet {
488 android_pmsg_log_header_t pmsg_header;
489 android_log_header_t header;
490 android_log_event_int_t payload;
491 };
492 alignas(8) char buf[sizeof(struct packet) + 8 + LOGGER_ENTRY_MAX_PAYLOAD];
493 memset(buf, 0, sizeof(buf));
494 struct packet* buffer = (struct packet*)((((uintptr_t)buf + 7) & ~7) + 1);
495 if ((((uintptr_t)&buffer->pmsg_header) & 7) != 1) {
Haibo Huang629b22b2019-06-06 21:27:48 -0700496 fprintf(stderr, "&buffer=0x%p iterations=%" PRIu64 "\n", &buffer->pmsg_header,
Mark Salyzyncecd60d2018-01-11 11:20:24 -0800497 state.iterations());
Mark Salyzyn6e315682017-03-09 08:09:43 -0800498 }
Mark Salyzyn4fa06c42015-12-16 13:11:36 -0800499
Mark Salyzyn6e315682017-03-09 08:09:43 -0800500 buffer->pmsg_header.magic = LOGGER_MAGIC;
501 buffer->pmsg_header.len =
502 sizeof(android_pmsg_log_header_t) + sizeof(android_log_header_t);
503 buffer->pmsg_header.uid = getuid();
504 buffer->pmsg_header.pid = getpid();
Mark Salyzyn4fa06c42015-12-16 13:11:36 -0800505
Mark Salyzyn6e315682017-03-09 08:09:43 -0800506 buffer->header.tid = gettid();
507 buffer->header.realtime.tv_sec = ts.tv_sec;
508 buffer->header.realtime.tv_nsec = ts.tv_nsec;
Mark Salyzyn4fa06c42015-12-16 13:11:36 -0800509
Mark Salyzyn6e315682017-03-09 08:09:43 -0800510 buffer->header.id = LOG_ID_EVENTS;
511 buffer->payload.header.tag = 0;
512 buffer->payload.payload.type = EVENT_TYPE_INT;
513 uint32_t snapshot = 0;
Tom Cherryabcdd122019-09-30 14:33:46 -0700514 buffer->payload.payload.data = snapshot;
Mark Salyzyn4fa06c42015-12-16 13:11:36 -0800515
Mark Salyzyncecd60d2018-01-11 11:20:24 -0800516 while (state.KeepRunning()) {
Mark Salyzyn6e315682017-03-09 08:09:43 -0800517 ++snapshot;
Tom Cherryabcdd122019-09-30 14:33:46 -0700518 buffer->payload.payload.data = snapshot;
Mark Salyzyn6e315682017-03-09 08:09:43 -0800519 write(pstore_fd, &buffer->pmsg_header, LOGGER_ENTRY_MAX_PAYLOAD);
520 }
Mark Salyzyncecd60d2018-01-11 11:20:24 -0800521 state.PauseTiming();
Mark Salyzyn6e315682017-03-09 08:09:43 -0800522 close(pstore_fd);
Mark Salyzyn4fa06c42015-12-16 13:11:36 -0800523}
524BENCHMARK(BM_pmsg_long_unaligned1);
525
526/*
Mark Salyzyn4189ccc2015-02-04 12:40:55 -0800527 * Measure the time it takes to form sprintf plus time using
Mark Salyzyncecd60d2018-01-11 11:20:24 -0800528 * discrete acquisition under light load. Expect this to be a syscall period
529 * (2us) or sprintf time if zero-syscall time.
Mark Salyzynfb2a5da2013-11-22 12:39:43 -0800530 */
Mark Salyzyn4189ccc2015-02-04 12:40:55 -0800531/* helper function */
Mark Salyzyn6e315682017-03-09 08:09:43 -0800532static void test_print(const char* fmt, ...) {
533 va_list ap;
534 char buf[1024];
Mark Salyzyn4189ccc2015-02-04 12:40:55 -0800535
Mark Salyzyn6e315682017-03-09 08:09:43 -0800536 va_start(ap, fmt);
537 vsnprintf(buf, sizeof(buf), fmt, ap);
538 va_end(ap);
Mark Salyzyn4189ccc2015-02-04 12:40:55 -0800539}
540
Mark Salyzyn6e315682017-03-09 08:09:43 -0800541#define logd_yield() sched_yield() // allow logd to catch up
542#define logd_sleep() usleep(50) // really allow logd to catch up
Mark Salyzyn4189ccc2015-02-04 12:40:55 -0800543
544/* performance test */
Mark Salyzyncecd60d2018-01-11 11:20:24 -0800545static void BM_sprintf_overhead(benchmark::State& state) {
546 while (state.KeepRunning()) {
Haibo Huang629b22b2019-06-06 21:27:48 -0700547 test_print("BM_sprintf_overhead:%" PRIu64, state.iterations());
Mark Salyzyncecd60d2018-01-11 11:20:24 -0800548 state.PauseTiming();
Mark Salyzyn6e315682017-03-09 08:09:43 -0800549 logd_yield();
Mark Salyzyncecd60d2018-01-11 11:20:24 -0800550 state.ResumeTiming();
Mark Salyzyn6e315682017-03-09 08:09:43 -0800551 }
Mark Salyzyn4189ccc2015-02-04 12:40:55 -0800552}
553BENCHMARK(BM_sprintf_overhead);
554
555/*
556 * Measure the time it takes to submit the android printing logging call
Mark Salyzyncecd60d2018-01-11 11:20:24 -0800557 * using discrete acquisition discrete acquisition under light load. Expect
558 * this to be a dozen or so syscall periods (40us) plus time to run *printf
Mark Salyzyn4189ccc2015-02-04 12:40:55 -0800559 */
Mark Salyzyncecd60d2018-01-11 11:20:24 -0800560static void BM_log_print_overhead(benchmark::State& state) {
561 while (state.KeepRunning()) {
Haibo Huang629b22b2019-06-06 21:27:48 -0700562 __android_log_print(ANDROID_LOG_INFO, "BM_log_overhead", "%" PRIu64, state.iterations());
Mark Salyzyncecd60d2018-01-11 11:20:24 -0800563 state.PauseTiming();
Mark Salyzyn6e315682017-03-09 08:09:43 -0800564 logd_yield();
Mark Salyzyncecd60d2018-01-11 11:20:24 -0800565 state.ResumeTiming();
Mark Salyzyn6e315682017-03-09 08:09:43 -0800566 }
Mark Salyzynfb2a5da2013-11-22 12:39:43 -0800567}
Mark Salyzyn4189ccc2015-02-04 12:40:55 -0800568BENCHMARK(BM_log_print_overhead);
569
570/*
571 * Measure the time it takes to submit the android event logging call
Mark Salyzyncecd60d2018-01-11 11:20:24 -0800572 * using discrete acquisition under light load. Expect this to be a long path
573 * to logger to convert the unknown tag (0) into a tagname (less than 200us).
Mark Salyzyn4189ccc2015-02-04 12:40:55 -0800574 */
Mark Salyzyncecd60d2018-01-11 11:20:24 -0800575static void BM_log_event_overhead(benchmark::State& state) {
576 for (int64_t i = 0; state.KeepRunning(); ++i) {
Mark Salyzyncffa4c62017-03-28 11:40:55 -0700577 // log tag number 0 is not known, nor shall it ever be known
Mark Salyzyn6e315682017-03-09 08:09:43 -0800578 __android_log_btwrite(0, EVENT_TYPE_LONG, &i, sizeof(i));
Mark Salyzyncecd60d2018-01-11 11:20:24 -0800579 state.PauseTiming();
Mark Salyzyn6e315682017-03-09 08:09:43 -0800580 logd_yield();
Mark Salyzyncecd60d2018-01-11 11:20:24 -0800581 state.ResumeTiming();
Mark Salyzyn6e315682017-03-09 08:09:43 -0800582 }
Mark Salyzyn4189ccc2015-02-04 12:40:55 -0800583}
584BENCHMARK(BM_log_event_overhead);
585
Mark Salyzyncffa4c62017-03-28 11:40:55 -0700586/*
587 * Measure the time it takes to submit the android event logging call
Mark Salyzyncecd60d2018-01-11 11:20:24 -0800588 * using discrete acquisition under light load with a known logtag. Expect
589 * this to be a dozen or so syscall periods (less than 40us)
Mark Salyzyncffa4c62017-03-28 11:40:55 -0700590 */
Mark Salyzyncecd60d2018-01-11 11:20:24 -0800591static void BM_log_event_overhead_42(benchmark::State& state) {
592 for (int64_t i = 0; state.KeepRunning(); ++i) {
Mark Salyzyncffa4c62017-03-28 11:40:55 -0700593 // In system/core/logcat/event.logtags:
594 // # These are used for testing, do not modify without updating
595 // # tests/framework-tests/src/android/util/EventLogFunctionalTest.java.
596 // # system/core/liblog/tests/liblog_benchmark.cpp
597 // # system/core/liblog/tests/liblog_test.cpp
598 // 42 answer (to life the universe etc|3)
599 __android_log_btwrite(42, EVENT_TYPE_LONG, &i, sizeof(i));
Mark Salyzyncecd60d2018-01-11 11:20:24 -0800600 state.PauseTiming();
Mark Salyzyncffa4c62017-03-28 11:40:55 -0700601 logd_yield();
Mark Salyzyncecd60d2018-01-11 11:20:24 -0800602 state.ResumeTiming();
Mark Salyzyncffa4c62017-03-28 11:40:55 -0700603 }
604}
605BENCHMARK(BM_log_event_overhead_42);
606
Mark Salyzyn4189ccc2015-02-04 12:40:55 -0800607/*
608 * Measure the time it takes to submit the android event logging call
Mark Salyzyncecd60d2018-01-11 11:20:24 -0800609 * using discrete acquisition under very-light load (<1% CPU utilization).
Mark Salyzyn4189ccc2015-02-04 12:40:55 -0800610 */
Mark Salyzyncecd60d2018-01-11 11:20:24 -0800611static void BM_log_light_overhead(benchmark::State& state) {
612 for (int64_t i = 0; state.KeepRunning(); ++i) {
Mark Salyzyn6e315682017-03-09 08:09:43 -0800613 __android_log_btwrite(0, EVENT_TYPE_LONG, &i, sizeof(i));
Mark Salyzyncecd60d2018-01-11 11:20:24 -0800614 state.PauseTiming();
Mark Salyzyn6e315682017-03-09 08:09:43 -0800615 usleep(10000);
Mark Salyzyncecd60d2018-01-11 11:20:24 -0800616 state.ResumeTiming();
Mark Salyzyn6e315682017-03-09 08:09:43 -0800617 }
Mark Salyzyn4189ccc2015-02-04 12:40:55 -0800618}
619BENCHMARK(BM_log_light_overhead);
620
Mark Salyzyn6e315682017-03-09 08:09:43 -0800621static void caught_latency(int /*signum*/) {
622 unsigned long long v = 0xDEADBEEFA55A5AA5ULL;
Mark Salyzynfb2a5da2013-11-22 12:39:43 -0800623
Mark Salyzyn6e315682017-03-09 08:09:43 -0800624 LOG_FAILURE_RETRY(__android_log_btwrite(0, EVENT_TYPE_LONG, &v, sizeof(v)));
Mark Salyzynfb2a5da2013-11-22 12:39:43 -0800625}
626
Mark Salyzyn6e315682017-03-09 08:09:43 -0800627static unsigned long long caught_convert(char* cp) {
628 unsigned long long l = cp[0] & 0xFF;
629 l |= (unsigned long long)(cp[1] & 0xFF) << 8;
630 l |= (unsigned long long)(cp[2] & 0xFF) << 16;
631 l |= (unsigned long long)(cp[3] & 0xFF) << 24;
632 l |= (unsigned long long)(cp[4] & 0xFF) << 32;
633 l |= (unsigned long long)(cp[5] & 0xFF) << 40;
634 l |= (unsigned long long)(cp[6] & 0xFF) << 48;
635 l |= (unsigned long long)(cp[7] & 0xFF) << 56;
636 return l;
Mark Salyzynfb2a5da2013-11-22 12:39:43 -0800637}
638
639static const int alarm_time = 3;
640
641/*
642 * Measure the time it takes for the logd posting call to acquire the
Mark Salyzyncecd60d2018-01-11 11:20:24 -0800643 * timestamp to place into the internal record. Expect this to be less than
644 * 4 syscalls (3us). This test uses manual injection of timing because it is
645 * comparing the timestamp at send, and then picking up the corresponding log
646 * end-to-end long path from logd to see what actual timestamp was submitted.
Mark Salyzynfb2a5da2013-11-22 12:39:43 -0800647 */
Mark Salyzyncecd60d2018-01-11 11:20:24 -0800648static void BM_log_latency(benchmark::State& state) {
Mark Salyzyn6e315682017-03-09 08:09:43 -0800649 pid_t pid = getpid();
Mark Salyzynfb2a5da2013-11-22 12:39:43 -0800650
Mark Salyzyn6e315682017-03-09 08:09:43 -0800651 struct logger_list* logger_list =
652 android_logger_list_open(LOG_ID_EVENTS, ANDROID_LOG_RDONLY, 0, pid);
Mark Salyzynfb2a5da2013-11-22 12:39:43 -0800653
Mark Salyzyn6e315682017-03-09 08:09:43 -0800654 if (!logger_list) {
655 fprintf(stderr, "Unable to open events log: %s\n", strerror(errno));
656 exit(EXIT_FAILURE);
657 }
Mark Salyzynfb2a5da2013-11-22 12:39:43 -0800658
Mark Salyzyn6e315682017-03-09 08:09:43 -0800659 signal(SIGALRM, caught_latency);
660 alarm(alarm_time);
Mark Salyzynfb2a5da2013-11-22 12:39:43 -0800661
Mark Salyzyncecd60d2018-01-11 11:20:24 -0800662 for (size_t j = 0; state.KeepRunning() && j < 10 * state.iterations(); ++j) {
663 retry: // We allow transitory errors (logd overloaded) to be retried.
Mark Salyzyn6e315682017-03-09 08:09:43 -0800664 log_time ts;
665 LOG_FAILURE_RETRY((ts = log_time(CLOCK_REALTIME),
666 android_btWriteLog(0, EVENT_TYPE_LONG, &ts, sizeof(ts))));
Mark Salyzynfb2a5da2013-11-22 12:39:43 -0800667
Mark Salyzyn6e315682017-03-09 08:09:43 -0800668 for (;;) {
669 log_msg log_msg;
670 int ret = android_logger_list_read(logger_list, &log_msg);
671 alarm(alarm_time);
Mark Salyzynfb2a5da2013-11-22 12:39:43 -0800672
Mark Salyzyn6e315682017-03-09 08:09:43 -0800673 if (ret <= 0) {
Mark Salyzyncecd60d2018-01-11 11:20:24 -0800674 state.SkipWithError("android_logger_list_read");
Mark Salyzyn6e315682017-03-09 08:09:43 -0800675 break;
676 }
677 if ((log_msg.entry.len != (4 + 1 + 8)) ||
678 (log_msg.id() != LOG_ID_EVENTS)) {
679 continue;
680 }
Mark Salyzynfb2a5da2013-11-22 12:39:43 -0800681
Mark Salyzyn6e315682017-03-09 08:09:43 -0800682 char* eventData = log_msg.msg();
Mark Salyzynfb2a5da2013-11-22 12:39:43 -0800683
Mark Salyzyn6e315682017-03-09 08:09:43 -0800684 if (!eventData || (eventData[4] != EVENT_TYPE_LONG)) {
685 continue;
686 }
687 log_time tx(eventData + 4 + 1);
688 if (ts != tx) {
689 if (0xDEADBEEFA55A5AA5ULL == caught_convert(eventData + 4 + 1)) {
Mark Salyzyncecd60d2018-01-11 11:20:24 -0800690 state.SkipWithError("signal");
Mark Salyzyn6e315682017-03-09 08:09:43 -0800691 break;
Mark Salyzynfb2a5da2013-11-22 12:39:43 -0800692 }
Mark Salyzyn6e315682017-03-09 08:09:43 -0800693 continue;
694 }
695
696 uint64_t start = ts.nsec();
697 uint64_t end = log_msg.nsec();
Mark Salyzyncecd60d2018-01-11 11:20:24 -0800698 if (end < start) goto retry;
699 state.SetIterationTime((end - start) / (double)NS_PER_SEC);
Mark Salyzyn6e315682017-03-09 08:09:43 -0800700 break;
Mark Salyzynfb2a5da2013-11-22 12:39:43 -0800701 }
Mark Salyzyn6e315682017-03-09 08:09:43 -0800702 }
Mark Salyzynfb2a5da2013-11-22 12:39:43 -0800703
Mark Salyzyn6e315682017-03-09 08:09:43 -0800704 signal(SIGALRM, SIG_DFL);
705 alarm(0);
Mark Salyzynfb2a5da2013-11-22 12:39:43 -0800706
Mark Salyzyn6e315682017-03-09 08:09:43 -0800707 android_logger_list_free(logger_list);
Mark Salyzynfb2a5da2013-11-22 12:39:43 -0800708}
Mark Salyzyncecd60d2018-01-11 11:20:24 -0800709// Default gets out of hand for this test, so we set a reasonable number of
710// iterations for a timely result.
711BENCHMARK(BM_log_latency)->UseManualTime()->Iterations(200);
Mark Salyzynfb2a5da2013-11-22 12:39:43 -0800712
Mark Salyzyn6e315682017-03-09 08:09:43 -0800713static void caught_delay(int /*signum*/) {
714 unsigned long long v = 0xDEADBEEFA55A5AA6ULL;
Mark Salyzynfb2a5da2013-11-22 12:39:43 -0800715
Mark Salyzyn6e315682017-03-09 08:09:43 -0800716 LOG_FAILURE_RETRY(__android_log_btwrite(0, EVENT_TYPE_LONG, &v, sizeof(v)));
Mark Salyzynfb2a5da2013-11-22 12:39:43 -0800717}
718
719/*
720 * Measure the time it takes for the logd posting call to make it into
721 * the logs. Expect this to be less than double the process wakeup time (2ms).
722 */
Mark Salyzyncecd60d2018-01-11 11:20:24 -0800723static void BM_log_delay(benchmark::State& state) {
Mark Salyzyn6e315682017-03-09 08:09:43 -0800724 pid_t pid = getpid();
Mark Salyzynfb2a5da2013-11-22 12:39:43 -0800725
Mark Salyzyn6e315682017-03-09 08:09:43 -0800726 struct logger_list* logger_list =
727 android_logger_list_open(LOG_ID_EVENTS, ANDROID_LOG_RDONLY, 0, pid);
Mark Salyzynfb2a5da2013-11-22 12:39:43 -0800728
Mark Salyzyn6e315682017-03-09 08:09:43 -0800729 if (!logger_list) {
730 fprintf(stderr, "Unable to open events log: %s\n", strerror(errno));
731 exit(EXIT_FAILURE);
732 }
Mark Salyzynfb2a5da2013-11-22 12:39:43 -0800733
Mark Salyzyn6e315682017-03-09 08:09:43 -0800734 signal(SIGALRM, caught_delay);
735 alarm(alarm_time);
Mark Salyzynfb2a5da2013-11-22 12:39:43 -0800736
Mark Salyzyncecd60d2018-01-11 11:20:24 -0800737 while (state.KeepRunning()) {
Mark Salyzyn6e315682017-03-09 08:09:43 -0800738 log_time ts(CLOCK_REALTIME);
Mark Salyzynfb2a5da2013-11-22 12:39:43 -0800739
Mark Salyzyn6e315682017-03-09 08:09:43 -0800740 LOG_FAILURE_RETRY(android_btWriteLog(0, EVENT_TYPE_LONG, &ts, sizeof(ts)));
Mark Salyzynfb2a5da2013-11-22 12:39:43 -0800741
Mark Salyzyn6e315682017-03-09 08:09:43 -0800742 for (;;) {
743 log_msg log_msg;
744 int ret = android_logger_list_read(logger_list, &log_msg);
745 alarm(alarm_time);
Mark Salyzynfb2a5da2013-11-22 12:39:43 -0800746
Mark Salyzyn6e315682017-03-09 08:09:43 -0800747 if (ret <= 0) {
Mark Salyzyncecd60d2018-01-11 11:20:24 -0800748 state.SkipWithError("android_logger_list_read");
Mark Salyzyn6e315682017-03-09 08:09:43 -0800749 break;
750 }
751 if ((log_msg.entry.len != (4 + 1 + 8)) ||
752 (log_msg.id() != LOG_ID_EVENTS)) {
753 continue;
754 }
Mark Salyzynfb2a5da2013-11-22 12:39:43 -0800755
Mark Salyzyn6e315682017-03-09 08:09:43 -0800756 char* eventData = log_msg.msg();
Mark Salyzynfb2a5da2013-11-22 12:39:43 -0800757
Mark Salyzyn6e315682017-03-09 08:09:43 -0800758 if (!eventData || (eventData[4] != EVENT_TYPE_LONG)) {
759 continue;
760 }
761 log_time tx(eventData + 4 + 1);
762 if (ts != tx) {
763 if (0xDEADBEEFA55A5AA6ULL == caught_convert(eventData + 4 + 1)) {
Mark Salyzyncecd60d2018-01-11 11:20:24 -0800764 state.SkipWithError("signal");
Mark Salyzyn6e315682017-03-09 08:09:43 -0800765 break;
Mark Salyzynfb2a5da2013-11-22 12:39:43 -0800766 }
Mark Salyzyn6e315682017-03-09 08:09:43 -0800767 continue;
768 }
769
770 break;
Mark Salyzynfb2a5da2013-11-22 12:39:43 -0800771 }
Mark Salyzyn6e315682017-03-09 08:09:43 -0800772 }
Mark Salyzyncecd60d2018-01-11 11:20:24 -0800773 state.PauseTiming();
Mark Salyzynfb2a5da2013-11-22 12:39:43 -0800774
Mark Salyzyn6e315682017-03-09 08:09:43 -0800775 signal(SIGALRM, SIG_DFL);
776 alarm(0);
Mark Salyzynfb2a5da2013-11-22 12:39:43 -0800777
Mark Salyzyn6e315682017-03-09 08:09:43 -0800778 android_logger_list_free(logger_list);
Mark Salyzynfb2a5da2013-11-22 12:39:43 -0800779}
780BENCHMARK(BM_log_delay);
Mark Salyzyn4f808ef2015-04-23 15:08:11 -0700781
782/*
783 * Measure the time it takes for __android_log_is_loggable.
784 */
Mark Salyzyncecd60d2018-01-11 11:20:24 -0800785static void BM_is_loggable(benchmark::State& state) {
Mark Salyzyn6e315682017-03-09 08:09:43 -0800786 static const char logd[] = "logd";
Mark Salyzyn29d0b832016-09-22 09:56:51 -0700787
Mark Salyzyncecd60d2018-01-11 11:20:24 -0800788 while (state.KeepRunning()) {
Mark Salyzyn6e315682017-03-09 08:09:43 -0800789 __android_log_is_loggable_len(ANDROID_LOG_WARN, logd, strlen(logd),
790 ANDROID_LOG_VERBOSE);
791 }
Mark Salyzyn4f808ef2015-04-23 15:08:11 -0700792}
793BENCHMARK(BM_is_loggable);
Mark Salyzynd4860192015-12-21 12:32:48 -0800794
795/*
796 * Measure the time it takes for android_log_clockid.
797 */
Mark Salyzyncecd60d2018-01-11 11:20:24 -0800798static void BM_clockid(benchmark::State& state) {
799 while (state.KeepRunning()) {
Mark Salyzyn6e315682017-03-09 08:09:43 -0800800 android_log_clockid();
801 }
Mark Salyzynd4860192015-12-21 12:32:48 -0800802}
803BENCHMARK(BM_clockid);
804
805/*
806 * Measure the time it takes for __android_log_security.
807 */
Mark Salyzyncecd60d2018-01-11 11:20:24 -0800808static void BM_security(benchmark::State& state) {
809 while (state.KeepRunning()) {
Mark Salyzyn6e315682017-03-09 08:09:43 -0800810 __android_log_security();
811 }
Mark Salyzynd4860192015-12-21 12:32:48 -0800812}
813BENCHMARK(BM_security);
Mark Salyzyna2b5b562016-11-22 13:08:59 -0800814
815// Keep maps around for multiple iterations
816static std::unordered_set<uint32_t> set;
Mark Salyzyn777ea342016-09-21 09:24:13 -0700817static EventTagMap* map;
Mark Salyzyna2b5b562016-11-22 13:08:59 -0800818
819static bool prechargeEventMap() {
Mark Salyzyn6e315682017-03-09 08:09:43 -0800820 if (map) return true;
Mark Salyzyna2b5b562016-11-22 13:08:59 -0800821
Mark Salyzyn6e315682017-03-09 08:09:43 -0800822 fprintf(stderr, "Precharge: start\n");
Mark Salyzyna2b5b562016-11-22 13:08:59 -0800823
Mark Salyzyn6e315682017-03-09 08:09:43 -0800824 map = android_openEventTagMap(NULL);
825 for (uint32_t tag = 1; tag < USHRT_MAX; ++tag) {
826 size_t len;
827 if (android_lookupEventTag_len(map, &len, tag) == NULL) continue;
828 set.insert(tag);
829 }
Mark Salyzyna2b5b562016-11-22 13:08:59 -0800830
Mark Salyzyn6e315682017-03-09 08:09:43 -0800831 fprintf(stderr, "Precharge: stop %zu\n", set.size());
Mark Salyzyna2b5b562016-11-22 13:08:59 -0800832
Mark Salyzyn6e315682017-03-09 08:09:43 -0800833 return true;
Mark Salyzyna2b5b562016-11-22 13:08:59 -0800834}
835
836/*
837 * Measure the time it takes for android_lookupEventTag_len
838 */
Mark Salyzyncecd60d2018-01-11 11:20:24 -0800839static void BM_lookupEventTag(benchmark::State& state) {
Mark Salyzyn6e315682017-03-09 08:09:43 -0800840 prechargeEventMap();
Mark Salyzyna2b5b562016-11-22 13:08:59 -0800841
Mark Salyzyn6e315682017-03-09 08:09:43 -0800842 std::unordered_set<uint32_t>::const_iterator it = set.begin();
Mark Salyzyna2b5b562016-11-22 13:08:59 -0800843
Mark Salyzyncecd60d2018-01-11 11:20:24 -0800844 while (state.KeepRunning()) {
Mark Salyzyn6e315682017-03-09 08:09:43 -0800845 size_t len;
846 android_lookupEventTag_len(map, &len, (*it));
847 ++it;
848 if (it == set.end()) it = set.begin();
849 }
Mark Salyzyna2b5b562016-11-22 13:08:59 -0800850}
851BENCHMARK(BM_lookupEventTag);
852
853/*
854 * Measure the time it takes for android_lookupEventTag_len
855 */
856static uint32_t notTag = 1;
857
Mark Salyzyncecd60d2018-01-11 11:20:24 -0800858static void BM_lookupEventTag_NOT(benchmark::State& state) {
Mark Salyzyn6e315682017-03-09 08:09:43 -0800859 prechargeEventMap();
Mark Salyzyna2b5b562016-11-22 13:08:59 -0800860
Mark Salyzyn6e315682017-03-09 08:09:43 -0800861 while (set.find(notTag) != set.end()) {
Mark Salyzyna2b5b562016-11-22 13:08:59 -0800862 ++notTag;
863 if (notTag >= USHRT_MAX) notTag = 1;
Mark Salyzyn6e315682017-03-09 08:09:43 -0800864 }
865
Mark Salyzyncecd60d2018-01-11 11:20:24 -0800866 while (state.KeepRunning()) {
Mark Salyzyn6e315682017-03-09 08:09:43 -0800867 size_t len;
868 android_lookupEventTag_len(map, &len, notTag);
869 }
870
Mark Salyzyn6e315682017-03-09 08:09:43 -0800871 ++notTag;
872 if (notTag >= USHRT_MAX) notTag = 1;
Mark Salyzyna2b5b562016-11-22 13:08:59 -0800873}
874BENCHMARK(BM_lookupEventTag_NOT);
875
876/*
877 * Measure the time it takes for android_lookupEventFormat_len
878 */
Mark Salyzyncecd60d2018-01-11 11:20:24 -0800879static void BM_lookupEventFormat(benchmark::State& state) {
Mark Salyzyn6e315682017-03-09 08:09:43 -0800880 prechargeEventMap();
Mark Salyzyna2b5b562016-11-22 13:08:59 -0800881
Mark Salyzyn6e315682017-03-09 08:09:43 -0800882 std::unordered_set<uint32_t>::const_iterator it = set.begin();
Mark Salyzyna2b5b562016-11-22 13:08:59 -0800883
Mark Salyzyncecd60d2018-01-11 11:20:24 -0800884 while (state.KeepRunning()) {
Mark Salyzyn6e315682017-03-09 08:09:43 -0800885 size_t len;
886 android_lookupEventFormat_len(map, &len, (*it));
887 ++it;
888 if (it == set.end()) it = set.begin();
889 }
Mark Salyzyna2b5b562016-11-22 13:08:59 -0800890}
891BENCHMARK(BM_lookupEventFormat);
Mark Salyzyn777ea342016-09-21 09:24:13 -0700892
893/*
894 * Measure the time it takes for android_lookupEventTagNum plus above
895 */
Mark Salyzyncecd60d2018-01-11 11:20:24 -0800896static void BM_lookupEventTagNum(benchmark::State& state) {
Mark Salyzyn6e315682017-03-09 08:09:43 -0800897 prechargeEventMap();
Mark Salyzyn777ea342016-09-21 09:24:13 -0700898
Mark Salyzyn6e315682017-03-09 08:09:43 -0800899 std::unordered_set<uint32_t>::const_iterator it = set.begin();
Mark Salyzyn777ea342016-09-21 09:24:13 -0700900
Mark Salyzyncecd60d2018-01-11 11:20:24 -0800901 while (state.KeepRunning()) {
Mark Salyzyn6e315682017-03-09 08:09:43 -0800902 size_t len;
903 const char* name = android_lookupEventTag_len(map, &len, (*it));
904 std::string Name(name, len);
905 const char* format = android_lookupEventFormat_len(map, &len, (*it));
906 std::string Format(format, len);
Mark Salyzyncecd60d2018-01-11 11:20:24 -0800907 state.ResumeTiming();
Mark Salyzyn6e315682017-03-09 08:09:43 -0800908 android_lookupEventTagNum(map, Name.c_str(), Format.c_str(),
909 ANDROID_LOG_UNKNOWN);
Mark Salyzyncecd60d2018-01-11 11:20:24 -0800910 state.PauseTiming();
Mark Salyzyn6e315682017-03-09 08:09:43 -0800911 ++it;
912 if (it == set.end()) it = set.begin();
913 }
Mark Salyzyn777ea342016-09-21 09:24:13 -0700914}
915BENCHMARK(BM_lookupEventTagNum);
916
Tom Cherryf459c582019-11-14 08:56:39 -0800917// Must be functionally identical to liblog internal SendLogdControlMessage()
Mark Salyzyn6e315682017-03-09 08:09:43 -0800918static void send_to_control(char* buf, size_t len) {
Tom Cherry96e06ea2019-02-12 11:26:23 -0800919 int sock =
920 socket_local_client("logd", ANDROID_SOCKET_NAMESPACE_RESERVED, SOCK_STREAM | SOCK_CLOEXEC);
Mark Salyzyn6e315682017-03-09 08:09:43 -0800921 if (sock < 0) return;
922 size_t writeLen = strlen(buf) + 1;
Mark Salyzyn777ea342016-09-21 09:24:13 -0700923
Mark Salyzyn6e315682017-03-09 08:09:43 -0800924 ssize_t ret = TEMP_FAILURE_RETRY(write(sock, buf, writeLen));
925 if (ret <= 0) {
Mark Salyzyn777ea342016-09-21 09:24:13 -0700926 close(sock);
Mark Salyzyn6e315682017-03-09 08:09:43 -0800927 return;
928 }
929 while ((ret = read(sock, buf, len)) > 0) {
930 if (((size_t)ret == len) || (len < PAGE_SIZE)) {
931 break;
932 }
933 len -= ret;
934 buf += ret;
935
936 struct pollfd p = {.fd = sock, .events = POLLIN, .revents = 0 };
937
938 ret = poll(&p, 1, 20);
939 if ((ret <= 0) || !(p.revents & POLLIN)) {
940 break;
941 }
942 }
943 close(sock);
Mark Salyzyn777ea342016-09-21 09:24:13 -0700944}
945
Mark Salyzyncecd60d2018-01-11 11:20:24 -0800946static void BM_lookupEventTagNum_logd_new(benchmark::State& state) {
Mark Salyzyn6e315682017-03-09 08:09:43 -0800947 fprintf(stderr,
948 "WARNING: "
949 "This test can cause logd to grow in size and hit DOS limiter\n");
950 // Make copies
951 static const char empty_event_log_tags[] = "# content owned by logd\n";
952 static const char dev_event_log_tags_path[] = "/dev/event-log-tags";
953 std::string dev_event_log_tags;
954 if (android::base::ReadFileToString(dev_event_log_tags_path,
955 &dev_event_log_tags) &&
956 (dev_event_log_tags.length() == 0)) {
957 dev_event_log_tags = empty_event_log_tags;
958 }
959 static const char data_event_log_tags_path[] =
960 "/data/misc/logd/event-log-tags";
961 std::string data_event_log_tags;
962 if (android::base::ReadFileToString(data_event_log_tags_path,
963 &data_event_log_tags) &&
964 (data_event_log_tags.length() == 0)) {
965 data_event_log_tags = empty_event_log_tags;
966 }
Mark Salyzyn777ea342016-09-21 09:24:13 -0700967
Mark Salyzyncecd60d2018-01-11 11:20:24 -0800968 while (state.KeepRunning()) {
Mark Salyzyn6e315682017-03-09 08:09:43 -0800969 char buffer[256];
970 memset(buffer, 0, sizeof(buffer));
971 log_time now(CLOCK_MONOTONIC);
972 char name[64];
973 snprintf(name, sizeof(name), "a%" PRIu64, now.nsec());
974 snprintf(buffer, sizeof(buffer), "getEventTag name=%s format=\"(new|1)\"",
975 name);
Mark Salyzyncecd60d2018-01-11 11:20:24 -0800976 state.ResumeTiming();
Mark Salyzyn6e315682017-03-09 08:09:43 -0800977 send_to_control(buffer, sizeof(buffer));
Mark Salyzyncecd60d2018-01-11 11:20:24 -0800978 state.PauseTiming();
Mark Salyzyn6e315682017-03-09 08:09:43 -0800979 }
Mark Salyzyn777ea342016-09-21 09:24:13 -0700980
Mark Salyzyn6e315682017-03-09 08:09:43 -0800981 // Restore copies (logd still know about them, until crash or reboot)
982 if (dev_event_log_tags.length() &&
983 !android::base::WriteStringToFile(dev_event_log_tags,
984 dev_event_log_tags_path)) {
985 fprintf(stderr,
986 "WARNING: "
987 "failed to restore %s\n",
988 dev_event_log_tags_path);
989 }
990 if (data_event_log_tags.length() &&
991 !android::base::WriteStringToFile(data_event_log_tags,
992 data_event_log_tags_path)) {
993 fprintf(stderr,
994 "WARNING: "
995 "failed to restore %s\n",
996 data_event_log_tags_path);
997 }
998 fprintf(stderr,
999 "WARNING: "
1000 "Restarting logd to make it forget what we just did\n");
1001 system("stop logd ; start logd");
Mark Salyzyn777ea342016-09-21 09:24:13 -07001002}
1003BENCHMARK(BM_lookupEventTagNum_logd_new);
1004
Mark Salyzyncecd60d2018-01-11 11:20:24 -08001005static void BM_lookupEventTagNum_logd_existing(benchmark::State& state) {
Mark Salyzyn6e315682017-03-09 08:09:43 -08001006 prechargeEventMap();
Mark Salyzyn777ea342016-09-21 09:24:13 -07001007
Mark Salyzyn6e315682017-03-09 08:09:43 -08001008 std::unordered_set<uint32_t>::const_iterator it = set.begin();
Mark Salyzyn777ea342016-09-21 09:24:13 -07001009
Mark Salyzyncecd60d2018-01-11 11:20:24 -08001010 while (state.KeepRunning()) {
Mark Salyzyn6e315682017-03-09 08:09:43 -08001011 size_t len;
1012 const char* name = android_lookupEventTag_len(map, &len, (*it));
1013 std::string Name(name, len);
1014 const char* format = android_lookupEventFormat_len(map, &len, (*it));
1015 std::string Format(format, len);
Mark Salyzyn777ea342016-09-21 09:24:13 -07001016
Mark Salyzyn6e315682017-03-09 08:09:43 -08001017 char buffer[256];
1018 snprintf(buffer, sizeof(buffer), "getEventTag name=%s format=\"%s\"",
1019 Name.c_str(), Format.c_str());
Mark Salyzyn777ea342016-09-21 09:24:13 -07001020
Mark Salyzyncecd60d2018-01-11 11:20:24 -08001021 state.ResumeTiming();
Mark Salyzyn6e315682017-03-09 08:09:43 -08001022 send_to_control(buffer, sizeof(buffer));
Mark Salyzyncecd60d2018-01-11 11:20:24 -08001023 state.PauseTiming();
Mark Salyzyn6e315682017-03-09 08:09:43 -08001024 ++it;
1025 if (it == set.end()) it = set.begin();
1026 }
Mark Salyzyn777ea342016-09-21 09:24:13 -07001027}
1028BENCHMARK(BM_lookupEventTagNum_logd_existing);
Tom Cherry71054b22020-02-21 15:08:40 -08001029
1030static void BM_log_verbose_overhead(benchmark::State& state) {
1031 std::string test_log_tag = "liblog_verbose_tag";
1032 android::base::SetProperty("log.tag." + test_log_tag, "I");
1033 for (auto _ : state) {
1034 __android_log_print(ANDROID_LOG_VERBOSE, test_log_tag.c_str(), "%s test log message %d %d",
1035 "test test", 123, 456);
1036 }
1037 android::base::SetProperty("log.tag." + test_log_tag, "");
1038}
1039BENCHMARK(BM_log_verbose_overhead);