xref: /dpdk/app/test-compress-perf/comp_perf_test_verify.c (revision b6a7e6852e9ab82ae0e05e2d2a0b83abca17de3b)
10bf1e98fSTomasz Jozwiak /* SPDX-License-Identifier: BSD-3-Clause
20bf1e98fSTomasz Jozwiak  * Copyright(c) 2018 Intel Corporation
30bf1e98fSTomasz Jozwiak  */
40bf1e98fSTomasz Jozwiak 
572b452c5SDmitry Kozlyuk #include <stdlib.h>
672b452c5SDmitry Kozlyuk 
70bf1e98fSTomasz Jozwiak #include <rte_malloc.h>
80bf1e98fSTomasz Jozwiak #include <rte_eal.h>
90bf1e98fSTomasz Jozwiak #include <rte_log.h>
100bf1e98fSTomasz Jozwiak #include <rte_compressdev.h>
110bf1e98fSTomasz Jozwiak 
120bf1e98fSTomasz Jozwiak #include "comp_perf_test_verify.h"
1350fa48e4STomasz Jozwiak #include "comp_perf_test_common.h"
1450fa48e4STomasz Jozwiak 
1550fa48e4STomasz Jozwiak void
cperf_verify_test_destructor(void * arg)1650fa48e4STomasz Jozwiak cperf_verify_test_destructor(void *arg)
1750fa48e4STomasz Jozwiak {
1850fa48e4STomasz Jozwiak 	if (arg) {
19c02e33b0SAdam Dybkowski 		comp_perf_free_memory(
20c02e33b0SAdam Dybkowski 				((struct cperf_verify_ctx *)arg)->options,
21c02e33b0SAdam Dybkowski 				&((struct cperf_verify_ctx *)arg)->mem);
2250fa48e4STomasz Jozwiak 		rte_free(arg);
2350fa48e4STomasz Jozwiak 	}
2450fa48e4STomasz Jozwiak }
2550fa48e4STomasz Jozwiak 
2650fa48e4STomasz Jozwiak void *
cperf_verify_test_constructor(uint8_t dev_id,uint16_t qp_id,struct comp_test_data * options)2750fa48e4STomasz Jozwiak cperf_verify_test_constructor(uint8_t dev_id, uint16_t qp_id,
2850fa48e4STomasz Jozwiak 		struct comp_test_data *options)
2950fa48e4STomasz Jozwiak {
3050fa48e4STomasz Jozwiak 	struct cperf_verify_ctx *ctx = NULL;
3150fa48e4STomasz Jozwiak 
3250fa48e4STomasz Jozwiak 	ctx = rte_malloc(NULL, sizeof(struct cperf_verify_ctx), 0);
3350fa48e4STomasz Jozwiak 
3450fa48e4STomasz Jozwiak 	if (ctx == NULL)
3550fa48e4STomasz Jozwiak 		return NULL;
3650fa48e4STomasz Jozwiak 
3750fa48e4STomasz Jozwiak 	ctx->mem.dev_id = dev_id;
3850fa48e4STomasz Jozwiak 	ctx->mem.qp_id = qp_id;
3950fa48e4STomasz Jozwiak 	ctx->options = options;
4050fa48e4STomasz Jozwiak 
4150fa48e4STomasz Jozwiak 	if (!comp_perf_allocate_memory(ctx->options, &ctx->mem) &&
4250fa48e4STomasz Jozwiak 			!prepare_bufs(ctx->options, &ctx->mem))
4350fa48e4STomasz Jozwiak 		return ctx;
4450fa48e4STomasz Jozwiak 
4550fa48e4STomasz Jozwiak 	cperf_verify_test_destructor(ctx);
4650fa48e4STomasz Jozwiak 	return NULL;
4750fa48e4STomasz Jozwiak }
480bf1e98fSTomasz Jozwiak 
490bf1e98fSTomasz Jozwiak static int
main_loop(struct cperf_verify_ctx * ctx,enum rte_comp_xform_type type)5050fa48e4STomasz Jozwiak main_loop(struct cperf_verify_ctx *ctx, enum rte_comp_xform_type type)
510bf1e98fSTomasz Jozwiak {
5250fa48e4STomasz Jozwiak 	struct comp_test_data *test_data = ctx->options;
532695db95SArtur Trybula 	uint8_t *output_data_ptr = NULL;
542695db95SArtur Trybula 	size_t *output_data_sz = NULL;
5550fa48e4STomasz Jozwiak 	struct cperf_mem_resources *mem = &ctx->mem;
5650fa48e4STomasz Jozwiak 
5750fa48e4STomasz Jozwiak 	uint8_t dev_id = mem->dev_id;
580bf1e98fSTomasz Jozwiak 	uint32_t i, iter, num_iter;
590bf1e98fSTomasz Jozwiak 	struct rte_comp_op **ops, **deq_ops;
600bf1e98fSTomasz Jozwiak 	void *priv_xform = NULL;
610bf1e98fSTomasz Jozwiak 	struct rte_comp_xform xform;
620bf1e98fSTomasz Jozwiak 	size_t output_size = 0;
630bf1e98fSTomasz Jozwiak 	struct rte_mbuf **input_bufs, **output_bufs;
640bf1e98fSTomasz Jozwiak 	int res = 0;
650bf1e98fSTomasz Jozwiak 	int allocated = 0;
6627cee417STomasz Jozwiak 	uint32_t out_seg_sz;
670bf1e98fSTomasz Jozwiak 
680bf1e98fSTomasz Jozwiak 	if (test_data == NULL || !test_data->burst_sz) {
690bf1e98fSTomasz Jozwiak 		RTE_LOG(ERR, USER1,
700bf1e98fSTomasz Jozwiak 			"Unknown burst size\n");
710bf1e98fSTomasz Jozwiak 		return -1;
720bf1e98fSTomasz Jozwiak 	}
730bf1e98fSTomasz Jozwiak 
740bf1e98fSTomasz Jozwiak 	ops = rte_zmalloc_socket(NULL,
7550fa48e4STomasz Jozwiak 		2 * mem->total_bufs * sizeof(struct rte_comp_op *),
760bf1e98fSTomasz Jozwiak 		0, rte_socket_id());
770bf1e98fSTomasz Jozwiak 
780bf1e98fSTomasz Jozwiak 	if (ops == NULL) {
790bf1e98fSTomasz Jozwiak 		RTE_LOG(ERR, USER1,
807be78d02SJosh Soref 			"Can't allocate memory for ops structures\n");
810bf1e98fSTomasz Jozwiak 		return -1;
820bf1e98fSTomasz Jozwiak 	}
830bf1e98fSTomasz Jozwiak 
8450fa48e4STomasz Jozwiak 	deq_ops = &ops[mem->total_bufs];
850bf1e98fSTomasz Jozwiak 
860bf1e98fSTomasz Jozwiak 	if (type == RTE_COMP_COMPRESS) {
870bf1e98fSTomasz Jozwiak 		xform = (struct rte_comp_xform) {
880bf1e98fSTomasz Jozwiak 			.type = RTE_COMP_COMPRESS,
890bf1e98fSTomasz Jozwiak 			.compress = {
9072c64a34SMichael Baum 				.algo = test_data->test_algo,
9150fa48e4STomasz Jozwiak 				.level = test_data->level,
920bf1e98fSTomasz Jozwiak 				.window_size = test_data->window_sz,
930bf1e98fSTomasz Jozwiak 				.chksum = RTE_COMP_CHECKSUM_NONE,
940bf1e98fSTomasz Jozwiak 				.hash_algo = RTE_COMP_HASH_ALGO_NONE
950bf1e98fSTomasz Jozwiak 			}
960bf1e98fSTomasz Jozwiak 		};
9772c64a34SMichael Baum 		if (test_data->test_algo == RTE_COMP_ALGO_DEFLATE)
9872c64a34SMichael Baum 			xform.compress.deflate.huffman = test_data->huffman_enc;
9972c64a34SMichael Baum 		else if (test_data->test_algo == RTE_COMP_ALGO_LZ4)
10072c64a34SMichael Baum 			xform.compress.lz4.flags = test_data->lz4_flags;
10150fa48e4STomasz Jozwiak 		output_data_ptr = ctx->mem.compressed_data;
10250fa48e4STomasz Jozwiak 		output_data_sz = &ctx->comp_data_sz;
10350fa48e4STomasz Jozwiak 		input_bufs = mem->decomp_bufs;
10450fa48e4STomasz Jozwiak 		output_bufs = mem->comp_bufs;
10527cee417STomasz Jozwiak 		out_seg_sz = test_data->out_seg_sz;
1060bf1e98fSTomasz Jozwiak 	} else {
1070bf1e98fSTomasz Jozwiak 		xform = (struct rte_comp_xform) {
1080bf1e98fSTomasz Jozwiak 			.type = RTE_COMP_DECOMPRESS,
1090bf1e98fSTomasz Jozwiak 			.decompress = {
11072c64a34SMichael Baum 				.algo = test_data->test_algo,
1110bf1e98fSTomasz Jozwiak 				.chksum = RTE_COMP_CHECKSUM_NONE,
1120bf1e98fSTomasz Jozwiak 				.window_size = test_data->window_sz,
1130bf1e98fSTomasz Jozwiak 				.hash_algo = RTE_COMP_HASH_ALGO_NONE
1140bf1e98fSTomasz Jozwiak 			}
1150bf1e98fSTomasz Jozwiak 		};
11672c64a34SMichael Baum 		if (test_data->test_algo == RTE_COMP_ALGO_LZ4)
11772c64a34SMichael Baum 			xform.decompress.lz4.flags = test_data->lz4_flags;
11850fa48e4STomasz Jozwiak 		output_data_ptr = ctx->mem.decompressed_data;
11950fa48e4STomasz Jozwiak 		output_data_sz = &ctx->decomp_data_sz;
12050fa48e4STomasz Jozwiak 		input_bufs = mem->comp_bufs;
12150fa48e4STomasz Jozwiak 		output_bufs = mem->decomp_bufs;
12283cc3b90SMichael Baum 		out_seg_sz = (test_data->test_op & COMPRESS) ?
12383cc3b90SMichael Baum 			     test_data->seg_sz : test_data->out_seg_sz;
1240bf1e98fSTomasz Jozwiak 	}
1250bf1e98fSTomasz Jozwiak 
1260bf1e98fSTomasz Jozwiak 	/* Create private xform */
1270bf1e98fSTomasz Jozwiak 	if (rte_compressdev_private_xform_create(dev_id, &xform,
1280bf1e98fSTomasz Jozwiak 			&priv_xform) < 0) {
1290bf1e98fSTomasz Jozwiak 		RTE_LOG(ERR, USER1, "Private xform could not be created\n");
1300bf1e98fSTomasz Jozwiak 		res = -1;
1310bf1e98fSTomasz Jozwiak 		goto end;
1320bf1e98fSTomasz Jozwiak 	}
1330bf1e98fSTomasz Jozwiak 
1340bf1e98fSTomasz Jozwiak 	num_iter = 1;
1350bf1e98fSTomasz Jozwiak 
1360bf1e98fSTomasz Jozwiak 	for (iter = 0; iter < num_iter; iter++) {
13750fa48e4STomasz Jozwiak 		uint32_t total_ops = mem->total_bufs;
13850fa48e4STomasz Jozwiak 		uint32_t remaining_ops = mem->total_bufs;
1390bf1e98fSTomasz Jozwiak 		uint32_t total_deq_ops = 0;
1400bf1e98fSTomasz Jozwiak 		uint32_t total_enq_ops = 0;
1410bf1e98fSTomasz Jozwiak 		uint16_t ops_unused = 0;
1420bf1e98fSTomasz Jozwiak 		uint16_t num_enq = 0;
1430bf1e98fSTomasz Jozwiak 		uint16_t num_deq = 0;
1440bf1e98fSTomasz Jozwiak 
1450bf1e98fSTomasz Jozwiak 		output_size = 0;
1460bf1e98fSTomasz Jozwiak 
1470bf1e98fSTomasz Jozwiak 		while (remaining_ops > 0) {
1480bf1e98fSTomasz Jozwiak 			uint16_t num_ops = RTE_MIN(remaining_ops,
1490bf1e98fSTomasz Jozwiak 						   test_data->burst_sz);
1500bf1e98fSTomasz Jozwiak 			uint16_t ops_needed = num_ops - ops_unused;
1510bf1e98fSTomasz Jozwiak 
1520bf1e98fSTomasz Jozwiak 			/*
1530bf1e98fSTomasz Jozwiak 			 * Move the unused operations from the previous
1540bf1e98fSTomasz Jozwiak 			 * enqueue_burst call to the front, to maintain order
1550bf1e98fSTomasz Jozwiak 			 */
1560bf1e98fSTomasz Jozwiak 			if ((ops_unused > 0) && (num_enq > 0)) {
1570bf1e98fSTomasz Jozwiak 				size_t nb_b_to_mov =
1580bf1e98fSTomasz Jozwiak 				      ops_unused * sizeof(struct rte_comp_op *);
1590bf1e98fSTomasz Jozwiak 
1600bf1e98fSTomasz Jozwiak 				memmove(ops, &ops[num_enq], nb_b_to_mov);
1610bf1e98fSTomasz Jozwiak 			}
1620bf1e98fSTomasz Jozwiak 
1630bf1e98fSTomasz Jozwiak 			/* Allocate compression operations */
1640bf1e98fSTomasz Jozwiak 			if (ops_needed && !rte_comp_op_bulk_alloc(
16550fa48e4STomasz Jozwiak 						mem->op_pool,
1660bf1e98fSTomasz Jozwiak 						&ops[ops_unused],
1670bf1e98fSTomasz Jozwiak 						ops_needed)) {
1680bf1e98fSTomasz Jozwiak 				RTE_LOG(ERR, USER1,
1690bf1e98fSTomasz Jozwiak 				      "Could not allocate enough operations\n");
1700bf1e98fSTomasz Jozwiak 				res = -1;
1710bf1e98fSTomasz Jozwiak 				goto end;
1720bf1e98fSTomasz Jozwiak 			}
1730bf1e98fSTomasz Jozwiak 			allocated += ops_needed;
1740bf1e98fSTomasz Jozwiak 
1750bf1e98fSTomasz Jozwiak 			for (i = 0; i < ops_needed; i++) {
1760bf1e98fSTomasz Jozwiak 				/*
1770bf1e98fSTomasz Jozwiak 				 * Calculate next buffer to attach to operation
1780bf1e98fSTomasz Jozwiak 				 */
1790bf1e98fSTomasz Jozwiak 				uint32_t buf_id = total_enq_ops + i +
1800bf1e98fSTomasz Jozwiak 						ops_unused;
1810bf1e98fSTomasz Jozwiak 				uint16_t op_id = ops_unused + i;
1820bf1e98fSTomasz Jozwiak 				/* Reset all data in output buffers */
1830bf1e98fSTomasz Jozwiak 				struct rte_mbuf *m = output_bufs[buf_id];
1840bf1e98fSTomasz Jozwiak 
18527cee417STomasz Jozwiak 				m->pkt_len = out_seg_sz * m->nb_segs;
1860bf1e98fSTomasz Jozwiak 				while (m) {
1870bf1e98fSTomasz Jozwiak 					m->data_len = m->buf_len - m->data_off;
1880bf1e98fSTomasz Jozwiak 					m = m->next;
1890bf1e98fSTomasz Jozwiak 				}
1900bf1e98fSTomasz Jozwiak 				ops[op_id]->m_src = input_bufs[buf_id];
1910bf1e98fSTomasz Jozwiak 				ops[op_id]->m_dst = output_bufs[buf_id];
1920bf1e98fSTomasz Jozwiak 				ops[op_id]->src.offset = 0;
1930bf1e98fSTomasz Jozwiak 				ops[op_id]->src.length =
1940bf1e98fSTomasz Jozwiak 					rte_pktmbuf_pkt_len(input_bufs[buf_id]);
1950bf1e98fSTomasz Jozwiak 				ops[op_id]->dst.offset = 0;
1960bf1e98fSTomasz Jozwiak 				ops[op_id]->flush_flag = RTE_COMP_FLUSH_FINAL;
1970bf1e98fSTomasz Jozwiak 				ops[op_id]->input_chksum = buf_id;
1980bf1e98fSTomasz Jozwiak 				ops[op_id]->private_xform = priv_xform;
1990bf1e98fSTomasz Jozwiak 			}
2000bf1e98fSTomasz Jozwiak 
201d6cec113STomasz Jozwiak 			if (unlikely(test_data->perf_comp_force_stop))
202d6cec113STomasz Jozwiak 				goto end;
203d6cec113STomasz Jozwiak 
20450fa48e4STomasz Jozwiak 			num_enq = rte_compressdev_enqueue_burst(dev_id,
20550fa48e4STomasz Jozwiak 								mem->qp_id, ops,
2060bf1e98fSTomasz Jozwiak 								num_ops);
2070bf1e98fSTomasz Jozwiak 			if (num_enq == 0) {
2080bf1e98fSTomasz Jozwiak 				struct rte_compressdev_stats stats;
2090bf1e98fSTomasz Jozwiak 
2100bf1e98fSTomasz Jozwiak 				rte_compressdev_stats_get(dev_id, &stats);
2110bf1e98fSTomasz Jozwiak 				if (stats.enqueue_err_count) {
2120bf1e98fSTomasz Jozwiak 					res = -1;
2130bf1e98fSTomasz Jozwiak 					goto end;
2140bf1e98fSTomasz Jozwiak 				}
2150bf1e98fSTomasz Jozwiak 			}
2160bf1e98fSTomasz Jozwiak 
2170bf1e98fSTomasz Jozwiak 			ops_unused = num_ops - num_enq;
2180bf1e98fSTomasz Jozwiak 			remaining_ops -= num_enq;
2190bf1e98fSTomasz Jozwiak 			total_enq_ops += num_enq;
2200bf1e98fSTomasz Jozwiak 
22150fa48e4STomasz Jozwiak 			num_deq = rte_compressdev_dequeue_burst(dev_id,
22250fa48e4STomasz Jozwiak 							   mem->qp_id,
2230bf1e98fSTomasz Jozwiak 							   deq_ops,
2240bf1e98fSTomasz Jozwiak 							   test_data->burst_sz);
2250bf1e98fSTomasz Jozwiak 			total_deq_ops += num_deq;
2260bf1e98fSTomasz Jozwiak 
2270bf1e98fSTomasz Jozwiak 			for (i = 0; i < num_deq; i++) {
2280bf1e98fSTomasz Jozwiak 				struct rte_comp_op *op = deq_ops[i];
2290bf1e98fSTomasz Jozwiak 
230971d89f5SAdam Dybkowski 				if (op->status ==
231971d89f5SAdam Dybkowski 				  RTE_COMP_OP_STATUS_OUT_OF_SPACE_TERMINATED ||
232971d89f5SAdam Dybkowski 				  op->status ==
233971d89f5SAdam Dybkowski 				  RTE_COMP_OP_STATUS_OUT_OF_SPACE_RECOVERABLE) {
234971d89f5SAdam Dybkowski 					RTE_LOG(ERR, USER1,
2351643fc9bSMichael Baum "Out of space error occurred due to incompressible input data expanding to larger than destination buffer. Increase the EXPANSE_RATIO constant to use this data.\n");
236971d89f5SAdam Dybkowski 					res = -1;
237971d89f5SAdam Dybkowski 					goto end;
238971d89f5SAdam Dybkowski 				} else if (op->status !=
239971d89f5SAdam Dybkowski 						RTE_COMP_OP_STATUS_SUCCESS) {
2400bf1e98fSTomasz Jozwiak 					RTE_LOG(ERR, USER1,
2410bf1e98fSTomasz Jozwiak 						"Some operations were not successful\n");
2420bf1e98fSTomasz Jozwiak 					goto end;
2430bf1e98fSTomasz Jozwiak 				}
2440bf1e98fSTomasz Jozwiak 
2450bf1e98fSTomasz Jozwiak 				const void *read_data_addr =
2460bf1e98fSTomasz Jozwiak 						rte_pktmbuf_read(op->m_dst, 0,
2470bf1e98fSTomasz Jozwiak 						op->produced, output_data_ptr);
2480bf1e98fSTomasz Jozwiak 				if (read_data_addr == NULL) {
2490bf1e98fSTomasz Jozwiak 					RTE_LOG(ERR, USER1,
2500bf1e98fSTomasz Jozwiak 						"Could not copy buffer in destination\n");
2510bf1e98fSTomasz Jozwiak 					res = -1;
2520bf1e98fSTomasz Jozwiak 					goto end;
2530bf1e98fSTomasz Jozwiak 				}
2540bf1e98fSTomasz Jozwiak 
2550bf1e98fSTomasz Jozwiak 				if (read_data_addr != output_data_ptr)
2560bf1e98fSTomasz Jozwiak 					rte_memcpy(output_data_ptr,
2570bf1e98fSTomasz Jozwiak 						   rte_pktmbuf_mtod(op->m_dst,
2580bf1e98fSTomasz Jozwiak 								    uint8_t *),
2590bf1e98fSTomasz Jozwiak 						   op->produced);
2600bf1e98fSTomasz Jozwiak 				output_data_ptr += op->produced;
2610bf1e98fSTomasz Jozwiak 				output_size += op->produced;
2620bf1e98fSTomasz Jozwiak 
2630bf1e98fSTomasz Jozwiak 			}
2640bf1e98fSTomasz Jozwiak 
2650bf1e98fSTomasz Jozwiak 
2660bf1e98fSTomasz Jozwiak 			if (iter == num_iter - 1) {
2670bf1e98fSTomasz Jozwiak 				for (i = 0; i < num_deq; i++) {
2680bf1e98fSTomasz Jozwiak 					struct rte_comp_op *op = deq_ops[i];
2690bf1e98fSTomasz Jozwiak 					struct rte_mbuf *m = op->m_dst;
2700bf1e98fSTomasz Jozwiak 
2710bf1e98fSTomasz Jozwiak 					m->pkt_len = op->produced;
2720bf1e98fSTomasz Jozwiak 					uint32_t remaining_data = op->produced;
2730bf1e98fSTomasz Jozwiak 					uint16_t data_to_append;
2740bf1e98fSTomasz Jozwiak 
2750bf1e98fSTomasz Jozwiak 					while (remaining_data > 0) {
2760bf1e98fSTomasz Jozwiak 						data_to_append =
2770bf1e98fSTomasz Jozwiak 							RTE_MIN(remaining_data,
27827cee417STomasz Jozwiak 							out_seg_sz);
2790bf1e98fSTomasz Jozwiak 						m->data_len = data_to_append;
2800bf1e98fSTomasz Jozwiak 						remaining_data -=
2810bf1e98fSTomasz Jozwiak 								data_to_append;
2820bf1e98fSTomasz Jozwiak 						m = m->next;
2830bf1e98fSTomasz Jozwiak 					}
2840bf1e98fSTomasz Jozwiak 				}
2850bf1e98fSTomasz Jozwiak 			}
28650fa48e4STomasz Jozwiak 			rte_mempool_put_bulk(mem->op_pool,
2870bf1e98fSTomasz Jozwiak 					     (void **)deq_ops, num_deq);
2880bf1e98fSTomasz Jozwiak 			allocated -= num_deq;
2890bf1e98fSTomasz Jozwiak 		}
2900bf1e98fSTomasz Jozwiak 
2910bf1e98fSTomasz Jozwiak 		/* Dequeue the last operations */
2920bf1e98fSTomasz Jozwiak 		while (total_deq_ops < total_ops) {
293d6cec113STomasz Jozwiak 			if (unlikely(test_data->perf_comp_force_stop))
294d6cec113STomasz Jozwiak 				goto end;
295d6cec113STomasz Jozwiak 
29650fa48e4STomasz Jozwiak 			num_deq = rte_compressdev_dequeue_burst(dev_id,
29750fa48e4STomasz Jozwiak 							mem->qp_id,
29850fa48e4STomasz Jozwiak 							deq_ops,
29950fa48e4STomasz Jozwiak 							test_data->burst_sz);
3000bf1e98fSTomasz Jozwiak 			if (num_deq == 0) {
3010bf1e98fSTomasz Jozwiak 				struct rte_compressdev_stats stats;
3020bf1e98fSTomasz Jozwiak 
3030bf1e98fSTomasz Jozwiak 				rte_compressdev_stats_get(dev_id, &stats);
3040bf1e98fSTomasz Jozwiak 				if (stats.dequeue_err_count) {
3050bf1e98fSTomasz Jozwiak 					res = -1;
3060bf1e98fSTomasz Jozwiak 					goto end;
3070bf1e98fSTomasz Jozwiak 				}
3080bf1e98fSTomasz Jozwiak 			}
3090bf1e98fSTomasz Jozwiak 
3100bf1e98fSTomasz Jozwiak 			total_deq_ops += num_deq;
3110bf1e98fSTomasz Jozwiak 
3120bf1e98fSTomasz Jozwiak 			for (i = 0; i < num_deq; i++) {
3130bf1e98fSTomasz Jozwiak 				struct rte_comp_op *op = deq_ops[i];
3140bf1e98fSTomasz Jozwiak 
315971d89f5SAdam Dybkowski 				if (op->status ==
316971d89f5SAdam Dybkowski 				  RTE_COMP_OP_STATUS_OUT_OF_SPACE_TERMINATED ||
317971d89f5SAdam Dybkowski 				  op->status ==
318971d89f5SAdam Dybkowski 				  RTE_COMP_OP_STATUS_OUT_OF_SPACE_RECOVERABLE) {
319971d89f5SAdam Dybkowski 					RTE_LOG(ERR, USER1,
3201643fc9bSMichael Baum "Out of space error occurred due to incompressible input data expanding to larger than destination buffer. Increase the EXPANSE_RATIO constant to use this data.\n");
321971d89f5SAdam Dybkowski 					res = -1;
322971d89f5SAdam Dybkowski 					goto end;
323971d89f5SAdam Dybkowski 				} else if (op->status !=
324971d89f5SAdam Dybkowski 						RTE_COMP_OP_STATUS_SUCCESS) {
3250bf1e98fSTomasz Jozwiak 					RTE_LOG(ERR, USER1,
3260bf1e98fSTomasz Jozwiak 						"Some operations were not successful\n");
3270bf1e98fSTomasz Jozwiak 					goto end;
3280bf1e98fSTomasz Jozwiak 				}
3290bf1e98fSTomasz Jozwiak 				const void *read_data_addr =
3300bf1e98fSTomasz Jozwiak 						rte_pktmbuf_read(op->m_dst,
3310bf1e98fSTomasz Jozwiak 								 op->dst.offset,
3320bf1e98fSTomasz Jozwiak 						op->produced, output_data_ptr);
3330bf1e98fSTomasz Jozwiak 				if (read_data_addr == NULL) {
3340bf1e98fSTomasz Jozwiak 					RTE_LOG(ERR, USER1,
3350bf1e98fSTomasz Jozwiak 						"Could not copy buffer in destination\n");
3360bf1e98fSTomasz Jozwiak 					res = -1;
3370bf1e98fSTomasz Jozwiak 					goto end;
3380bf1e98fSTomasz Jozwiak 				}
3390bf1e98fSTomasz Jozwiak 
3400bf1e98fSTomasz Jozwiak 				if (read_data_addr != output_data_ptr)
3410bf1e98fSTomasz Jozwiak 					rte_memcpy(output_data_ptr,
3420bf1e98fSTomasz Jozwiak 						   rte_pktmbuf_mtod(
3430bf1e98fSTomasz Jozwiak 							op->m_dst, uint8_t *),
3440bf1e98fSTomasz Jozwiak 						   op->produced);
3450bf1e98fSTomasz Jozwiak 				output_data_ptr += op->produced;
3460bf1e98fSTomasz Jozwiak 				output_size += op->produced;
3470bf1e98fSTomasz Jozwiak 
3480bf1e98fSTomasz Jozwiak 			}
3490bf1e98fSTomasz Jozwiak 
3500bf1e98fSTomasz Jozwiak 			if (iter == num_iter - 1) {
3510bf1e98fSTomasz Jozwiak 				for (i = 0; i < num_deq; i++) {
3520bf1e98fSTomasz Jozwiak 					struct rte_comp_op *op = deq_ops[i];
3530bf1e98fSTomasz Jozwiak 					struct rte_mbuf *m = op->m_dst;
3540bf1e98fSTomasz Jozwiak 
3550bf1e98fSTomasz Jozwiak 					m->pkt_len = op->produced;
3560bf1e98fSTomasz Jozwiak 					uint32_t remaining_data = op->produced;
3570bf1e98fSTomasz Jozwiak 					uint16_t data_to_append;
3580bf1e98fSTomasz Jozwiak 
3590bf1e98fSTomasz Jozwiak 					while (remaining_data > 0) {
3600bf1e98fSTomasz Jozwiak 						data_to_append =
3610bf1e98fSTomasz Jozwiak 						RTE_MIN(remaining_data,
36227cee417STomasz Jozwiak 							out_seg_sz);
3630bf1e98fSTomasz Jozwiak 						m->data_len = data_to_append;
3640bf1e98fSTomasz Jozwiak 						remaining_data -=
3650bf1e98fSTomasz Jozwiak 								data_to_append;
3660bf1e98fSTomasz Jozwiak 						m = m->next;
3670bf1e98fSTomasz Jozwiak 					}
3680bf1e98fSTomasz Jozwiak 				}
3690bf1e98fSTomasz Jozwiak 			}
37050fa48e4STomasz Jozwiak 			rte_mempool_put_bulk(mem->op_pool,
3710bf1e98fSTomasz Jozwiak 					     (void **)deq_ops, num_deq);
3720bf1e98fSTomasz Jozwiak 			allocated -= num_deq;
3730bf1e98fSTomasz Jozwiak 		}
3740bf1e98fSTomasz Jozwiak 	}
3750bf1e98fSTomasz Jozwiak 
3760bf1e98fSTomasz Jozwiak 	if (output_data_sz)
3770bf1e98fSTomasz Jozwiak 		*output_data_sz = output_size;
3780bf1e98fSTomasz Jozwiak end:
37950fa48e4STomasz Jozwiak 	rte_mempool_put_bulk(mem->op_pool, (void **)ops, allocated);
3800bf1e98fSTomasz Jozwiak 	rte_compressdev_private_xform_free(dev_id, priv_xform);
3810bf1e98fSTomasz Jozwiak 	rte_free(ops);
382d6cec113STomasz Jozwiak 
383d6cec113STomasz Jozwiak 	if (test_data->perf_comp_force_stop) {
384d6cec113STomasz Jozwiak 		RTE_LOG(ERR, USER1,
385d6cec113STomasz Jozwiak 		      "lcore: %d Perf. test has been aborted by user\n",
386d6cec113STomasz Jozwiak 			mem->lcore_id);
387d6cec113STomasz Jozwiak 		res = -1;
388d6cec113STomasz Jozwiak 	}
389d6cec113STomasz Jozwiak 
3900bf1e98fSTomasz Jozwiak 	return res;
3910bf1e98fSTomasz Jozwiak }
3920bf1e98fSTomasz Jozwiak 
3930bf1e98fSTomasz Jozwiak int
cperf_verify_test_runner(void * test_ctx)39450fa48e4STomasz Jozwiak cperf_verify_test_runner(void *test_ctx)
3950bf1e98fSTomasz Jozwiak {
39650fa48e4STomasz Jozwiak 	struct cperf_verify_ctx *ctx = test_ctx;
39750fa48e4STomasz Jozwiak 	struct comp_test_data *test_data = ctx->options;
3980bf1e98fSTomasz Jozwiak 	int ret = EXIT_SUCCESS;
399*b6a7e685STyler Retzlaff 	static RTE_ATOMIC(uint16_t) display_once;
40050fa48e4STomasz Jozwiak 	uint32_t lcore = rte_lcore_id();
40183cc3b90SMichael Baum 	uint16_t exp = 0;
40250fa48e4STomasz Jozwiak 
40350fa48e4STomasz Jozwiak 	ctx->mem.lcore_id = lcore;
4040bf1e98fSTomasz Jozwiak 
4050bf1e98fSTomasz Jozwiak 	test_data->ratio = 0;
4060bf1e98fSTomasz Jozwiak 
40783cc3b90SMichael Baum 	if (test_data->test_op & COMPRESS) {
40850fa48e4STomasz Jozwiak 		if (main_loop(ctx, RTE_COMP_COMPRESS) < 0) {
4090bf1e98fSTomasz Jozwiak 			ret = EXIT_FAILURE;
4100bf1e98fSTomasz Jozwiak 			goto end;
4110bf1e98fSTomasz Jozwiak 		}
41283cc3b90SMichael Baum 	}
4130bf1e98fSTomasz Jozwiak 
41483cc3b90SMichael Baum 	if (test_data->test_op & DECOMPRESS) {
41550fa48e4STomasz Jozwiak 		if (main_loop(ctx, RTE_COMP_DECOMPRESS) < 0) {
4160bf1e98fSTomasz Jozwiak 			ret = EXIT_FAILURE;
4170bf1e98fSTomasz Jozwiak 			goto end;
4180bf1e98fSTomasz Jozwiak 		}
4190bf1e98fSTomasz Jozwiak 
42083cc3b90SMichael Baum 		if (!(test_data->test_op & COMPRESS)) {
42183cc3b90SMichael Baum 			/*
42283cc3b90SMichael Baum 			 * For DECOMPRESS_ONLY mode there is no more
42383cc3b90SMichael Baum 			 * verifications, reset the 'ratio' and 'comp_data_sz'
42483cc3b90SMichael Baum 			 * fields for other tests report.
42583cc3b90SMichael Baum 			 */
42683cc3b90SMichael Baum 			ctx->comp_data_sz = 0;
42783cc3b90SMichael Baum 			ctx->ratio = 0;
42883cc3b90SMichael Baum 			goto end;
42983cc3b90SMichael Baum 		}
43083cc3b90SMichael Baum 
43150fa48e4STomasz Jozwiak 		if (ctx->decomp_data_sz != test_data->input_data_sz) {
4320bf1e98fSTomasz Jozwiak 			RTE_LOG(ERR, USER1,
4330bf1e98fSTomasz Jozwiak 				"Decompressed data length not equal to input data length\n");
4340bf1e98fSTomasz Jozwiak 			RTE_LOG(ERR, USER1,
4350bf1e98fSTomasz Jozwiak 				"Decompressed size = %zu, expected = %zu\n",
43650fa48e4STomasz Jozwiak 				ctx->decomp_data_sz, test_data->input_data_sz);
4370bf1e98fSTomasz Jozwiak 			ret = EXIT_FAILURE;
4380bf1e98fSTomasz Jozwiak 			goto end;
4390bf1e98fSTomasz Jozwiak 		} else {
44050fa48e4STomasz Jozwiak 			if (memcmp(ctx->mem.decompressed_data,
4410bf1e98fSTomasz Jozwiak 					test_data->input_data,
4420bf1e98fSTomasz Jozwiak 					test_data->input_data_sz) != 0) {
4430bf1e98fSTomasz Jozwiak 				RTE_LOG(ERR, USER1,
4440bf1e98fSTomasz Jozwiak 					"Decompressed data is not the same as file data\n");
4450bf1e98fSTomasz Jozwiak 				ret = EXIT_FAILURE;
4460bf1e98fSTomasz Jozwiak 				goto end;
4470bf1e98fSTomasz Jozwiak 			}
4480bf1e98fSTomasz Jozwiak 		}
44983cc3b90SMichael Baum 	}
4500bf1e98fSTomasz Jozwiak 
45150fa48e4STomasz Jozwiak 	ctx->ratio = (double) ctx->comp_data_sz /
4520bf1e98fSTomasz Jozwiak 			test_data->input_data_sz * 100;
4530bf1e98fSTomasz Jozwiak 
45450fa48e4STomasz Jozwiak 	if (!ctx->silent) {
455*b6a7e685STyler Retzlaff 		if (rte_atomic_compare_exchange_strong_explicit(&display_once, &exp, 1,
456*b6a7e685STyler Retzlaff 				rte_memory_order_relaxed, rte_memory_order_relaxed)) {
45750fa48e4STomasz Jozwiak 			printf("%12s%6s%12s%17s\n",
45850fa48e4STomasz Jozwiak 			    "lcore id", "Level", "Comp size", "Comp ratio [%]");
45950fa48e4STomasz Jozwiak 		}
46050fa48e4STomasz Jozwiak 		printf("%12u%6u%12zu%17.2f\n",
46150fa48e4STomasz Jozwiak 		       ctx->mem.lcore_id,
46250fa48e4STomasz Jozwiak 		       test_data->level, ctx->comp_data_sz, ctx->ratio);
46350fa48e4STomasz Jozwiak 	}
46450fa48e4STomasz Jozwiak 
4650bf1e98fSTomasz Jozwiak end:
4660bf1e98fSTomasz Jozwiak 	return ret;
4670bf1e98fSTomasz Jozwiak }
468