blob: ffbb4a52ebda0bc9375c331882989802740bdee4 [file] [log] [blame]
Igor Opaniukab88c952017-02-14 13:22:54 +02001/*
2 * Copyright (c) 2016, Linaro Limited
3 * All rights reserved.
4 *
5 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted provided that the following conditions are met:
7 *
8 * 1. Redistributions of source code must retain the above copyright notice,
9 * this list of conditions and the following disclaimer.
10 *
11 * 2. Redistributions in binary form must reproduce the above copyright notice,
12 * this list of conditions and the following disclaimer in the documentation
13 * and/or other materials provided with the distribution.
14 *
15 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
16 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
17 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
18 * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
19 * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
20 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
21 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
22 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
23 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
24 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
25 * POSSIBILITY OF SUCH DAMAGE.
26 */
27
28#include <errno.h>
29#include <fcntl.h>
30#include <inttypes.h>
31#include <limits.h>
32#include <libgen.h>
33#include <pthread.h>
34#include <string.h>
35#include <stdio.h>
36#include <stdbool.h>
37#include <stdlib.h>
38#include <sys/types.h>
39#include <sys/mman.h>
40#include <sys/stat.h>
41#include <sys/wait.h>
42#include <unistd.h>
Igor Opaniukf1f3fd02017-09-14 15:34:56 +030043#include <yaml.h>
Igor Opaniukab88c952017-02-14 13:22:54 +020044
45#include "benchmark_aux.h"
Igor Opaniukf1f3fd02017-09-14 15:34:56 +030046#include "common.h"
Igor Opaniukab88c952017-02-14 13:22:54 +020047
Igor Opaniukf1f3fd02017-09-14 15:34:56 +030048#define MAX_SCALAR 20
49static struct tee_ts_global *bench_ts_global;
Igor Opaniukab88c952017-02-14 13:22:54 +020050
51static const TEEC_UUID pta_benchmark_uuid = PTA_BENCHMARK_UUID;
Igor Opaniukab88c952017-02-14 13:22:54 +020052static TEEC_Context ctx;
53static TEEC_Session sess;
54
Igor Opaniuk55fcc4a2018-02-06 19:20:22 +020055static sig_atomic_t is_running;
Igor Opaniukf1f3fd02017-09-14 15:34:56 +030056static yaml_emitter_t emitter;
57
58
59void sigint_handler(int data)
60{
61 (void)data;
62
63 is_running = 0;
64}
65
Igor Opaniukab88c952017-02-14 13:22:54 +020066static void open_bench_pta(void)
67{
68 TEEC_Result res;
69 uint32_t err_origin;
70
71 res = TEEC_InitializeContext(NULL, &ctx);
72 tee_check_res(res, "TEEC_InitializeContext");
73
74 res = TEEC_OpenSession(&ctx, &sess, &pta_benchmark_uuid,
75 TEEC_LOGIN_PUBLIC, NULL, NULL, &err_origin);
76 tee_check_res(res, "TEEC_OpenSession");
77}
78
79static void close_bench_pta(void)
80{
81 /* release benchmark timestamp shm */
Igor Opaniukab88c952017-02-14 13:22:54 +020082 TEEC_CloseSession(&sess);
83 TEEC_FinalizeContext(&ctx);
84}
85
Igor Opaniuk55fcc4a2018-02-06 19:20:22 +020086static void alloc_bench_buf(uint32_t cores)
Igor Opaniukab88c952017-02-14 13:22:54 +020087{
88 TEEC_Result res;
89 TEEC_Operation op = { 0 };
90 uint32_t ret_orig;
Igor Opaniuk55fcc4a2018-02-06 19:20:22 +020091 intptr_t paddr_ts_buf = 0;
92 size_t size;
Igor Opaniukab88c952017-02-14 13:22:54 +020093
Igor Opaniuk55fcc4a2018-02-06 19:20:22 +020094 op.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INOUT,
95 TEEC_VALUE_INPUT, TEEC_NONE, TEEC_NONE);
Igor Opaniukab88c952017-02-14 13:22:54 +020096
Igor Opaniuk55fcc4a2018-02-06 19:20:22 +020097 op.params[1].value.a = cores;
Igor Opaniukab88c952017-02-14 13:22:54 +020098
Igor Opaniuk55fcc4a2018-02-06 19:20:22 +020099 res = TEEC_InvokeCommand(&sess, BENCHMARK_CMD_REGISTER_MEMREF,
Igor Opaniukab88c952017-02-14 13:22:54 +0200100 &op, &ret_orig);
101 tee_check_res(res, "TEEC_InvokeCommand");
Igor Opaniuk55fcc4a2018-02-06 19:20:22 +0200102
103 paddr_ts_buf = op.params[0].value.a;
104 size = op.params[0].value.b;
105
106 INFO("ts buffer paddr = %x, size = %d\n", paddr_ts_buf, size);
107 if (paddr_ts_buf) {
108
109 bench_ts_global = mmap_paddr(paddr_ts_buf, size);
110 if (!bench_ts_global)
111 ERROR_EXIT("Failed to allocate timestamp buffer");
112 } else {
113 ERROR_EXIT("Failed to allocate timestamp buffer");
114 }
Igor Opaniukab88c952017-02-14 13:22:54 +0200115}
116
Igor Opaniuk55fcc4a2018-02-06 19:20:22 +0200117static void free_bench_buf(void)
Igor Opaniukab88c952017-02-14 13:22:54 +0200118{
119 TEEC_Result res;
120 TEEC_Operation op = { 0 };
121 uint32_t ret_orig;
122
123 op.paramTypes = TEEC_PARAM_TYPES(TEEC_NONE,
124 TEEC_NONE, TEEC_NONE, TEEC_NONE);
125
126 res = TEEC_InvokeCommand(&sess, BENCHMARK_CMD_UNREGISTER,
127 &op, &ret_orig);
128 tee_check_res(res, "TEEC_InvokeCommand");
129}
130
131static void usage(char *progname)
132{
133 fprintf(stderr, "Call latency benchmark tool for OP-TEE\n\n");
134 fprintf(stderr, "Usage:\n");
135 fprintf(stderr, " %s -h\n", progname);
136 fprintf(stderr, " %s host_app [host_app_args]\n", progname);
137 fprintf(stderr, "Options:\n");
138 fprintf(stderr, " -h Print this help and exit\n");
139 fprintf(stderr, " host_app Path to host app to benchmark\n");
140 fprintf(stderr, " host_app_args Original host app args\n");
141}
142
143static int timestamp_pop(struct tee_ts_cpu_buf *cpu_buf,
Igor Opaniuk55fcc4a2018-02-06 19:20:22 +0200144 struct tee_time_st *ts)
Igor Opaniukab88c952017-02-14 13:22:54 +0200145{
146 uint64_t ts_tail;
147
148 if (!cpu_buf && !ts)
149 return RING_BADPARM;
150
151 if (cpu_buf->tail >= cpu_buf->head)
152 return RING_NODATA;
153
154 ts_tail = cpu_buf->tail++;
155 *ts = cpu_buf->stamps[ts_tail & TEE_BENCH_MAX_MASK];
156
157 return 0;
158}
159
Igor Opaniukf1f3fd02017-09-14 15:34:56 +0300160static bool init_emitter(FILE *ts_file)
161{
162 yaml_event_t event;
163
164 if (!yaml_emitter_initialize(&emitter))
165 ERROR_RETURN_FALSE("Can't initialize YAML emitter");
166
167 yaml_emitter_set_canonical(&emitter, 0);
168 yaml_emitter_set_unicode(&emitter, 1);
169 yaml_emitter_set_output_file(&emitter, ts_file);
170
171 /* Stream start */
172 if (!yaml_stream_start_event_initialize(&event, YAML_UTF8_ENCODING))
173 ERROR_GOTO(emitter_delete,
Igor Opaniuk66e23bf2018-02-06 19:18:59 +0200174 "Failed to initialize YAML stream start event");
Igor Opaniukf1f3fd02017-09-14 15:34:56 +0300175 if (!yaml_emitter_emit(&emitter, &event))
Igor Opaniuk66e23bf2018-02-06 19:18:59 +0200176 ERROR_GOTO(emitter_delete,
177 "Failed to emit YAML stream start event");
Igor Opaniukf1f3fd02017-09-14 15:34:56 +0300178
179 /* Document start */
180 if (!yaml_document_start_event_initialize(&event,
Igor Opaniuk66e23bf2018-02-06 19:18:59 +0200181 NULL, NULL, NULL, YAML_IMPLICIT))
Igor Opaniukf1f3fd02017-09-14 15:34:56 +0300182 ERROR_GOTO(emitter_delete,
Igor Opaniuk66e23bf2018-02-06 19:18:59 +0200183 "Failed to initialize YAML document start event");
Igor Opaniukf1f3fd02017-09-14 15:34:56 +0300184 if (!yaml_emitter_emit(&emitter, &event))
Igor Opaniuk66e23bf2018-02-06 19:18:59 +0200185 ERROR_GOTO(emitter_delete,
186 "Failed to emit YAML doc start event");
Igor Opaniukf1f3fd02017-09-14 15:34:56 +0300187
188 /* Mapping start */
189 if (!yaml_mapping_start_event_initialize(&event,
190 NULL, NULL , YAML_IMPLICIT,
191 YAML_ANY_SEQUENCE_STYLE))
192 ERROR_GOTO(emitter_delete,
Igor Opaniuk66e23bf2018-02-06 19:18:59 +0200193 "Failed to initialize YAML mapping start event");
Igor Opaniukf1f3fd02017-09-14 15:34:56 +0300194 if (!yaml_emitter_emit(&emitter, &event))
195 ERROR_GOTO(emitter_delete,
Igor Opaniuk66e23bf2018-02-06 19:18:59 +0200196 "Failed to emit YAML sequence mapping event");
Igor Opaniukf1f3fd02017-09-14 15:34:56 +0300197 /* Key timestamps */
198 yaml_scalar_event_initialize(&event, NULL, NULL,
199 (yaml_char_t *)"timestamps", -1, 1, 1, YAML_PLAIN_SCALAR_STYLE);
200 if (!yaml_emitter_emit(&emitter, &event))
201 ERROR_RETURN_FALSE("Failed to emit YAML scalar");
202
203 /* Sequence start */
204 if (!yaml_sequence_start_event_initialize(&event,
205 NULL, NULL , YAML_IMPLICIT,
206 YAML_ANY_SEQUENCE_STYLE))
207 ERROR_GOTO(emitter_delete,
Igor Opaniuk66e23bf2018-02-06 19:18:59 +0200208 "Failed to initialize YAML sequence start event");
Igor Opaniukf1f3fd02017-09-14 15:34:56 +0300209 if (!yaml_emitter_emit(&emitter, &event))
Igor Opaniuk66e23bf2018-02-06 19:18:59 +0200210 ERROR_GOTO(emitter_delete,
211 "Failed to emit YAML sequence start event");
Igor Opaniukf1f3fd02017-09-14 15:34:56 +0300212
213 return true;
214emitter_delete:
215 yaml_emitter_delete(&emitter);
216 return false;
217}
218
219static void deinit_emitter()
220{
221 yaml_event_t event;
222
223 /* Sequence cmd */
224 if (!yaml_sequence_end_event_initialize(&event))
225 ERROR_GOTO(emitter_delete,
Igor Opaniuk66e23bf2018-02-06 19:18:59 +0200226 "Failed to initialize YAML sequence end event");
Igor Opaniukf1f3fd02017-09-14 15:34:56 +0300227 if (!yaml_emitter_emit(&emitter, &event))
Igor Opaniuk66e23bf2018-02-06 19:18:59 +0200228 ERROR_GOTO(emitter_delete,
229 "Failed to emit YAML sequence end event");
Igor Opaniukf1f3fd02017-09-14 15:34:56 +0300230
231 /* Mapping end */
232 if (!yaml_mapping_end_event_initialize(&event))
233 ERROR_GOTO(emitter_delete,
Igor Opaniuk66e23bf2018-02-06 19:18:59 +0200234 "Failed to initialize YAML mapping end event");
Igor Opaniukf1f3fd02017-09-14 15:34:56 +0300235 if (!yaml_emitter_emit(&emitter, &event))
236 ERROR_GOTO(emitter_delete,
Igor Opaniuk66e23bf2018-02-06 19:18:59 +0200237 "Failed to emit YAML mapping end event");
Igor Opaniukf1f3fd02017-09-14 15:34:56 +0300238
239 /* Document end */
240 if (!yaml_document_end_event_initialize(&event, 0))
241 ERROR_GOTO(emitter_delete,
Igor Opaniuk66e23bf2018-02-06 19:18:59 +0200242 "Failed to initialize YAML document end event");
Igor Opaniukf1f3fd02017-09-14 15:34:56 +0300243 if (!yaml_emitter_emit(&emitter, &event))
244 ERROR_GOTO(emitter_delete, "Failed to emit YAML doc end event");
245
246 /* Stream end */
247 if (!yaml_stream_end_event_initialize(&event))
248 ERROR_GOTO(emitter_delete,
Igor Opaniuk66e23bf2018-02-06 19:18:59 +0200249 "Failed to initialise YAML stream end event");
Igor Opaniukf1f3fd02017-09-14 15:34:56 +0300250 if (!yaml_emitter_emit(&emitter, &event))
Igor Opaniuk66e23bf2018-02-06 19:18:59 +0200251 ERROR_GOTO(emitter_delete,
252 "Failed to emit YAML stream end event");
Igor Opaniukf1f3fd02017-09-14 15:34:56 +0300253
254emitter_delete:
255 yaml_emitter_delete(&emitter);
256}
257
258static bool fill_map(char *var, char *value)
259{
260 yaml_event_t event;
261
262 yaml_scalar_event_initialize(&event, NULL, NULL,
263 (yaml_char_t *)var, -1, 1, 1, YAML_PLAIN_SCALAR_STYLE);
264 if (!yaml_emitter_emit(&emitter, &event))
265 ERROR_RETURN_FALSE("Failed to emit YAML scalar");
266
267 yaml_scalar_event_initialize(&event, NULL, NULL,
268 (yaml_char_t *)value, -1, 1, 1, YAML_PLAIN_SCALAR_STYLE);
269 if (!yaml_emitter_emit(&emitter, &event))
270 ERROR_RETURN_FALSE("Failed to emit YAML scalar");
271
272 return true;
273}
274
275static bool fill_timestamp(uint32_t core, uint64_t count, uint64_t addr,
276 const char *subsystem)
277{
278 yaml_event_t event;
279 char data[MAX_SCALAR];
280
281 /* Mapping start */
282 if (!yaml_mapping_start_event_initialize(&event,
283 NULL, NULL , YAML_IMPLICIT,
284 YAML_ANY_SEQUENCE_STYLE))
Igor Opaniuk66e23bf2018-02-06 19:18:59 +0200285 ERROR_RETURN_FALSE(
286 "Failed to initialize YAML mapping start event");
Igor Opaniukf1f3fd02017-09-14 15:34:56 +0300287 if (!yaml_emitter_emit(&emitter, &event))
288 ERROR_RETURN_FALSE("Failed to emit YAML mapping start event");
289
290 snprintf(data, MAX_SCALAR, "%" PRIu32, core);
291 fill_map("core", data);
292
293 snprintf(data, MAX_SCALAR, "%" PRIu64, count);
294 fill_map("counter", data);
295
296 snprintf(data, MAX_SCALAR, "0x%" PRIx64, addr);
297 fill_map("address", data);
298
299 snprintf(data, MAX_SCALAR, "%s", subsystem);
300 fill_map("component", data);
301
302 /* Mapping end */
303 if (!yaml_mapping_end_event_initialize(&event))
Igor Opaniuk66e23bf2018-02-06 19:18:59 +0200304 ERROR_RETURN_FALSE(
305 "Failed to initialize YAML mapping end event");
Igor Opaniukf1f3fd02017-09-14 15:34:56 +0300306 if (!yaml_emitter_emit(&emitter, &event))
307 ERROR_RETURN_FALSE("Failed to emit YAML mapping end event");
308
309 return true;
310}
311
312/*
313 * Consume all timestamps from per-cpu ringbuffers and put everything into
314 * the yaml file.
315 */
Igor Opaniukab88c952017-02-14 13:22:54 +0200316static void *ts_consumer(void *arg)
317{
Yves Leflochb31789d2017-08-01 14:51:18 +0200318 unsigned int i;
319 int ret;
Igor Opaniukab88c952017-02-14 13:22:54 +0200320 bool ts_received = false;
321 uint32_t cores;
322 struct tee_time_st ts_data;
323 FILE *ts_file;
Igor Opaniukf1f3fd02017-09-14 15:34:56 +0300324 char *tsfile_path = arg;
Igor Opaniukab88c952017-02-14 13:22:54 +0200325
Igor Opaniukab88c952017-02-14 13:22:54 +0200326 if (!tsfile_path)
Igor Opaniukf1f3fd02017-09-14 15:34:56 +0300327 ERROR_GOTO(exit, "Wrong timestamp file path");
Igor Opaniukab88c952017-02-14 13:22:54 +0200328
329 cores = get_cores();
330 if (!cores)
Igor Opaniukf1f3fd02017-09-14 15:34:56 +0300331 ERROR_GOTO(exit, "Can't receive amount of avalable cores");
Igor Opaniukab88c952017-02-14 13:22:54 +0200332
333 ts_file = fopen(tsfile_path, "w");
334 if (!ts_file)
Igor Opaniukf1f3fd02017-09-14 15:34:56 +0300335 ERROR_GOTO(exit, "Can't open timestamp file");
336
337 if (!init_emitter(ts_file))
Igor Opaniuk66e23bf2018-02-06 19:18:59 +0200338 ERROR_GOTO(file_close,
339 "Error occurred in emitter initialization");
Igor Opaniukab88c952017-02-14 13:22:54 +0200340
341 while (is_running) {
342 ts_received = false;
343 for (i = 0; i < cores; i++) {
344 ret = timestamp_pop(&bench_ts_global->cpu_buf[i],
345 &ts_data);
346 if (!ret) {
347 ts_received = true;
Igor Opaniuk55fcc4a2018-02-06 19:20:22 +0200348 DBG("Timestamp: core = %u; tick = %lld; "
349 "pc = 0x%" PRIx64 "; system = %s",
350 i, ts_data.cnt, ts_data.addr,
351 bench_str_src(ts_data.src));
Igor Opaniukf1f3fd02017-09-14 15:34:56 +0300352 if (!fill_timestamp(i, ts_data.cnt,
Igor Opaniuk55fcc4a2018-02-06 19:20:22 +0200353 ts_data.addr,
354 bench_str_src(ts_data.src)))
355 ERROR_GOTO(deinit_yaml,
356 "Adding timestamp failed");
Igor Opaniukf1f3fd02017-09-14 15:34:56 +0300357
Igor Opaniukab88c952017-02-14 13:22:54 +0200358 }
359 }
360
Yves Leflochb31789d2017-08-01 14:51:18 +0200361 if (!ts_received) {
Igor Opaniukf1f3fd02017-09-14 15:34:56 +0300362 if (is_running) {
363 DBG("yielding...");
Igor Opaniukab88c952017-02-14 13:22:54 +0200364 sched_yield();
Igor Opaniukf1f3fd02017-09-14 15:34:56 +0300365 } else {
366 ERROR_GOTO(deinit_yaml,
Igor Opaniuk55fcc4a2018-02-06 19:20:22 +0200367 "No new data in the per-cpu ringbuffers"
368 );
Igor Opaniukf1f3fd02017-09-14 15:34:56 +0300369 }
Yves Leflochb31789d2017-08-01 14:51:18 +0200370 }
Igor Opaniukab88c952017-02-14 13:22:54 +0200371 }
372
Igor Opaniukf1f3fd02017-09-14 15:34:56 +0300373deinit_yaml:
374 deinit_emitter();
Igor Opaniukab88c952017-02-14 13:22:54 +0200375file_close:
376 fclose(ts_file);
377exit:
378 return NULL;
379}
380
381int main(int argc, char *argv[])
382{
383 int i;
384 int status;
385 pid_t pid;
386 char testapp_path[PATH_MAX];
387 char **testapp_argv;
388 char *res;
389 char *tsfile_path;
390 uint32_t cores;
391 pthread_t consumer_thread;
392
393 if (argc == 1) {
394 usage(argv[0]);
395 return 0;
396 }
397
398 /* Parse command line */
399 for (i = 1; i < argc; i++) {
400 if (!strcmp(argv[i], "-h")) {
401 usage(argv[0]);
402 return 0;
403 }
404 }
405
Igor Opaniukf1f3fd02017-09-14 15:34:56 +0300406 signal(SIGINT, sigint_handler);
407
408 INFO("1. Opening Benchmark Static TA...");
Igor Opaniukab88c952017-02-14 13:22:54 +0200409 open_bench_pta();
410
411 cores = get_cores();
412 if (!cores)
Igor Opaniukf1f3fd02017-09-14 15:34:56 +0300413 ERROR_EXIT("Receiving amount of active cores failed");
Igor Opaniukab88c952017-02-14 13:22:54 +0200414
Igor Opaniukf1f3fd02017-09-14 15:34:56 +0300415 INFO("2. Allocating per-core buffers, cores detected = %d",
Igor Opaniukab88c952017-02-14 13:22:54 +0200416 cores);
Igor Opaniuk55fcc4a2018-02-06 19:20:22 +0200417 alloc_bench_buf(cores);
Igor Opaniukab88c952017-02-14 13:22:54 +0200418
419 res = realpath(argv[1], testapp_path);
420 if (!res)
421 tee_errx("Failed to get realpath", EXIT_FAILURE);
422
423 alloc_argv(argc, argv, &testapp_argv);
424
Igor Opaniukf1f3fd02017-09-14 15:34:56 +0300425 INFO("3. Starting origin host app %s ...", testapp_path);
Igor Opaniukab88c952017-02-14 13:22:54 +0200426
427 /* fork/exec here */
428 pid = fork();
429
430 if (pid == -1) {
Igor Opaniukf1f3fd02017-09-14 15:34:56 +0300431 DBG("fork() failed");
432 ERROR_EXIT("Starting origin host application failed.");
Igor Opaniukab88c952017-02-14 13:22:54 +0200433 } else if (pid > 0) {
434 is_running = 1;
435
436 tsfile_path = malloc(strlen(testapp_path) +
437 strlen(TSFILE_NAME_SUFFIX) + 1);
438 if (!tsfile_path)
Igor Opaniuk66e23bf2018-02-06 19:18:59 +0200439 ERROR_EXIT("Memory allocation failed the file path.");
Igor Opaniukab88c952017-02-14 13:22:54 +0200440
441 tsfile_path[0] = '\0';
442 strcat(tsfile_path, testapp_path);
443 strcat(tsfile_path, TSFILE_NAME_SUFFIX);
444
Igor Opaniukf1f3fd02017-09-14 15:34:56 +0300445 INFO("Dumping timestamps to %s ...", tsfile_path);
Igor Opaniukab88c952017-02-14 13:22:54 +0200446 print_line();
447
448 if (pthread_create(&consumer_thread, NULL,
449 ts_consumer, tsfile_path)) {
Igor Opaniukf1f3fd02017-09-14 15:34:56 +0300450 DBG( "Error creating ts consumer thread");
451 ERROR_EXIT("Can't start process of reading timestamps");
Igor Opaniukab88c952017-02-14 13:22:54 +0200452 }
453 /* wait for child app exits */
454 waitpid(pid, &status, 0);
455 is_running = 0;
456
457 /* wait for our consumer thread terminate */
458 if (pthread_join(consumer_thread, NULL)) {
Igor Opaniukf1f3fd02017-09-14 15:34:56 +0300459 DBG("Error joining thread");
Igor Opaniuk66e23bf2018-02-06 19:18:59 +0200460 ERROR_EXIT("Couldn't start consuming timestamps");
Igor Opaniukab88c952017-02-14 13:22:54 +0200461 }
462 }
463 else {
464 execvp(testapp_path, testapp_argv);
Igor Opaniukf1f3fd02017-09-14 15:34:56 +0300465 DBG("execve() failed");
466 ERROR_EXIT("Starting origin host application failed");
Igor Opaniukab88c952017-02-14 13:22:54 +0200467 }
468
Igor Opaniukf1f3fd02017-09-14 15:34:56 +0300469 INFO("4. Done benchmark");
Igor Opaniukab88c952017-02-14 13:22:54 +0200470
471 dealloc_argv(argc-1, testapp_argv);
Igor Opaniuk55fcc4a2018-02-06 19:20:22 +0200472 free_bench_buf();
Igor Opaniukab88c952017-02-14 13:22:54 +0200473 close_bench_pta();
474 return 0;
475}