xref: /dpdk/app/test-compress-perf/comp_perf_test_throughput.c (revision 7be78d027918dbc846e502780faf94d5acdf5f75)
12695db95SArtur Trybula /* SPDX-License-Identifier: BSD-3-Clause
22695db95SArtur Trybula  * Copyright(c) 2018 Intel Corporation
32695db95SArtur Trybula  */
42695db95SArtur Trybula 
52695db95SArtur Trybula #include <rte_malloc.h>
62695db95SArtur Trybula #include <rte_eal.h>
72695db95SArtur Trybula #include <rte_log.h>
82695db95SArtur Trybula #include <rte_cycles.h>
92695db95SArtur Trybula #include <rte_compressdev.h>
102695db95SArtur Trybula 
112695db95SArtur Trybula #include "comp_perf_test_throughput.h"
122695db95SArtur Trybula 
132695db95SArtur Trybula void
142695db95SArtur Trybula cperf_throughput_test_destructor(void *arg)
152695db95SArtur Trybula {
162695db95SArtur Trybula 	if (arg) {
172695db95SArtur Trybula 		comp_perf_free_memory(
182695db95SArtur Trybula 			((struct cperf_benchmark_ctx *)arg)->ver.options,
192695db95SArtur Trybula 			&((struct cperf_benchmark_ctx *)arg)->ver.mem);
202695db95SArtur Trybula 		rte_free(arg);
212695db95SArtur Trybula 	}
222695db95SArtur Trybula }
232695db95SArtur Trybula 
242695db95SArtur Trybula void *
252695db95SArtur Trybula cperf_throughput_test_constructor(uint8_t dev_id, uint16_t qp_id,
262695db95SArtur Trybula 		struct comp_test_data *options)
272695db95SArtur Trybula {
282695db95SArtur Trybula 	struct cperf_benchmark_ctx *ctx = NULL;
292695db95SArtur Trybula 
302695db95SArtur Trybula 	ctx = rte_malloc(NULL, sizeof(struct cperf_benchmark_ctx), 0);
312695db95SArtur Trybula 
322695db95SArtur Trybula 	if (ctx == NULL)
332695db95SArtur Trybula 		return NULL;
342695db95SArtur Trybula 
352695db95SArtur Trybula 	ctx->ver.mem.dev_id = dev_id;
362695db95SArtur Trybula 	ctx->ver.mem.qp_id = qp_id;
372695db95SArtur Trybula 	ctx->ver.options = options;
382695db95SArtur Trybula 	ctx->ver.silent = 1; /* ver. part will be silent */
392695db95SArtur Trybula 
402695db95SArtur Trybula 	if (!comp_perf_allocate_memory(ctx->ver.options, &ctx->ver.mem)
412695db95SArtur Trybula 			&& !prepare_bufs(ctx->ver.options, &ctx->ver.mem))
422695db95SArtur Trybula 		return ctx;
432695db95SArtur Trybula 
442695db95SArtur Trybula 	cperf_throughput_test_destructor(ctx);
452695db95SArtur Trybula 	return NULL;
462695db95SArtur Trybula }
472695db95SArtur Trybula 
482695db95SArtur Trybula static int
492695db95SArtur Trybula main_loop(struct cperf_benchmark_ctx *ctx, enum rte_comp_xform_type type)
502695db95SArtur Trybula {
512695db95SArtur Trybula 	struct comp_test_data *test_data = ctx->ver.options;
522695db95SArtur Trybula 	struct cperf_mem_resources *mem = &ctx->ver.mem;
532695db95SArtur Trybula 	uint8_t dev_id = mem->dev_id;
542695db95SArtur Trybula 	uint32_t i, iter, num_iter;
552695db95SArtur Trybula 	struct rte_comp_op **ops, **deq_ops;
562695db95SArtur Trybula 	void *priv_xform = NULL;
572695db95SArtur Trybula 	struct rte_comp_xform xform;
582695db95SArtur Trybula 	struct rte_mbuf **input_bufs, **output_bufs;
592695db95SArtur Trybula 	int res = 0;
602695db95SArtur Trybula 	int allocated = 0;
612695db95SArtur Trybula 	uint32_t out_seg_sz;
622695db95SArtur Trybula 
632695db95SArtur Trybula 	if (test_data == NULL || !test_data->burst_sz) {
642695db95SArtur Trybula 		RTE_LOG(ERR, USER1,
652695db95SArtur Trybula 			"Unknown burst size\n");
662695db95SArtur Trybula 		return -1;
672695db95SArtur Trybula 	}
682695db95SArtur Trybula 
692695db95SArtur Trybula 	ops = rte_zmalloc_socket(NULL,
702695db95SArtur Trybula 		2 * mem->total_bufs * sizeof(struct rte_comp_op *),
712695db95SArtur Trybula 		0, rte_socket_id());
722695db95SArtur Trybula 
732695db95SArtur Trybula 	if (ops == NULL) {
742695db95SArtur Trybula 		RTE_LOG(ERR, USER1,
75*7be78d02SJosh Soref 			"Can't allocate memory for ops structures\n");
762695db95SArtur Trybula 		return -1;
772695db95SArtur Trybula 	}
782695db95SArtur Trybula 
792695db95SArtur Trybula 	deq_ops = &ops[mem->total_bufs];
802695db95SArtur Trybula 
812695db95SArtur Trybula 	if (type == RTE_COMP_COMPRESS) {
822695db95SArtur Trybula 		xform = (struct rte_comp_xform) {
832695db95SArtur Trybula 			.type = RTE_COMP_COMPRESS,
842695db95SArtur Trybula 			.compress = {
852695db95SArtur Trybula 				.algo = RTE_COMP_ALGO_DEFLATE,
862695db95SArtur Trybula 				.deflate.huffman = test_data->huffman_enc,
872695db95SArtur Trybula 				.level = test_data->level,
882695db95SArtur Trybula 				.window_size = test_data->window_sz,
892695db95SArtur Trybula 				.chksum = RTE_COMP_CHECKSUM_NONE,
902695db95SArtur Trybula 				.hash_algo = RTE_COMP_HASH_ALGO_NONE
912695db95SArtur Trybula 			}
922695db95SArtur Trybula 		};
932695db95SArtur Trybula 		input_bufs = mem->decomp_bufs;
942695db95SArtur Trybula 		output_bufs = mem->comp_bufs;
952695db95SArtur Trybula 		out_seg_sz = test_data->out_seg_sz;
962695db95SArtur Trybula 	} else {
972695db95SArtur Trybula 		xform = (struct rte_comp_xform) {
982695db95SArtur Trybula 			.type = RTE_COMP_DECOMPRESS,
992695db95SArtur Trybula 			.decompress = {
1002695db95SArtur Trybula 				.algo = RTE_COMP_ALGO_DEFLATE,
1012695db95SArtur Trybula 				.chksum = RTE_COMP_CHECKSUM_NONE,
1022695db95SArtur Trybula 				.window_size = test_data->window_sz,
1032695db95SArtur Trybula 				.hash_algo = RTE_COMP_HASH_ALGO_NONE
1042695db95SArtur Trybula 			}
1052695db95SArtur Trybula 		};
1062695db95SArtur Trybula 		input_bufs = mem->comp_bufs;
1072695db95SArtur Trybula 		output_bufs = mem->decomp_bufs;
1082695db95SArtur Trybula 		out_seg_sz = test_data->seg_sz;
1092695db95SArtur Trybula 	}
1102695db95SArtur Trybula 
1112695db95SArtur Trybula 	/* Create private xform */
1122695db95SArtur Trybula 	if (rte_compressdev_private_xform_create(dev_id, &xform,
1132695db95SArtur Trybula 			&priv_xform) < 0) {
1142695db95SArtur Trybula 		RTE_LOG(ERR, USER1, "Private xform could not be created\n");
1152695db95SArtur Trybula 		res = -1;
1162695db95SArtur Trybula 		goto end;
1172695db95SArtur Trybula 	}
1182695db95SArtur Trybula 
1192695db95SArtur Trybula 	uint64_t tsc_start, tsc_end, tsc_duration;
1202695db95SArtur Trybula 
1212695db95SArtur Trybula 	num_iter = test_data->num_iter;
1222695db95SArtur Trybula 	tsc_start = tsc_end = tsc_duration = 0;
1232695db95SArtur Trybula 	tsc_start = rte_rdtsc_precise();
1242695db95SArtur Trybula 
1252695db95SArtur Trybula 	for (iter = 0; iter < num_iter; iter++) {
1262695db95SArtur Trybula 		uint32_t total_ops = mem->total_bufs;
1272695db95SArtur Trybula 		uint32_t remaining_ops = mem->total_bufs;
1282695db95SArtur Trybula 		uint32_t total_deq_ops = 0;
1292695db95SArtur Trybula 		uint32_t total_enq_ops = 0;
1302695db95SArtur Trybula 		uint16_t ops_unused = 0;
1312695db95SArtur Trybula 		uint16_t num_enq = 0;
1322695db95SArtur Trybula 		uint16_t num_deq = 0;
1332695db95SArtur Trybula 
1342695db95SArtur Trybula 		while (remaining_ops > 0) {
1352695db95SArtur Trybula 			uint16_t num_ops = RTE_MIN(remaining_ops,
1362695db95SArtur Trybula 						   test_data->burst_sz);
1372695db95SArtur Trybula 			uint16_t ops_needed = num_ops - ops_unused;
1382695db95SArtur Trybula 
1392695db95SArtur Trybula 			/*
1402695db95SArtur Trybula 			 * Move the unused operations from the previous
1412695db95SArtur Trybula 			 * enqueue_burst call to the front, to maintain order
1422695db95SArtur Trybula 			 */
1432695db95SArtur Trybula 			if ((ops_unused > 0) && (num_enq > 0)) {
1442695db95SArtur Trybula 				size_t nb_b_to_mov =
1452695db95SArtur Trybula 				      ops_unused * sizeof(struct rte_comp_op *);
1462695db95SArtur Trybula 
1472695db95SArtur Trybula 				memmove(ops, &ops[num_enq], nb_b_to_mov);
1482695db95SArtur Trybula 			}
1492695db95SArtur Trybula 
1502695db95SArtur Trybula 			/* Allocate compression operations */
1512695db95SArtur Trybula 			if (ops_needed && !rte_comp_op_bulk_alloc(
1522695db95SArtur Trybula 						mem->op_pool,
1532695db95SArtur Trybula 						&ops[ops_unused],
1542695db95SArtur Trybula 						ops_needed)) {
1552695db95SArtur Trybula 				RTE_LOG(ERR, USER1,
1562695db95SArtur Trybula 				      "Could not allocate enough operations\n");
1572695db95SArtur Trybula 				res = -1;
1582695db95SArtur Trybula 				goto end;
1592695db95SArtur Trybula 			}
1602695db95SArtur Trybula 			allocated += ops_needed;
1612695db95SArtur Trybula 
1622695db95SArtur Trybula 			for (i = 0; i < ops_needed; i++) {
1632695db95SArtur Trybula 				/*
1642695db95SArtur Trybula 				 * Calculate next buffer to attach to operation
1652695db95SArtur Trybula 				 */
1662695db95SArtur Trybula 				uint32_t buf_id = total_enq_ops + i +
1672695db95SArtur Trybula 						ops_unused;
1682695db95SArtur Trybula 				uint16_t op_id = ops_unused + i;
1692695db95SArtur Trybula 				/* Reset all data in output buffers */
1702695db95SArtur Trybula 				struct rte_mbuf *m = output_bufs[buf_id];
1712695db95SArtur Trybula 
1722695db95SArtur Trybula 				m->pkt_len = out_seg_sz * m->nb_segs;
1732695db95SArtur Trybula 				while (m) {
1742695db95SArtur Trybula 					m->data_len = m->buf_len - m->data_off;
1752695db95SArtur Trybula 					m = m->next;
1762695db95SArtur Trybula 				}
1772695db95SArtur Trybula 				ops[op_id]->m_src = input_bufs[buf_id];
1782695db95SArtur Trybula 				ops[op_id]->m_dst = output_bufs[buf_id];
1792695db95SArtur Trybula 				ops[op_id]->src.offset = 0;
1802695db95SArtur Trybula 				ops[op_id]->src.length =
1812695db95SArtur Trybula 					rte_pktmbuf_pkt_len(input_bufs[buf_id]);
1822695db95SArtur Trybula 				ops[op_id]->dst.offset = 0;
1832695db95SArtur Trybula 				ops[op_id]->flush_flag = RTE_COMP_FLUSH_FINAL;
1842695db95SArtur Trybula 				ops[op_id]->input_chksum = buf_id;
1852695db95SArtur Trybula 				ops[op_id]->private_xform = priv_xform;
1862695db95SArtur Trybula 			}
1872695db95SArtur Trybula 
1882695db95SArtur Trybula 			if (unlikely(test_data->perf_comp_force_stop))
1892695db95SArtur Trybula 				goto end;
1902695db95SArtur Trybula 
1912695db95SArtur Trybula 			num_enq = rte_compressdev_enqueue_burst(dev_id,
1922695db95SArtur Trybula 								mem->qp_id, ops,
1932695db95SArtur Trybula 								num_ops);
1942695db95SArtur Trybula 			if (num_enq == 0) {
1952695db95SArtur Trybula 				struct rte_compressdev_stats stats;
1962695db95SArtur Trybula 
1972695db95SArtur Trybula 				rte_compressdev_stats_get(dev_id, &stats);
1982695db95SArtur Trybula 				if (stats.enqueue_err_count) {
1992695db95SArtur Trybula 					res = -1;
2002695db95SArtur Trybula 					goto end;
2012695db95SArtur Trybula 				}
2022695db95SArtur Trybula 			}
2032695db95SArtur Trybula 
2042695db95SArtur Trybula 			ops_unused = num_ops - num_enq;
2052695db95SArtur Trybula 			remaining_ops -= num_enq;
2062695db95SArtur Trybula 			total_enq_ops += num_enq;
2072695db95SArtur Trybula 
2082695db95SArtur Trybula 			num_deq = rte_compressdev_dequeue_burst(dev_id,
2092695db95SArtur Trybula 							   mem->qp_id,
2102695db95SArtur Trybula 							   deq_ops,
2112695db95SArtur Trybula 							   test_data->burst_sz);
2122695db95SArtur Trybula 			total_deq_ops += num_deq;
2132695db95SArtur Trybula 
2142695db95SArtur Trybula 			if (iter == num_iter - 1) {
2152695db95SArtur Trybula 				for (i = 0; i < num_deq; i++) {
2162695db95SArtur Trybula 					struct rte_comp_op *op = deq_ops[i];
2172695db95SArtur Trybula 
2182695db95SArtur Trybula 					if (op->status !=
2192695db95SArtur Trybula 						RTE_COMP_OP_STATUS_SUCCESS) {
2202695db95SArtur Trybula 						RTE_LOG(ERR, USER1,
2212695db95SArtur Trybula 				       "Some operations were not successful\n");
2222695db95SArtur Trybula 						goto end;
2232695db95SArtur Trybula 					}
2242695db95SArtur Trybula 
2252695db95SArtur Trybula 					struct rte_mbuf *m = op->m_dst;
2262695db95SArtur Trybula 
2272695db95SArtur Trybula 					m->pkt_len = op->produced;
2282695db95SArtur Trybula 					uint32_t remaining_data = op->produced;
2292695db95SArtur Trybula 					uint16_t data_to_append;
2302695db95SArtur Trybula 
2312695db95SArtur Trybula 					while (remaining_data > 0) {
2322695db95SArtur Trybula 						data_to_append =
2332695db95SArtur Trybula 							RTE_MIN(remaining_data,
2342695db95SArtur Trybula 							     out_seg_sz);
2352695db95SArtur Trybula 						m->data_len = data_to_append;
2362695db95SArtur Trybula 						remaining_data -=
2372695db95SArtur Trybula 								data_to_append;
2382695db95SArtur Trybula 						m = m->next;
2392695db95SArtur Trybula 					}
2402695db95SArtur Trybula 				}
2412695db95SArtur Trybula 			}
2422695db95SArtur Trybula 			rte_mempool_put_bulk(mem->op_pool,
2432695db95SArtur Trybula 					     (void **)deq_ops, num_deq);
2442695db95SArtur Trybula 			allocated -= num_deq;
2452695db95SArtur Trybula 		}
2462695db95SArtur Trybula 
2472695db95SArtur Trybula 		/* Dequeue the last operations */
2482695db95SArtur Trybula 		while (total_deq_ops < total_ops) {
2492695db95SArtur Trybula 			if (unlikely(test_data->perf_comp_force_stop))
2502695db95SArtur Trybula 				goto end;
2512695db95SArtur Trybula 
2522695db95SArtur Trybula 			num_deq = rte_compressdev_dequeue_burst(dev_id,
2532695db95SArtur Trybula 							   mem->qp_id,
2542695db95SArtur Trybula 							   deq_ops,
2552695db95SArtur Trybula 							   test_data->burst_sz);
2562695db95SArtur Trybula 			if (num_deq == 0) {
2572695db95SArtur Trybula 				struct rte_compressdev_stats stats;
2582695db95SArtur Trybula 
2592695db95SArtur Trybula 				rte_compressdev_stats_get(dev_id, &stats);
2602695db95SArtur Trybula 				if (stats.dequeue_err_count) {
2612695db95SArtur Trybula 					res = -1;
2622695db95SArtur Trybula 					goto end;
2632695db95SArtur Trybula 				}
2642695db95SArtur Trybula 			}
2652695db95SArtur Trybula 
2662695db95SArtur Trybula 			total_deq_ops += num_deq;
2672695db95SArtur Trybula 
2682695db95SArtur Trybula 			if (iter == num_iter - 1) {
2692695db95SArtur Trybula 				for (i = 0; i < num_deq; i++) {
2702695db95SArtur Trybula 					struct rte_comp_op *op = deq_ops[i];
2712695db95SArtur Trybula 
2722695db95SArtur Trybula 					if (op->status !=
2732695db95SArtur Trybula 						RTE_COMP_OP_STATUS_SUCCESS) {
2742695db95SArtur Trybula 						RTE_LOG(ERR, USER1,
2752695db95SArtur Trybula 				       "Some operations were not successful\n");
2762695db95SArtur Trybula 						goto end;
2772695db95SArtur Trybula 					}
2782695db95SArtur Trybula 
2792695db95SArtur Trybula 					struct rte_mbuf *m = op->m_dst;
2802695db95SArtur Trybula 
2812695db95SArtur Trybula 					m->pkt_len = op->produced;
2822695db95SArtur Trybula 					uint32_t remaining_data = op->produced;
2832695db95SArtur Trybula 					uint16_t data_to_append;
2842695db95SArtur Trybula 
2852695db95SArtur Trybula 					while (remaining_data > 0) {
2862695db95SArtur Trybula 						data_to_append =
2872695db95SArtur Trybula 						RTE_MIN(remaining_data,
2882695db95SArtur Trybula 							out_seg_sz);
2892695db95SArtur Trybula 						m->data_len = data_to_append;
2902695db95SArtur Trybula 						remaining_data -=
2912695db95SArtur Trybula 								data_to_append;
2922695db95SArtur Trybula 						m = m->next;
2932695db95SArtur Trybula 					}
2942695db95SArtur Trybula 				}
2952695db95SArtur Trybula 			}
2962695db95SArtur Trybula 			rte_mempool_put_bulk(mem->op_pool,
2972695db95SArtur Trybula 					     (void **)deq_ops, num_deq);
2982695db95SArtur Trybula 			allocated -= num_deq;
2992695db95SArtur Trybula 		}
3002695db95SArtur Trybula 	}
3012695db95SArtur Trybula 
3022695db95SArtur Trybula 	tsc_end = rte_rdtsc_precise();
3032695db95SArtur Trybula 	tsc_duration = tsc_end - tsc_start;
3042695db95SArtur Trybula 
3052695db95SArtur Trybula 	if (type == RTE_COMP_COMPRESS)
3062695db95SArtur Trybula 		ctx->comp_tsc_duration[test_data->level] =
3072695db95SArtur Trybula 				tsc_duration / num_iter;
3082695db95SArtur Trybula 	else
3092695db95SArtur Trybula 		ctx->decomp_tsc_duration[test_data->level] =
3102695db95SArtur Trybula 				tsc_duration / num_iter;
3112695db95SArtur Trybula 
3122695db95SArtur Trybula end:
3132695db95SArtur Trybula 	rte_mempool_put_bulk(mem->op_pool, (void **)ops, allocated);
3142695db95SArtur Trybula 	rte_compressdev_private_xform_free(dev_id, priv_xform);
3152695db95SArtur Trybula 	rte_free(ops);
3162695db95SArtur Trybula 
3172695db95SArtur Trybula 	if (test_data->perf_comp_force_stop) {
3182695db95SArtur Trybula 		RTE_LOG(ERR, USER1,
3192695db95SArtur Trybula 		      "lcore: %d Perf. test has been aborted by user\n",
3202695db95SArtur Trybula 			mem->lcore_id);
3212695db95SArtur Trybula 		res = -1;
3222695db95SArtur Trybula 	}
3232695db95SArtur Trybula 	return res;
3242695db95SArtur Trybula }
3252695db95SArtur Trybula 
3262695db95SArtur Trybula int
3272695db95SArtur Trybula cperf_throughput_test_runner(void *test_ctx)
3282695db95SArtur Trybula {
3292695db95SArtur Trybula 	struct cperf_benchmark_ctx *ctx = test_ctx;
3302695db95SArtur Trybula 	struct comp_test_data *test_data = ctx->ver.options;
3312695db95SArtur Trybula 	uint32_t lcore = rte_lcore_id();
332d3fcd87cSJoyce Kong 	static uint16_t display_once;
3332695db95SArtur Trybula 	int i, ret = EXIT_SUCCESS;
3342695db95SArtur Trybula 
3352695db95SArtur Trybula 	ctx->ver.mem.lcore_id = lcore;
3362695db95SArtur Trybula 
337d3fcd87cSJoyce Kong 	uint16_t exp = 0;
3382695db95SArtur Trybula 	/*
3392695db95SArtur Trybula 	 * printing information about current compression thread
3402695db95SArtur Trybula 	 */
341d3fcd87cSJoyce Kong 	if (__atomic_compare_exchange_n(&ctx->ver.mem.print_info_once, &exp,
342d3fcd87cSJoyce Kong 				1, 0, __ATOMIC_RELAXED, __ATOMIC_RELAXED))
3432695db95SArtur Trybula 		printf("    lcore: %u,"
3442695db95SArtur Trybula 				" driver name: %s,"
3452695db95SArtur Trybula 				" device name: %s,"
3462695db95SArtur Trybula 				" device id: %u,"
3472695db95SArtur Trybula 				" socket id: %u,"
3482695db95SArtur Trybula 				" queue pair id: %u\n",
3492695db95SArtur Trybula 			lcore,
3502695db95SArtur Trybula 			ctx->ver.options->driver_name,
3512695db95SArtur Trybula 			rte_compressdev_name_get(ctx->ver.mem.dev_id),
3522695db95SArtur Trybula 			ctx->ver.mem.dev_id,
3532695db95SArtur Trybula 			rte_compressdev_socket_id(ctx->ver.mem.dev_id),
3542695db95SArtur Trybula 			ctx->ver.mem.qp_id);
3552695db95SArtur Trybula 
3562695db95SArtur Trybula 	/*
3572695db95SArtur Trybula 	 * First the verification part is needed
3582695db95SArtur Trybula 	 */
3592695db95SArtur Trybula 	if (cperf_verify_test_runner(&ctx->ver)) {
3602695db95SArtur Trybula 		ret =  EXIT_FAILURE;
3612695db95SArtur Trybula 		goto end;
3622695db95SArtur Trybula 	}
3632695db95SArtur Trybula 
3642695db95SArtur Trybula 	/*
3652695db95SArtur Trybula 	 * Run the tests twice, discarding the first performance
3662695db95SArtur Trybula 	 * results, before the cache is warmed up
3672695db95SArtur Trybula 	 */
3682695db95SArtur Trybula 	for (i = 0; i < 2; i++) {
3692695db95SArtur Trybula 		if (main_loop(ctx, RTE_COMP_COMPRESS) < 0) {
3702695db95SArtur Trybula 			ret = EXIT_FAILURE;
3712695db95SArtur Trybula 			goto end;
3722695db95SArtur Trybula 		}
3732695db95SArtur Trybula 	}
3742695db95SArtur Trybula 
3752695db95SArtur Trybula 	for (i = 0; i < 2; i++) {
3762695db95SArtur Trybula 		if (main_loop(ctx, RTE_COMP_DECOMPRESS) < 0) {
3772695db95SArtur Trybula 			ret = EXIT_FAILURE;
3782695db95SArtur Trybula 			goto end;
3792695db95SArtur Trybula 		}
3802695db95SArtur Trybula 	}
3812695db95SArtur Trybula 
3822695db95SArtur Trybula 	ctx->comp_tsc_byte =
3832695db95SArtur Trybula 			(double)(ctx->comp_tsc_duration[test_data->level]) /
3842695db95SArtur Trybula 					test_data->input_data_sz;
3852695db95SArtur Trybula 
3862695db95SArtur Trybula 	ctx->decomp_tsc_byte =
3872695db95SArtur Trybula 			(double)(ctx->decomp_tsc_duration[test_data->level]) /
3882695db95SArtur Trybula 					test_data->input_data_sz;
3892695db95SArtur Trybula 
3902695db95SArtur Trybula 	ctx->comp_gbps = rte_get_tsc_hz() / ctx->comp_tsc_byte * 8 /
3912695db95SArtur Trybula 			1000000000;
3922695db95SArtur Trybula 
3932695db95SArtur Trybula 	ctx->decomp_gbps = rte_get_tsc_hz() / ctx->decomp_tsc_byte * 8 /
3942695db95SArtur Trybula 			1000000000;
3952695db95SArtur Trybula 
396d3fcd87cSJoyce Kong 	exp = 0;
397d3fcd87cSJoyce Kong 	if (__atomic_compare_exchange_n(&display_once, &exp, 1, 0,
398d3fcd87cSJoyce Kong 			__ATOMIC_RELAXED, __ATOMIC_RELAXED)) {
3992695db95SArtur Trybula 		printf("\n%12s%6s%12s%17s%15s%16s\n",
4002695db95SArtur Trybula 			"lcore id", "Level", "Comp size", "Comp ratio [%]",
4012695db95SArtur Trybula 			"Comp [Gbps]", "Decomp [Gbps]");
4022695db95SArtur Trybula 	}
4032695db95SArtur Trybula 
4042695db95SArtur Trybula 	printf("%12u%6u%12zu%17.2f%15.2f%16.2f\n",
4052695db95SArtur Trybula 		ctx->ver.mem.lcore_id,
4062695db95SArtur Trybula 		test_data->level, ctx->ver.comp_data_sz, ctx->ver.ratio,
4072695db95SArtur Trybula 		ctx->comp_gbps,
4082695db95SArtur Trybula 		ctx->decomp_gbps);
4092695db95SArtur Trybula 
4102695db95SArtur Trybula end:
4112695db95SArtur Trybula 	return ret;
4122695db95SArtur Trybula }
413