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