xref: /dpdk/app/test-compress-perf/comp_perf_test_cyclecount.c (revision b6a7e6852e9ab82ae0e05e2d2a0b83abca17de3b)
12695db95SArtur Trybula /* SPDX-License-Identifier: BSD-3-Clause
22695db95SArtur Trybula  * Copyright(c) 2019 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_spinlock.h"
122695db95SArtur Trybula #include <rte_compressdev.h>
132695db95SArtur Trybula 
142695db95SArtur Trybula #include "comp_perf_test_cyclecount.h"
152695db95SArtur Trybula 
162695db95SArtur Trybula struct cperf_cyclecount_ctx {
172695db95SArtur Trybula 	struct cperf_verify_ctx ver;
182695db95SArtur Trybula 
192695db95SArtur Trybula 	uint32_t ops_enq_retries;
202695db95SArtur Trybula 	uint32_t ops_deq_retries;
212695db95SArtur Trybula 
222695db95SArtur Trybula 	uint64_t duration_op;
232695db95SArtur Trybula 	uint64_t duration_enq;
242695db95SArtur Trybula 	uint64_t duration_deq;
252695db95SArtur Trybula };
262695db95SArtur Trybula 
272695db95SArtur Trybula void
cperf_cyclecount_test_destructor(void * arg)282695db95SArtur Trybula cperf_cyclecount_test_destructor(void *arg)
292695db95SArtur Trybula {
302695db95SArtur Trybula 	struct cperf_cyclecount_ctx *ctx = arg;
312695db95SArtur Trybula 
322695db95SArtur Trybula 	if (arg) {
332695db95SArtur Trybula 		comp_perf_free_memory(ctx->ver.options, &ctx->ver.mem);
342695db95SArtur Trybula 		rte_free(arg);
352695db95SArtur Trybula 	}
362695db95SArtur Trybula }
372695db95SArtur Trybula 
382695db95SArtur Trybula void *
cperf_cyclecount_test_constructor(uint8_t dev_id,uint16_t qp_id,struct comp_test_data * options)392695db95SArtur Trybula cperf_cyclecount_test_constructor(uint8_t dev_id, uint16_t qp_id,
402695db95SArtur Trybula 		struct comp_test_data *options)
412695db95SArtur Trybula {
422695db95SArtur Trybula 	struct cperf_cyclecount_ctx *ctx = NULL;
432695db95SArtur Trybula 
442695db95SArtur Trybula 	ctx = rte_malloc(NULL, sizeof(struct cperf_cyclecount_ctx), 0);
452695db95SArtur Trybula 
462695db95SArtur Trybula 	if (ctx == NULL)
472695db95SArtur Trybula 		return NULL;
482695db95SArtur Trybula 
492695db95SArtur Trybula 	ctx->ver.mem.dev_id = dev_id;
502695db95SArtur Trybula 	ctx->ver.mem.qp_id = qp_id;
512695db95SArtur Trybula 	ctx->ver.options = options;
522695db95SArtur Trybula 	ctx->ver.silent = 1; /* ver. part will be silent */
532695db95SArtur Trybula 
542695db95SArtur Trybula 	if (!comp_perf_allocate_memory(ctx->ver.options, &ctx->ver.mem)
552695db95SArtur Trybula 			&& !prepare_bufs(ctx->ver.options, &ctx->ver.mem))
562695db95SArtur Trybula 		return ctx;
572695db95SArtur Trybula 
582695db95SArtur Trybula 	cperf_cyclecount_test_destructor(ctx);
592695db95SArtur Trybula 	return NULL;
602695db95SArtur Trybula }
612695db95SArtur Trybula 
622695db95SArtur Trybula static int
cperf_cyclecount_op_setup(struct rte_comp_op ** ops,struct cperf_cyclecount_ctx * ctx,struct rte_mbuf ** input_bufs,struct rte_mbuf ** output_bufs,void * priv_xform,uint32_t out_seg_sz)632695db95SArtur Trybula cperf_cyclecount_op_setup(struct rte_comp_op **ops,
642695db95SArtur Trybula 				 struct cperf_cyclecount_ctx *ctx,
652695db95SArtur Trybula 				 struct rte_mbuf **input_bufs,
662695db95SArtur Trybula 				 struct rte_mbuf **output_bufs,
672695db95SArtur Trybula 				 void *priv_xform,
682695db95SArtur Trybula 				 uint32_t out_seg_sz)
692695db95SArtur Trybula {
702695db95SArtur Trybula 	struct comp_test_data *test_data = ctx->ver.options;
712695db95SArtur Trybula 	struct cperf_mem_resources *mem = &ctx->ver.mem;
722695db95SArtur Trybula 
732695db95SArtur Trybula 	uint32_t i, iter, num_iter;
742695db95SArtur Trybula 	int res = 0;
752695db95SArtur Trybula 	uint16_t ops_needed;
762695db95SArtur Trybula 
772695db95SArtur Trybula 	num_iter = test_data->num_iter;
782695db95SArtur Trybula 
792695db95SArtur Trybula 	for (iter = 0; iter < num_iter; iter++) {
802695db95SArtur Trybula 		uint32_t remaining_ops = mem->total_bufs;
812695db95SArtur Trybula 		uint32_t total_enq_ops = 0;
822695db95SArtur Trybula 		uint16_t num_enq = 0;
832695db95SArtur Trybula 		uint16_t num_deq = 0;
842695db95SArtur Trybula 
852695db95SArtur Trybula 		while (remaining_ops > 0) {
862695db95SArtur Trybula 			uint16_t num_ops = RTE_MIN(remaining_ops,
872695db95SArtur Trybula 						   test_data->burst_sz);
882695db95SArtur Trybula 			ops_needed = num_ops;
892695db95SArtur Trybula 
902695db95SArtur Trybula 			/* Allocate compression operations */
912695db95SArtur Trybula 			if (ops_needed && rte_mempool_get_bulk(
922695db95SArtur Trybula 						mem->op_pool,
932695db95SArtur Trybula 						(void **)ops,
942695db95SArtur Trybula 						ops_needed) != 0) {
952695db95SArtur Trybula 				RTE_LOG(ERR, USER1,
962695db95SArtur Trybula 				      "Cyclecount: could not allocate enough operations\n");
972695db95SArtur Trybula 				res = -1;
982695db95SArtur Trybula 				goto end;
992695db95SArtur Trybula 			}
1002695db95SArtur Trybula 
1012695db95SArtur Trybula 			for (i = 0; i < ops_needed; i++) {
1022695db95SArtur Trybula 
1032695db95SArtur Trybula 				/* Calculate next buffer to attach */
1042695db95SArtur Trybula 				/* to operation */
1052695db95SArtur Trybula 				uint32_t buf_id = total_enq_ops + i;
1062695db95SArtur Trybula 				uint16_t op_id = i;
1072695db95SArtur Trybula 
1082695db95SArtur Trybula 				/* Reset all data in output buffers */
1092695db95SArtur Trybula 				struct rte_mbuf *m = output_bufs[buf_id];
1102695db95SArtur Trybula 
1112695db95SArtur Trybula 				m->pkt_len = out_seg_sz * m->nb_segs;
1122695db95SArtur Trybula 				while (m) {
1132695db95SArtur Trybula 					m->data_len = m->buf_len - m->data_off;
1142695db95SArtur Trybula 					m = m->next;
1152695db95SArtur Trybula 				}
1162695db95SArtur Trybula 				ops[op_id]->m_src = input_bufs[buf_id];
1172695db95SArtur Trybula 				ops[op_id]->m_dst = output_bufs[buf_id];
1182695db95SArtur Trybula 				ops[op_id]->src.offset = 0;
1192695db95SArtur Trybula 				ops[op_id]->src.length =
1202695db95SArtur Trybula 					rte_pktmbuf_pkt_len(input_bufs[buf_id]);
1212695db95SArtur Trybula 				ops[op_id]->dst.offset = 0;
1222695db95SArtur Trybula 				ops[op_id]->flush_flag = RTE_COMP_FLUSH_FINAL;
1232695db95SArtur Trybula 				ops[op_id]->input_chksum = buf_id;
1242695db95SArtur Trybula 				ops[op_id]->private_xform = priv_xform;
1252695db95SArtur Trybula 			}
1262695db95SArtur Trybula 
1272695db95SArtur Trybula 			/* E N Q U E U I N G */
1282695db95SArtur Trybula 			/* assuming that all ops are enqueued */
1292695db95SArtur Trybula 			/* instead of the real enqueue operation */
1302695db95SArtur Trybula 			num_enq = num_ops;
1312695db95SArtur Trybula 
1322695db95SArtur Trybula 			remaining_ops -= num_enq;
1332695db95SArtur Trybula 			total_enq_ops += num_enq;
1342695db95SArtur Trybula 
1352695db95SArtur Trybula 			/* D E Q U E U I N G */
1362695db95SArtur Trybula 			/* assuming that all ops dequeued */
1372695db95SArtur Trybula 			/* instead of the real dequeue operation */
1382695db95SArtur Trybula 			num_deq = num_ops;
1392695db95SArtur Trybula 
1402695db95SArtur Trybula 			rte_mempool_put_bulk(mem->op_pool,
1412695db95SArtur Trybula 					     (void **)ops, num_deq);
1422695db95SArtur Trybula 		}
1432695db95SArtur Trybula 	}
1442695db95SArtur Trybula 	return res;
1452695db95SArtur Trybula end:
1462695db95SArtur Trybula 	rte_mempool_put_bulk(mem->op_pool, (void **)ops, ops_needed);
1472695db95SArtur Trybula 	rte_free(ops);
1482695db95SArtur Trybula 
1492695db95SArtur Trybula 	return res;
1502695db95SArtur Trybula }
1512695db95SArtur Trybula 
1522695db95SArtur Trybula static int
main_loop(struct cperf_cyclecount_ctx * ctx,enum rte_comp_xform_type type)1532695db95SArtur Trybula main_loop(struct cperf_cyclecount_ctx *ctx, enum rte_comp_xform_type type)
1542695db95SArtur Trybula {
1552695db95SArtur Trybula 	struct comp_test_data *test_data = ctx->ver.options;
1562695db95SArtur Trybula 	struct cperf_mem_resources *mem = &ctx->ver.mem;
1572695db95SArtur Trybula 	uint8_t dev_id = mem->dev_id;
1582695db95SArtur Trybula 	uint32_t i, iter, num_iter;
1592695db95SArtur Trybula 	struct rte_comp_op **ops, **deq_ops;
1602695db95SArtur Trybula 	void *priv_xform = NULL;
1612695db95SArtur Trybula 	struct rte_comp_xform xform;
1622695db95SArtur Trybula 	struct rte_mbuf **input_bufs, **output_bufs;
1632695db95SArtur Trybula 	int ret, res = 0;
1642695db95SArtur Trybula 	int allocated = 0;
1652695db95SArtur Trybula 	uint32_t out_seg_sz;
1662695db95SArtur Trybula 
1672695db95SArtur Trybula 	uint64_t tsc_start, tsc_end, tsc_duration;
1682695db95SArtur Trybula 
1692695db95SArtur Trybula 	if (test_data == NULL || !test_data->burst_sz) {
1702695db95SArtur Trybula 		RTE_LOG(ERR, USER1, "Unknown burst size\n");
1712695db95SArtur Trybula 		return -1;
1722695db95SArtur Trybula 	}
1732695db95SArtur Trybula 	ctx->duration_enq = 0;
1742695db95SArtur Trybula 	ctx->duration_deq = 0;
1752695db95SArtur Trybula 	ctx->ops_enq_retries = 0;
1762695db95SArtur Trybula 	ctx->ops_deq_retries = 0;
1772695db95SArtur Trybula 
1782695db95SArtur Trybula 	/* one array for both enqueue and dequeue */
1792695db95SArtur Trybula 	ops = rte_zmalloc_socket(NULL,
18068d3287fSRaja Zidane 		(test_data->burst_sz + mem->total_bufs) *
18168d3287fSRaja Zidane 		sizeof(struct rte_comp_op *),
1822695db95SArtur Trybula 		0, rte_socket_id());
1832695db95SArtur Trybula 
1842695db95SArtur Trybula 	if (ops == NULL) {
1852695db95SArtur Trybula 		RTE_LOG(ERR, USER1,
1867be78d02SJosh Soref 			"Can't allocate memory for ops structures\n");
1872695db95SArtur Trybula 		return -1;
1882695db95SArtur Trybula 	}
1892695db95SArtur Trybula 
19068d3287fSRaja Zidane 	deq_ops = &ops[test_data->burst_sz];
1912695db95SArtur Trybula 
1922695db95SArtur Trybula 	if (type == RTE_COMP_COMPRESS) {
1932695db95SArtur Trybula 		xform = (struct rte_comp_xform) {
1942695db95SArtur Trybula 			.type = RTE_COMP_COMPRESS,
1952695db95SArtur Trybula 			.compress = {
19672c64a34SMichael Baum 				.algo = test_data->test_algo,
1972695db95SArtur Trybula 				.level = test_data->level,
1982695db95SArtur Trybula 				.window_size = test_data->window_sz,
1992695db95SArtur Trybula 				.chksum = RTE_COMP_CHECKSUM_NONE,
2002695db95SArtur Trybula 				.hash_algo = RTE_COMP_HASH_ALGO_NONE
2012695db95SArtur Trybula 			}
2022695db95SArtur Trybula 		};
20372c64a34SMichael Baum 		if (test_data->test_algo == RTE_COMP_ALGO_DEFLATE)
20472c64a34SMichael Baum 			xform.compress.deflate.huffman = test_data->huffman_enc;
20572c64a34SMichael Baum 		else if (test_data->test_algo == RTE_COMP_ALGO_LZ4)
20672c64a34SMichael Baum 			xform.compress.lz4.flags = test_data->lz4_flags;
2072695db95SArtur Trybula 		input_bufs = mem->decomp_bufs;
2082695db95SArtur Trybula 		output_bufs = mem->comp_bufs;
2092695db95SArtur Trybula 		out_seg_sz = test_data->out_seg_sz;
2102695db95SArtur Trybula 	} else {
2112695db95SArtur Trybula 		xform = (struct rte_comp_xform) {
2122695db95SArtur Trybula 			.type = RTE_COMP_DECOMPRESS,
2132695db95SArtur Trybula 			.decompress = {
21472c64a34SMichael Baum 				.algo = test_data->test_algo,
2152695db95SArtur Trybula 				.chksum = RTE_COMP_CHECKSUM_NONE,
2162695db95SArtur Trybula 				.window_size = test_data->window_sz,
2172695db95SArtur Trybula 				.hash_algo = RTE_COMP_HASH_ALGO_NONE
2182695db95SArtur Trybula 			}
2192695db95SArtur Trybula 		};
22072c64a34SMichael Baum 		if (test_data->test_algo == RTE_COMP_ALGO_LZ4)
22172c64a34SMichael Baum 			xform.decompress.lz4.flags = test_data->lz4_flags;
2222695db95SArtur Trybula 		input_bufs = mem->comp_bufs;
2232695db95SArtur Trybula 		output_bufs = mem->decomp_bufs;
2242695db95SArtur Trybula 		out_seg_sz = test_data->seg_sz;
2252695db95SArtur Trybula 	}
2262695db95SArtur Trybula 
2272695db95SArtur Trybula 	/* Create private xform */
2282695db95SArtur Trybula 	if (rte_compressdev_private_xform_create(dev_id, &xform,
2292695db95SArtur Trybula 						&priv_xform) < 0) {
2302695db95SArtur Trybula 		RTE_LOG(ERR, USER1, "Private xform could not be created\n");
2312695db95SArtur Trybula 		res = -1;
2322695db95SArtur Trybula 		goto end;
2332695db95SArtur Trybula 	}
2342695db95SArtur Trybula 
2352695db95SArtur Trybula 	tsc_start = rte_rdtsc_precise();
2362695db95SArtur Trybula 	ret = cperf_cyclecount_op_setup(ops,
2372695db95SArtur Trybula 				ctx,
2382695db95SArtur Trybula 				input_bufs,
2392695db95SArtur Trybula 				output_bufs,
2402695db95SArtur Trybula 				priv_xform,
2412695db95SArtur Trybula 				out_seg_sz);
2422695db95SArtur Trybula 
2432695db95SArtur Trybula 	tsc_end = rte_rdtsc_precise();
2442695db95SArtur Trybula 
2452695db95SArtur Trybula 	/* ret value check postponed a bit to cancel extra 'if' bias */
2462695db95SArtur Trybula 	if (ret < 0) {
2472695db95SArtur Trybula 		RTE_LOG(ERR, USER1, "Setup function failed\n");
2482695db95SArtur Trybula 		res = -1;
2492695db95SArtur Trybula 		goto end;
2502695db95SArtur Trybula 	}
2512695db95SArtur Trybula 
2522695db95SArtur Trybula 	tsc_duration = tsc_end - tsc_start;
2532695db95SArtur Trybula 	ctx->duration_op = tsc_duration;
2542695db95SArtur Trybula 
2552695db95SArtur Trybula 	num_iter = test_data->num_iter;
2562695db95SArtur Trybula 	for (iter = 0; iter < num_iter; iter++) {
2572695db95SArtur Trybula 		uint32_t total_ops = mem->total_bufs;
2582695db95SArtur Trybula 		uint32_t remaining_ops = mem->total_bufs;
2592695db95SArtur Trybula 		uint32_t total_deq_ops = 0;
2602695db95SArtur Trybula 		uint32_t total_enq_ops = 0;
2612695db95SArtur Trybula 		uint16_t ops_unused = 0;
2622695db95SArtur Trybula 		uint16_t num_enq = 0;
2632695db95SArtur Trybula 		uint16_t num_deq = 0;
2642695db95SArtur Trybula 
2652695db95SArtur Trybula 		while (remaining_ops > 0) {
2662695db95SArtur Trybula 			uint16_t num_ops = RTE_MIN(remaining_ops,
2672695db95SArtur Trybula 						   test_data->burst_sz);
2682695db95SArtur Trybula 			uint16_t ops_needed = num_ops - ops_unused;
2692695db95SArtur Trybula 
2702695db95SArtur Trybula 			/*
2712695db95SArtur Trybula 			 * Move the unused operations from the previous
2722695db95SArtur Trybula 			 * enqueue_burst call to the front, to maintain order
2732695db95SArtur Trybula 			 */
2742695db95SArtur Trybula 			if ((ops_unused > 0) && (num_enq > 0)) {
2752695db95SArtur Trybula 				size_t nb_b_to_mov =
2762695db95SArtur Trybula 				      ops_unused * sizeof(struct rte_comp_op *);
2772695db95SArtur Trybula 
2782695db95SArtur Trybula 				memmove(ops, &ops[num_enq], nb_b_to_mov);
2792695db95SArtur Trybula 			}
2802695db95SArtur Trybula 
2812695db95SArtur Trybula 			/* Allocate compression operations */
2822695db95SArtur Trybula 			if (ops_needed && rte_mempool_get_bulk(
2832695db95SArtur Trybula 						mem->op_pool,
28481353ea4SRaja Zidane 						(void **)&ops[ops_unused],
2852695db95SArtur Trybula 						ops_needed) != 0) {
2862695db95SArtur Trybula 				RTE_LOG(ERR, USER1,
2872695db95SArtur Trybula 				      "Could not allocate enough operations\n");
2882695db95SArtur Trybula 				res = -1;
2892695db95SArtur Trybula 				goto end;
2902695db95SArtur Trybula 			}
2912695db95SArtur Trybula 			allocated += ops_needed;
2922695db95SArtur Trybula 
2932695db95SArtur Trybula 			for (i = 0; i < ops_needed; i++) {
2942695db95SArtur Trybula 				/*
2952695db95SArtur Trybula 				 * Calculate next buffer to attach to operation
2962695db95SArtur Trybula 				 */
2972695db95SArtur Trybula 				uint32_t buf_id = total_enq_ops + i +
2982695db95SArtur Trybula 						ops_unused;
2992695db95SArtur Trybula 				uint16_t op_id = ops_unused + i;
3002695db95SArtur Trybula 				/* Reset all data in output buffers */
3012695db95SArtur Trybula 				struct rte_mbuf *m = output_bufs[buf_id];
3022695db95SArtur Trybula 
3032695db95SArtur Trybula 				m->pkt_len = out_seg_sz * m->nb_segs;
3042695db95SArtur Trybula 				while (m) {
3052695db95SArtur Trybula 					m->data_len = m->buf_len - m->data_off;
3062695db95SArtur Trybula 					m = m->next;
3072695db95SArtur Trybula 				}
3082695db95SArtur Trybula 				ops[op_id]->m_src = input_bufs[buf_id];
3092695db95SArtur Trybula 				ops[op_id]->m_dst = output_bufs[buf_id];
3102695db95SArtur Trybula 				ops[op_id]->src.offset = 0;
3112695db95SArtur Trybula 				ops[op_id]->src.length =
3122695db95SArtur Trybula 					rte_pktmbuf_pkt_len(input_bufs[buf_id]);
3132695db95SArtur Trybula 				ops[op_id]->dst.offset = 0;
3142695db95SArtur Trybula 				ops[op_id]->flush_flag = RTE_COMP_FLUSH_FINAL;
3152695db95SArtur Trybula 				ops[op_id]->input_chksum = buf_id;
3162695db95SArtur Trybula 				ops[op_id]->private_xform = priv_xform;
3172695db95SArtur Trybula 			}
3182695db95SArtur Trybula 
3192695db95SArtur Trybula 			if (unlikely(test_data->perf_comp_force_stop))
3202695db95SArtur Trybula 				goto end;
3212695db95SArtur Trybula 
3222695db95SArtur Trybula 			tsc_start = rte_rdtsc_precise();
3232695db95SArtur Trybula 			num_enq = rte_compressdev_enqueue_burst(dev_id,
3242695db95SArtur Trybula 								mem->qp_id, ops,
3252695db95SArtur Trybula 								num_ops);
3262695db95SArtur Trybula 			tsc_end = rte_rdtsc_precise();
3272695db95SArtur Trybula 			tsc_duration = tsc_end - tsc_start;
3282695db95SArtur Trybula 			ctx->duration_enq += tsc_duration;
3292695db95SArtur Trybula 
3302695db95SArtur Trybula 			if (num_enq < num_ops)
3312695db95SArtur Trybula 				ctx->ops_enq_retries++;
3322695db95SArtur Trybula 
3332695db95SArtur Trybula 			if (test_data->cyclecount_delay)
3342695db95SArtur Trybula 				rte_delay_us_block(test_data->cyclecount_delay);
3352695db95SArtur Trybula 
3362695db95SArtur Trybula 			if (num_enq == 0) {
3372695db95SArtur Trybula 				struct rte_compressdev_stats stats;
3382695db95SArtur Trybula 
3392695db95SArtur Trybula 				rte_compressdev_stats_get(dev_id, &stats);
3402695db95SArtur Trybula 				if (stats.enqueue_err_count) {
3412695db95SArtur Trybula 					res = -1;
3422695db95SArtur Trybula 					goto end;
3432695db95SArtur Trybula 				}
3442695db95SArtur Trybula 			}
3452695db95SArtur Trybula 
3462695db95SArtur Trybula 			ops_unused = num_ops - num_enq;
3472695db95SArtur Trybula 			remaining_ops -= num_enq;
3482695db95SArtur Trybula 			total_enq_ops += num_enq;
3492695db95SArtur Trybula 
3502695db95SArtur Trybula 			tsc_start = rte_rdtsc_precise();
3512695db95SArtur Trybula 			num_deq = rte_compressdev_dequeue_burst(dev_id,
3522695db95SArtur Trybula 							   mem->qp_id,
3532695db95SArtur Trybula 							   deq_ops,
3542695db95SArtur Trybula 							   allocated);
3552695db95SArtur Trybula 			tsc_end = rte_rdtsc_precise();
3562695db95SArtur Trybula 			tsc_duration = tsc_end - tsc_start;
3572695db95SArtur Trybula 			ctx->duration_deq += tsc_duration;
3582695db95SArtur Trybula 
3592695db95SArtur Trybula 			if (num_deq < allocated)
3602695db95SArtur Trybula 				ctx->ops_deq_retries++;
3612695db95SArtur Trybula 
3622695db95SArtur Trybula 			total_deq_ops += num_deq;
3632695db95SArtur Trybula 
3642695db95SArtur Trybula 			if (iter == num_iter - 1) {
3652695db95SArtur Trybula 				for (i = 0; i < num_deq; i++) {
3662695db95SArtur Trybula 					struct rte_comp_op *op = deq_ops[i];
3672695db95SArtur Trybula 
3682695db95SArtur Trybula 					if (op->status !=
3692695db95SArtur Trybula 						RTE_COMP_OP_STATUS_SUCCESS) {
3702695db95SArtur Trybula 						RTE_LOG(ERR, USER1, "Some operations were not successful\n");
3712695db95SArtur Trybula 						goto end;
3722695db95SArtur Trybula 					}
3732695db95SArtur Trybula 
3742695db95SArtur Trybula 					struct rte_mbuf *m = op->m_dst;
3752695db95SArtur Trybula 
3762695db95SArtur Trybula 					m->pkt_len = op->produced;
3772695db95SArtur Trybula 					uint32_t remaining_data = op->produced;
3782695db95SArtur Trybula 					uint16_t data_to_append;
3792695db95SArtur Trybula 
3802695db95SArtur Trybula 					while (remaining_data > 0) {
3812695db95SArtur Trybula 						data_to_append =
3822695db95SArtur Trybula 							RTE_MIN(remaining_data,
3832695db95SArtur Trybula 							     out_seg_sz);
3842695db95SArtur Trybula 						m->data_len = data_to_append;
3852695db95SArtur Trybula 						remaining_data -=
3862695db95SArtur Trybula 								data_to_append;
3872695db95SArtur Trybula 						m = m->next;
3882695db95SArtur Trybula 					}
3892695db95SArtur Trybula 				}
3902695db95SArtur Trybula 			}
3912695db95SArtur Trybula 			rte_mempool_put_bulk(mem->op_pool,
3922695db95SArtur Trybula 					     (void **)deq_ops, num_deq);
3932695db95SArtur Trybula 			allocated -= num_deq;
3942695db95SArtur Trybula 		}
3952695db95SArtur Trybula 
3962695db95SArtur Trybula 		/* Dequeue the last operations */
3972695db95SArtur Trybula 		while (total_deq_ops < total_ops) {
3982695db95SArtur Trybula 			if (unlikely(test_data->perf_comp_force_stop))
3992695db95SArtur Trybula 				goto end;
4002695db95SArtur Trybula 
4012695db95SArtur Trybula 			tsc_start = rte_rdtsc_precise();
4022695db95SArtur Trybula 			num_deq = rte_compressdev_dequeue_burst(dev_id,
4032695db95SArtur Trybula 						mem->qp_id,
4042695db95SArtur Trybula 						deq_ops,
4052695db95SArtur Trybula 						test_data->burst_sz);
4062695db95SArtur Trybula 			tsc_end = rte_rdtsc_precise();
4072695db95SArtur Trybula 			tsc_duration = tsc_end - tsc_start;
4082695db95SArtur Trybula 			ctx->duration_deq += tsc_duration;
4092695db95SArtur Trybula 			ctx->ops_deq_retries++;
4102695db95SArtur Trybula 
4112695db95SArtur Trybula 			if (num_deq == 0) {
4122695db95SArtur Trybula 				struct rte_compressdev_stats stats;
4132695db95SArtur Trybula 
4142695db95SArtur Trybula 				rte_compressdev_stats_get(dev_id, &stats);
4152695db95SArtur Trybula 				if (stats.dequeue_err_count) {
4162695db95SArtur Trybula 					res = -1;
4172695db95SArtur Trybula 					goto end;
4182695db95SArtur Trybula 				}
4192695db95SArtur Trybula 			}
4202695db95SArtur Trybula 			total_deq_ops += num_deq;
4212695db95SArtur Trybula 
4222695db95SArtur Trybula 			if (iter == num_iter - 1) {
4232695db95SArtur Trybula 				for (i = 0; i < num_deq; i++) {
4242695db95SArtur Trybula 					struct rte_comp_op *op = deq_ops[i];
4252695db95SArtur Trybula 
4262695db95SArtur Trybula 					if (op->status !=
4272695db95SArtur Trybula 						RTE_COMP_OP_STATUS_SUCCESS) {
4282695db95SArtur Trybula 						RTE_LOG(ERR, USER1, "Some operations were not successful\n");
4292695db95SArtur Trybula 						goto end;
4302695db95SArtur Trybula 					}
4312695db95SArtur Trybula 
4322695db95SArtur Trybula 					struct rte_mbuf *m = op->m_dst;
4332695db95SArtur Trybula 
4342695db95SArtur Trybula 					m->pkt_len = op->produced;
4352695db95SArtur Trybula 					uint32_t remaining_data = op->produced;
4362695db95SArtur Trybula 					uint16_t data_to_append;
4372695db95SArtur Trybula 
4382695db95SArtur Trybula 					while (remaining_data > 0) {
4392695db95SArtur Trybula 						data_to_append =
4402695db95SArtur Trybula 						RTE_MIN(remaining_data,
4412695db95SArtur Trybula 							out_seg_sz);
4422695db95SArtur Trybula 						m->data_len = data_to_append;
4432695db95SArtur Trybula 						remaining_data -=
4442695db95SArtur Trybula 								data_to_append;
4452695db95SArtur Trybula 						m = m->next;
4462695db95SArtur Trybula 					}
4472695db95SArtur Trybula 				}
4482695db95SArtur Trybula 			}
4492695db95SArtur Trybula 			rte_mempool_put_bulk(mem->op_pool,
4502695db95SArtur Trybula 					     (void **)deq_ops, num_deq);
4512695db95SArtur Trybula 			allocated -= num_deq;
4522695db95SArtur Trybula 		}
4532695db95SArtur Trybula 	}
4542695db95SArtur Trybula 	allocated = 0;
4552695db95SArtur Trybula 
4562695db95SArtur Trybula end:
4572695db95SArtur Trybula 	if (allocated)
4582695db95SArtur Trybula 		rte_mempool_put_bulk(mem->op_pool, (void **)ops, allocated);
4592695db95SArtur Trybula 	rte_compressdev_private_xform_free(dev_id, priv_xform);
4602695db95SArtur Trybula 	rte_free(ops);
4612695db95SArtur Trybula 
4622695db95SArtur Trybula 	if (test_data->perf_comp_force_stop) {
4632695db95SArtur Trybula 		RTE_LOG(ERR, USER1,
4642695db95SArtur Trybula 		      "lcore: %d Perf. test has been aborted by user\n",
4652695db95SArtur Trybula 			mem->lcore_id);
4662695db95SArtur Trybula 		res = -1;
4672695db95SArtur Trybula 	}
4682695db95SArtur Trybula 	return res;
4692695db95SArtur Trybula }
4702695db95SArtur Trybula 
4712695db95SArtur Trybula int
cperf_cyclecount_test_runner(void * test_ctx)4722695db95SArtur Trybula cperf_cyclecount_test_runner(void *test_ctx)
4732695db95SArtur Trybula {
4742695db95SArtur Trybula 	struct cperf_cyclecount_ctx *ctx = test_ctx;
4752695db95SArtur Trybula 	struct comp_test_data *test_data = ctx->ver.options;
4762695db95SArtur Trybula 	uint32_t lcore = rte_lcore_id();
477d3fcd87cSJoyce Kong 	static uint16_t display_once;
4782695db95SArtur Trybula 	static rte_spinlock_t print_spinlock;
4792695db95SArtur Trybula 	int i;
4802695db95SArtur Trybula 
4812695db95SArtur Trybula 	uint32_t ops_enq_retries_comp;
4822695db95SArtur Trybula 	uint32_t ops_deq_retries_comp;
4832695db95SArtur Trybula 
4842695db95SArtur Trybula 	uint32_t ops_enq_retries_decomp;
4852695db95SArtur Trybula 	uint32_t ops_deq_retries_decomp;
4862695db95SArtur Trybula 
4872695db95SArtur Trybula 	uint32_t duration_setup_per_op;
4882695db95SArtur Trybula 
4892695db95SArtur Trybula 	uint32_t duration_enq_per_op_comp;
4902695db95SArtur Trybula 	uint32_t duration_deq_per_op_comp;
4912695db95SArtur Trybula 
4922695db95SArtur Trybula 	uint32_t duration_enq_per_op_decomp;
4932695db95SArtur Trybula 	uint32_t duration_deq_per_op_decomp;
4942695db95SArtur Trybula 
4952695db95SArtur Trybula 	ctx->ver.mem.lcore_id = lcore;
4962695db95SArtur Trybula 
497d3fcd87cSJoyce Kong 	uint16_t exp = 0;
4982695db95SArtur Trybula 	/*
4992695db95SArtur Trybula 	 * printing information about current compression thread
5002695db95SArtur Trybula 	 */
501*b6a7e685STyler Retzlaff 	if (rte_atomic_compare_exchange_strong_explicit(&ctx->ver.mem.print_info_once, &exp,
502*b6a7e685STyler Retzlaff 				1, rte_memory_order_relaxed,  rte_memory_order_relaxed))
5032695db95SArtur Trybula 		printf("    lcore: %u,"
5042695db95SArtur Trybula 				" driver name: %s,"
5052695db95SArtur Trybula 				" device name: %s,"
5062695db95SArtur Trybula 				" device id: %u,"
5072695db95SArtur Trybula 				" socket id: %u,"
5082695db95SArtur Trybula 				" queue pair id: %u\n",
5092695db95SArtur Trybula 			lcore,
5102695db95SArtur Trybula 			ctx->ver.options->driver_name,
5112695db95SArtur Trybula 			rte_compressdev_name_get(ctx->ver.mem.dev_id),
5122695db95SArtur Trybula 			ctx->ver.mem.dev_id,
5132695db95SArtur Trybula 			rte_compressdev_socket_id(ctx->ver.mem.dev_id),
5142695db95SArtur Trybula 			ctx->ver.mem.qp_id);
5152695db95SArtur Trybula 
5162695db95SArtur Trybula 	/*
5172695db95SArtur Trybula 	 * First the verification part is needed
5182695db95SArtur Trybula 	 */
5192695db95SArtur Trybula 	if (cperf_verify_test_runner(&ctx->ver))
5202695db95SArtur Trybula 		return EXIT_FAILURE;
5212695db95SArtur Trybula 
52283cc3b90SMichael Baum 	if (test_data->test_op & COMPRESS) {
5232695db95SArtur Trybula 		/*
52483cc3b90SMichael Baum 		 * Run the test twice, discarding the first performance
5252695db95SArtur Trybula 		 * results, before the cache is warmed up
5262695db95SArtur Trybula 		 */
5272695db95SArtur Trybula 		for (i = 0; i < 2; i++) {
5282695db95SArtur Trybula 			if (main_loop(ctx, RTE_COMP_COMPRESS) < 0)
5292695db95SArtur Trybula 				return EXIT_FAILURE;
5302695db95SArtur Trybula 		}
5312695db95SArtur Trybula 
5322695db95SArtur Trybula 		ops_enq_retries_comp = ctx->ops_enq_retries;
5332695db95SArtur Trybula 		ops_deq_retries_comp = ctx->ops_deq_retries;
5342695db95SArtur Trybula 
5352695db95SArtur Trybula 		duration_enq_per_op_comp = ctx->duration_enq /
5362695db95SArtur Trybula 				(ctx->ver.mem.total_bufs * test_data->num_iter);
5372695db95SArtur Trybula 		duration_deq_per_op_comp = ctx->duration_deq /
5382695db95SArtur Trybula 				(ctx->ver.mem.total_bufs * test_data->num_iter);
53983cc3b90SMichael Baum 	} else {
54083cc3b90SMichael Baum 		ops_enq_retries_comp = 0;
54183cc3b90SMichael Baum 		ops_deq_retries_comp = 0;
5422695db95SArtur Trybula 
54383cc3b90SMichael Baum 		duration_enq_per_op_comp = 0;
54483cc3b90SMichael Baum 		duration_deq_per_op_comp = 0;
54583cc3b90SMichael Baum 	}
54683cc3b90SMichael Baum 
54783cc3b90SMichael Baum 	if (test_data->test_op & DECOMPRESS) {
54883cc3b90SMichael Baum 		/*
54983cc3b90SMichael Baum 		 * Run the test twice, discarding the first performance
55083cc3b90SMichael Baum 		 * results, before the cache is warmed up
55183cc3b90SMichael Baum 		 */
5522695db95SArtur Trybula 		for (i = 0; i < 2; i++) {
5532695db95SArtur Trybula 			if (main_loop(ctx, RTE_COMP_DECOMPRESS) < 0)
5542695db95SArtur Trybula 				return EXIT_FAILURE;
5552695db95SArtur Trybula 		}
5562695db95SArtur Trybula 
5572695db95SArtur Trybula 		ops_enq_retries_decomp = ctx->ops_enq_retries;
5582695db95SArtur Trybula 		ops_deq_retries_decomp = ctx->ops_deq_retries;
5592695db95SArtur Trybula 
5602695db95SArtur Trybula 		duration_enq_per_op_decomp = ctx->duration_enq /
5612695db95SArtur Trybula 				(ctx->ver.mem.total_bufs * test_data->num_iter);
5622695db95SArtur Trybula 		duration_deq_per_op_decomp = ctx->duration_deq /
5632695db95SArtur Trybula 				(ctx->ver.mem.total_bufs * test_data->num_iter);
56483cc3b90SMichael Baum 	} else {
56583cc3b90SMichael Baum 		ops_enq_retries_decomp = 0;
56683cc3b90SMichael Baum 		ops_deq_retries_decomp = 0;
56783cc3b90SMichael Baum 
56883cc3b90SMichael Baum 		duration_enq_per_op_decomp = 0;
56983cc3b90SMichael Baum 		duration_deq_per_op_decomp = 0;
57083cc3b90SMichael Baum 	}
5712695db95SArtur Trybula 
5722695db95SArtur Trybula 	duration_setup_per_op = ctx->duration_op /
5732695db95SArtur Trybula 			(ctx->ver.mem.total_bufs * test_data->num_iter);
5742695db95SArtur Trybula 
5752695db95SArtur Trybula 	/* R E P O R T processing */
5762695db95SArtur Trybula 	rte_spinlock_lock(&print_spinlock);
5772695db95SArtur Trybula 
578d3fcd87cSJoyce Kong 	if (display_once == 0) {
579d3fcd87cSJoyce Kong 		display_once = 1;
580d3fcd87cSJoyce Kong 
5812695db95SArtur Trybula 		printf("\nLegend for the table\n"
5822695db95SArtur Trybula 		"  - Retries section: number of retries for the following operations:\n"
5832695db95SArtur Trybula 		"    [C-e] - compression enqueue\n"
5842695db95SArtur Trybula 		"    [C-d] - compression dequeue\n"
5852695db95SArtur Trybula 		"    [D-e] - decompression enqueue\n"
5862695db95SArtur Trybula 		"    [D-d] - decompression dequeue\n"
5872695db95SArtur Trybula 		"  - Cycles section: number of cycles per 'op' for the following operations:\n"
5881643fc9bSMichael Baum 		"    setup/op - memory allocation, op configuration and memory deallocation\n"
5892695db95SArtur Trybula 		"    [C-e] - compression enqueue\n"
5902695db95SArtur Trybula 		"    [C-d] - compression dequeue\n"
5912695db95SArtur Trybula 		"    [D-e] - decompression enqueue\n"
5922695db95SArtur Trybula 		"    [D-d] - decompression dequeue\n\n");
5932695db95SArtur Trybula 
5942695db95SArtur Trybula 		printf("\n%12s%6s%12s%17s",
5952695db95SArtur Trybula 			"lcore id", "Level", "Comp size", "Comp ratio [%]");
5962695db95SArtur Trybula 
5972695db95SArtur Trybula 		printf("  |%10s %6s %8s %6s %8s",
5982695db95SArtur Trybula 			" Retries:",
5992695db95SArtur Trybula 			"[C-e]", "[C-d]",
6002695db95SArtur Trybula 			"[D-e]", "[D-d]");
6012695db95SArtur Trybula 
6022695db95SArtur Trybula 		printf("  |%9s %9s %9s %9s %9s %9s\n",
6032695db95SArtur Trybula 			" Cycles:",
6042695db95SArtur Trybula 			"setup/op",
6052695db95SArtur Trybula 			"[C-e]", "[C-d]",
6062695db95SArtur Trybula 			"[D-e]", "[D-d]");
6072695db95SArtur Trybula 	}
6082695db95SArtur Trybula 
6092695db95SArtur Trybula 	printf("%12u"
6102695db95SArtur Trybula 	       "%6u"
6112695db95SArtur Trybula 	       "%12zu"
6122695db95SArtur Trybula 	       "%17.2f",
6132695db95SArtur Trybula 		ctx->ver.mem.lcore_id,
6142695db95SArtur Trybula 		test_data->level,
6152695db95SArtur Trybula 		ctx->ver.comp_data_sz,
6162695db95SArtur Trybula 		ctx->ver.ratio);
6172695db95SArtur Trybula 
6182695db95SArtur Trybula 	printf("  |%10s %6u %8u %6u %8u",
6192695db95SArtur Trybula 	       " ",
6202695db95SArtur Trybula 		ops_enq_retries_comp,
6212695db95SArtur Trybula 		ops_deq_retries_comp,
6222695db95SArtur Trybula 		ops_enq_retries_decomp,
6232695db95SArtur Trybula 		ops_deq_retries_decomp);
6242695db95SArtur Trybula 
6252695db95SArtur Trybula 	printf("  |%9s %9u %9u %9u %9u %9u\n",
6262695db95SArtur Trybula 	       " ",
6272695db95SArtur Trybula 		duration_setup_per_op,
6282695db95SArtur Trybula 		duration_enq_per_op_comp,
6292695db95SArtur Trybula 		duration_deq_per_op_comp,
6302695db95SArtur Trybula 		duration_enq_per_op_decomp,
6312695db95SArtur Trybula 		duration_deq_per_op_decomp);
6322695db95SArtur Trybula 
6332695db95SArtur Trybula 	rte_spinlock_unlock(&print_spinlock);
6342695db95SArtur Trybula 
6352695db95SArtur Trybula 	return EXIT_SUCCESS;
6362695db95SArtur Trybula }
637