xref: /dpdk/app/test-compress-perf/comp_perf_test_verify.c (revision 1643fc9b077ebb55b13a2c4469b75c251499acdc)
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
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 *
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
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 = {
900bf1e98fSTomasz Jozwiak 				.algo = RTE_COMP_ALGO_DEFLATE,
910bf1e98fSTomasz Jozwiak 				.deflate.huffman = test_data->huffman_enc,
9250fa48e4STomasz Jozwiak 				.level = test_data->level,
930bf1e98fSTomasz Jozwiak 				.window_size = test_data->window_sz,
940bf1e98fSTomasz Jozwiak 				.chksum = RTE_COMP_CHECKSUM_NONE,
950bf1e98fSTomasz Jozwiak 				.hash_algo = RTE_COMP_HASH_ALGO_NONE
960bf1e98fSTomasz Jozwiak 			}
970bf1e98fSTomasz Jozwiak 		};
9850fa48e4STomasz Jozwiak 		output_data_ptr = ctx->mem.compressed_data;
9950fa48e4STomasz Jozwiak 		output_data_sz = &ctx->comp_data_sz;
10050fa48e4STomasz Jozwiak 		input_bufs = mem->decomp_bufs;
10150fa48e4STomasz Jozwiak 		output_bufs = mem->comp_bufs;
10227cee417STomasz Jozwiak 		out_seg_sz = test_data->out_seg_sz;
1030bf1e98fSTomasz Jozwiak 	} else {
1040bf1e98fSTomasz Jozwiak 		xform = (struct rte_comp_xform) {
1050bf1e98fSTomasz Jozwiak 			.type = RTE_COMP_DECOMPRESS,
1060bf1e98fSTomasz Jozwiak 			.decompress = {
1070bf1e98fSTomasz Jozwiak 				.algo = RTE_COMP_ALGO_DEFLATE,
1080bf1e98fSTomasz Jozwiak 				.chksum = RTE_COMP_CHECKSUM_NONE,
1090bf1e98fSTomasz Jozwiak 				.window_size = test_data->window_sz,
1100bf1e98fSTomasz Jozwiak 				.hash_algo = RTE_COMP_HASH_ALGO_NONE
1110bf1e98fSTomasz Jozwiak 			}
1120bf1e98fSTomasz Jozwiak 		};
11350fa48e4STomasz Jozwiak 		output_data_ptr = ctx->mem.decompressed_data;
11450fa48e4STomasz Jozwiak 		output_data_sz = &ctx->decomp_data_sz;
11550fa48e4STomasz Jozwiak 		input_bufs = mem->comp_bufs;
11650fa48e4STomasz Jozwiak 		output_bufs = mem->decomp_bufs;
11727cee417STomasz Jozwiak 		out_seg_sz = test_data->seg_sz;
1180bf1e98fSTomasz Jozwiak 	}
1190bf1e98fSTomasz Jozwiak 
1200bf1e98fSTomasz Jozwiak 	/* Create private xform */
1210bf1e98fSTomasz Jozwiak 	if (rte_compressdev_private_xform_create(dev_id, &xform,
1220bf1e98fSTomasz Jozwiak 			&priv_xform) < 0) {
1230bf1e98fSTomasz Jozwiak 		RTE_LOG(ERR, USER1, "Private xform could not be created\n");
1240bf1e98fSTomasz Jozwiak 		res = -1;
1250bf1e98fSTomasz Jozwiak 		goto end;
1260bf1e98fSTomasz Jozwiak 	}
1270bf1e98fSTomasz Jozwiak 
1280bf1e98fSTomasz Jozwiak 	num_iter = 1;
1290bf1e98fSTomasz Jozwiak 
1300bf1e98fSTomasz Jozwiak 	for (iter = 0; iter < num_iter; iter++) {
13150fa48e4STomasz Jozwiak 		uint32_t total_ops = mem->total_bufs;
13250fa48e4STomasz Jozwiak 		uint32_t remaining_ops = mem->total_bufs;
1330bf1e98fSTomasz Jozwiak 		uint32_t total_deq_ops = 0;
1340bf1e98fSTomasz Jozwiak 		uint32_t total_enq_ops = 0;
1350bf1e98fSTomasz Jozwiak 		uint16_t ops_unused = 0;
1360bf1e98fSTomasz Jozwiak 		uint16_t num_enq = 0;
1370bf1e98fSTomasz Jozwiak 		uint16_t num_deq = 0;
1380bf1e98fSTomasz Jozwiak 
1390bf1e98fSTomasz Jozwiak 		output_size = 0;
1400bf1e98fSTomasz Jozwiak 
1410bf1e98fSTomasz Jozwiak 		while (remaining_ops > 0) {
1420bf1e98fSTomasz Jozwiak 			uint16_t num_ops = RTE_MIN(remaining_ops,
1430bf1e98fSTomasz Jozwiak 						   test_data->burst_sz);
1440bf1e98fSTomasz Jozwiak 			uint16_t ops_needed = num_ops - ops_unused;
1450bf1e98fSTomasz Jozwiak 
1460bf1e98fSTomasz Jozwiak 			/*
1470bf1e98fSTomasz Jozwiak 			 * Move the unused operations from the previous
1480bf1e98fSTomasz Jozwiak 			 * enqueue_burst call to the front, to maintain order
1490bf1e98fSTomasz Jozwiak 			 */
1500bf1e98fSTomasz Jozwiak 			if ((ops_unused > 0) && (num_enq > 0)) {
1510bf1e98fSTomasz Jozwiak 				size_t nb_b_to_mov =
1520bf1e98fSTomasz Jozwiak 				      ops_unused * sizeof(struct rte_comp_op *);
1530bf1e98fSTomasz Jozwiak 
1540bf1e98fSTomasz Jozwiak 				memmove(ops, &ops[num_enq], nb_b_to_mov);
1550bf1e98fSTomasz Jozwiak 			}
1560bf1e98fSTomasz Jozwiak 
1570bf1e98fSTomasz Jozwiak 			/* Allocate compression operations */
1580bf1e98fSTomasz Jozwiak 			if (ops_needed && !rte_comp_op_bulk_alloc(
15950fa48e4STomasz Jozwiak 						mem->op_pool,
1600bf1e98fSTomasz Jozwiak 						&ops[ops_unused],
1610bf1e98fSTomasz Jozwiak 						ops_needed)) {
1620bf1e98fSTomasz Jozwiak 				RTE_LOG(ERR, USER1,
1630bf1e98fSTomasz Jozwiak 				      "Could not allocate enough operations\n");
1640bf1e98fSTomasz Jozwiak 				res = -1;
1650bf1e98fSTomasz Jozwiak 				goto end;
1660bf1e98fSTomasz Jozwiak 			}
1670bf1e98fSTomasz Jozwiak 			allocated += ops_needed;
1680bf1e98fSTomasz Jozwiak 
1690bf1e98fSTomasz Jozwiak 			for (i = 0; i < ops_needed; i++) {
1700bf1e98fSTomasz Jozwiak 				/*
1710bf1e98fSTomasz Jozwiak 				 * Calculate next buffer to attach to operation
1720bf1e98fSTomasz Jozwiak 				 */
1730bf1e98fSTomasz Jozwiak 				uint32_t buf_id = total_enq_ops + i +
1740bf1e98fSTomasz Jozwiak 						ops_unused;
1750bf1e98fSTomasz Jozwiak 				uint16_t op_id = ops_unused + i;
1760bf1e98fSTomasz Jozwiak 				/* Reset all data in output buffers */
1770bf1e98fSTomasz Jozwiak 				struct rte_mbuf *m = output_bufs[buf_id];
1780bf1e98fSTomasz Jozwiak 
17927cee417STomasz Jozwiak 				m->pkt_len = out_seg_sz * m->nb_segs;
1800bf1e98fSTomasz Jozwiak 				while (m) {
1810bf1e98fSTomasz Jozwiak 					m->data_len = m->buf_len - m->data_off;
1820bf1e98fSTomasz Jozwiak 					m = m->next;
1830bf1e98fSTomasz Jozwiak 				}
1840bf1e98fSTomasz Jozwiak 				ops[op_id]->m_src = input_bufs[buf_id];
1850bf1e98fSTomasz Jozwiak 				ops[op_id]->m_dst = output_bufs[buf_id];
1860bf1e98fSTomasz Jozwiak 				ops[op_id]->src.offset = 0;
1870bf1e98fSTomasz Jozwiak 				ops[op_id]->src.length =
1880bf1e98fSTomasz Jozwiak 					rte_pktmbuf_pkt_len(input_bufs[buf_id]);
1890bf1e98fSTomasz Jozwiak 				ops[op_id]->dst.offset = 0;
1900bf1e98fSTomasz Jozwiak 				ops[op_id]->flush_flag = RTE_COMP_FLUSH_FINAL;
1910bf1e98fSTomasz Jozwiak 				ops[op_id]->input_chksum = buf_id;
1920bf1e98fSTomasz Jozwiak 				ops[op_id]->private_xform = priv_xform;
1930bf1e98fSTomasz Jozwiak 			}
1940bf1e98fSTomasz Jozwiak 
195d6cec113STomasz Jozwiak 			if (unlikely(test_data->perf_comp_force_stop))
196d6cec113STomasz Jozwiak 				goto end;
197d6cec113STomasz Jozwiak 
19850fa48e4STomasz Jozwiak 			num_enq = rte_compressdev_enqueue_burst(dev_id,
19950fa48e4STomasz Jozwiak 								mem->qp_id, ops,
2000bf1e98fSTomasz Jozwiak 								num_ops);
2010bf1e98fSTomasz Jozwiak 			if (num_enq == 0) {
2020bf1e98fSTomasz Jozwiak 				struct rte_compressdev_stats stats;
2030bf1e98fSTomasz Jozwiak 
2040bf1e98fSTomasz Jozwiak 				rte_compressdev_stats_get(dev_id, &stats);
2050bf1e98fSTomasz Jozwiak 				if (stats.enqueue_err_count) {
2060bf1e98fSTomasz Jozwiak 					res = -1;
2070bf1e98fSTomasz Jozwiak 					goto end;
2080bf1e98fSTomasz Jozwiak 				}
2090bf1e98fSTomasz Jozwiak 			}
2100bf1e98fSTomasz Jozwiak 
2110bf1e98fSTomasz Jozwiak 			ops_unused = num_ops - num_enq;
2120bf1e98fSTomasz Jozwiak 			remaining_ops -= num_enq;
2130bf1e98fSTomasz Jozwiak 			total_enq_ops += num_enq;
2140bf1e98fSTomasz Jozwiak 
21550fa48e4STomasz Jozwiak 			num_deq = rte_compressdev_dequeue_burst(dev_id,
21650fa48e4STomasz Jozwiak 							   mem->qp_id,
2170bf1e98fSTomasz Jozwiak 							   deq_ops,
2180bf1e98fSTomasz Jozwiak 							   test_data->burst_sz);
2190bf1e98fSTomasz Jozwiak 			total_deq_ops += num_deq;
2200bf1e98fSTomasz Jozwiak 
2210bf1e98fSTomasz Jozwiak 			for (i = 0; i < num_deq; i++) {
2220bf1e98fSTomasz Jozwiak 				struct rte_comp_op *op = deq_ops[i];
2230bf1e98fSTomasz Jozwiak 
224971d89f5SAdam Dybkowski 				if (op->status ==
225971d89f5SAdam Dybkowski 				  RTE_COMP_OP_STATUS_OUT_OF_SPACE_TERMINATED ||
226971d89f5SAdam Dybkowski 				  op->status ==
227971d89f5SAdam Dybkowski 				  RTE_COMP_OP_STATUS_OUT_OF_SPACE_RECOVERABLE) {
228971d89f5SAdam Dybkowski 					RTE_LOG(ERR, USER1,
229*1643fc9bSMichael 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");
230971d89f5SAdam Dybkowski 					res = -1;
231971d89f5SAdam Dybkowski 					goto end;
232971d89f5SAdam Dybkowski 				} else if (op->status !=
233971d89f5SAdam Dybkowski 						RTE_COMP_OP_STATUS_SUCCESS) {
2340bf1e98fSTomasz Jozwiak 					RTE_LOG(ERR, USER1,
2350bf1e98fSTomasz Jozwiak 						"Some operations were not successful\n");
2360bf1e98fSTomasz Jozwiak 					goto end;
2370bf1e98fSTomasz Jozwiak 				}
2380bf1e98fSTomasz Jozwiak 
2390bf1e98fSTomasz Jozwiak 				const void *read_data_addr =
2400bf1e98fSTomasz Jozwiak 						rte_pktmbuf_read(op->m_dst, 0,
2410bf1e98fSTomasz Jozwiak 						op->produced, output_data_ptr);
2420bf1e98fSTomasz Jozwiak 				if (read_data_addr == NULL) {
2430bf1e98fSTomasz Jozwiak 					RTE_LOG(ERR, USER1,
2440bf1e98fSTomasz Jozwiak 						"Could not copy buffer in destination\n");
2450bf1e98fSTomasz Jozwiak 					res = -1;
2460bf1e98fSTomasz Jozwiak 					goto end;
2470bf1e98fSTomasz Jozwiak 				}
2480bf1e98fSTomasz Jozwiak 
2490bf1e98fSTomasz Jozwiak 				if (read_data_addr != output_data_ptr)
2500bf1e98fSTomasz Jozwiak 					rte_memcpy(output_data_ptr,
2510bf1e98fSTomasz Jozwiak 						   rte_pktmbuf_mtod(op->m_dst,
2520bf1e98fSTomasz Jozwiak 								    uint8_t *),
2530bf1e98fSTomasz Jozwiak 						   op->produced);
2540bf1e98fSTomasz Jozwiak 				output_data_ptr += op->produced;
2550bf1e98fSTomasz Jozwiak 				output_size += op->produced;
2560bf1e98fSTomasz Jozwiak 
2570bf1e98fSTomasz Jozwiak 			}
2580bf1e98fSTomasz Jozwiak 
2590bf1e98fSTomasz Jozwiak 
2600bf1e98fSTomasz Jozwiak 			if (iter == num_iter - 1) {
2610bf1e98fSTomasz Jozwiak 				for (i = 0; i < num_deq; i++) {
2620bf1e98fSTomasz Jozwiak 					struct rte_comp_op *op = deq_ops[i];
2630bf1e98fSTomasz Jozwiak 					struct rte_mbuf *m = op->m_dst;
2640bf1e98fSTomasz Jozwiak 
2650bf1e98fSTomasz Jozwiak 					m->pkt_len = op->produced;
2660bf1e98fSTomasz Jozwiak 					uint32_t remaining_data = op->produced;
2670bf1e98fSTomasz Jozwiak 					uint16_t data_to_append;
2680bf1e98fSTomasz Jozwiak 
2690bf1e98fSTomasz Jozwiak 					while (remaining_data > 0) {
2700bf1e98fSTomasz Jozwiak 						data_to_append =
2710bf1e98fSTomasz Jozwiak 							RTE_MIN(remaining_data,
27227cee417STomasz Jozwiak 							out_seg_sz);
2730bf1e98fSTomasz Jozwiak 						m->data_len = data_to_append;
2740bf1e98fSTomasz Jozwiak 						remaining_data -=
2750bf1e98fSTomasz Jozwiak 								data_to_append;
2760bf1e98fSTomasz Jozwiak 						m = m->next;
2770bf1e98fSTomasz Jozwiak 					}
2780bf1e98fSTomasz Jozwiak 				}
2790bf1e98fSTomasz Jozwiak 			}
28050fa48e4STomasz Jozwiak 			rte_mempool_put_bulk(mem->op_pool,
2810bf1e98fSTomasz Jozwiak 					     (void **)deq_ops, num_deq);
2820bf1e98fSTomasz Jozwiak 			allocated -= num_deq;
2830bf1e98fSTomasz Jozwiak 		}
2840bf1e98fSTomasz Jozwiak 
2850bf1e98fSTomasz Jozwiak 		/* Dequeue the last operations */
2860bf1e98fSTomasz Jozwiak 		while (total_deq_ops < total_ops) {
287d6cec113STomasz Jozwiak 			if (unlikely(test_data->perf_comp_force_stop))
288d6cec113STomasz Jozwiak 				goto end;
289d6cec113STomasz Jozwiak 
29050fa48e4STomasz Jozwiak 			num_deq = rte_compressdev_dequeue_burst(dev_id,
29150fa48e4STomasz Jozwiak 							mem->qp_id,
29250fa48e4STomasz Jozwiak 							deq_ops,
29350fa48e4STomasz Jozwiak 							test_data->burst_sz);
2940bf1e98fSTomasz Jozwiak 			if (num_deq == 0) {
2950bf1e98fSTomasz Jozwiak 				struct rte_compressdev_stats stats;
2960bf1e98fSTomasz Jozwiak 
2970bf1e98fSTomasz Jozwiak 				rte_compressdev_stats_get(dev_id, &stats);
2980bf1e98fSTomasz Jozwiak 				if (stats.dequeue_err_count) {
2990bf1e98fSTomasz Jozwiak 					res = -1;
3000bf1e98fSTomasz Jozwiak 					goto end;
3010bf1e98fSTomasz Jozwiak 				}
3020bf1e98fSTomasz Jozwiak 			}
3030bf1e98fSTomasz Jozwiak 
3040bf1e98fSTomasz Jozwiak 			total_deq_ops += num_deq;
3050bf1e98fSTomasz Jozwiak 
3060bf1e98fSTomasz Jozwiak 			for (i = 0; i < num_deq; i++) {
3070bf1e98fSTomasz Jozwiak 				struct rte_comp_op *op = deq_ops[i];
3080bf1e98fSTomasz Jozwiak 
309971d89f5SAdam Dybkowski 				if (op->status ==
310971d89f5SAdam Dybkowski 				  RTE_COMP_OP_STATUS_OUT_OF_SPACE_TERMINATED ||
311971d89f5SAdam Dybkowski 				  op->status ==
312971d89f5SAdam Dybkowski 				  RTE_COMP_OP_STATUS_OUT_OF_SPACE_RECOVERABLE) {
313971d89f5SAdam Dybkowski 					RTE_LOG(ERR, USER1,
314*1643fc9bSMichael 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");
315971d89f5SAdam Dybkowski 					res = -1;
316971d89f5SAdam Dybkowski 					goto end;
317971d89f5SAdam Dybkowski 				} else if (op->status !=
318971d89f5SAdam Dybkowski 						RTE_COMP_OP_STATUS_SUCCESS) {
3190bf1e98fSTomasz Jozwiak 					RTE_LOG(ERR, USER1,
3200bf1e98fSTomasz Jozwiak 						"Some operations were not successful\n");
3210bf1e98fSTomasz Jozwiak 					goto end;
3220bf1e98fSTomasz Jozwiak 				}
3230bf1e98fSTomasz Jozwiak 				const void *read_data_addr =
3240bf1e98fSTomasz Jozwiak 						rte_pktmbuf_read(op->m_dst,
3250bf1e98fSTomasz Jozwiak 								 op->dst.offset,
3260bf1e98fSTomasz Jozwiak 						op->produced, output_data_ptr);
3270bf1e98fSTomasz Jozwiak 				if (read_data_addr == NULL) {
3280bf1e98fSTomasz Jozwiak 					RTE_LOG(ERR, USER1,
3290bf1e98fSTomasz Jozwiak 						"Could not copy buffer in destination\n");
3300bf1e98fSTomasz Jozwiak 					res = -1;
3310bf1e98fSTomasz Jozwiak 					goto end;
3320bf1e98fSTomasz Jozwiak 				}
3330bf1e98fSTomasz Jozwiak 
3340bf1e98fSTomasz Jozwiak 				if (read_data_addr != output_data_ptr)
3350bf1e98fSTomasz Jozwiak 					rte_memcpy(output_data_ptr,
3360bf1e98fSTomasz Jozwiak 						   rte_pktmbuf_mtod(
3370bf1e98fSTomasz Jozwiak 							op->m_dst, uint8_t *),
3380bf1e98fSTomasz Jozwiak 						   op->produced);
3390bf1e98fSTomasz Jozwiak 				output_data_ptr += op->produced;
3400bf1e98fSTomasz Jozwiak 				output_size += op->produced;
3410bf1e98fSTomasz Jozwiak 
3420bf1e98fSTomasz Jozwiak 			}
3430bf1e98fSTomasz Jozwiak 
3440bf1e98fSTomasz Jozwiak 			if (iter == num_iter - 1) {
3450bf1e98fSTomasz Jozwiak 				for (i = 0; i < num_deq; i++) {
3460bf1e98fSTomasz Jozwiak 					struct rte_comp_op *op = deq_ops[i];
3470bf1e98fSTomasz Jozwiak 					struct rte_mbuf *m = op->m_dst;
3480bf1e98fSTomasz Jozwiak 
3490bf1e98fSTomasz Jozwiak 					m->pkt_len = op->produced;
3500bf1e98fSTomasz Jozwiak 					uint32_t remaining_data = op->produced;
3510bf1e98fSTomasz Jozwiak 					uint16_t data_to_append;
3520bf1e98fSTomasz Jozwiak 
3530bf1e98fSTomasz Jozwiak 					while (remaining_data > 0) {
3540bf1e98fSTomasz Jozwiak 						data_to_append =
3550bf1e98fSTomasz Jozwiak 						RTE_MIN(remaining_data,
35627cee417STomasz Jozwiak 							out_seg_sz);
3570bf1e98fSTomasz Jozwiak 						m->data_len = data_to_append;
3580bf1e98fSTomasz Jozwiak 						remaining_data -=
3590bf1e98fSTomasz Jozwiak 								data_to_append;
3600bf1e98fSTomasz Jozwiak 						m = m->next;
3610bf1e98fSTomasz Jozwiak 					}
3620bf1e98fSTomasz Jozwiak 				}
3630bf1e98fSTomasz Jozwiak 			}
36450fa48e4STomasz Jozwiak 			rte_mempool_put_bulk(mem->op_pool,
3650bf1e98fSTomasz Jozwiak 					     (void **)deq_ops, num_deq);
3660bf1e98fSTomasz Jozwiak 			allocated -= num_deq;
3670bf1e98fSTomasz Jozwiak 		}
3680bf1e98fSTomasz Jozwiak 	}
3690bf1e98fSTomasz Jozwiak 
3700bf1e98fSTomasz Jozwiak 	if (output_data_sz)
3710bf1e98fSTomasz Jozwiak 		*output_data_sz = output_size;
3720bf1e98fSTomasz Jozwiak end:
37350fa48e4STomasz Jozwiak 	rte_mempool_put_bulk(mem->op_pool, (void **)ops, allocated);
3740bf1e98fSTomasz Jozwiak 	rte_compressdev_private_xform_free(dev_id, priv_xform);
3750bf1e98fSTomasz Jozwiak 	rte_free(ops);
376d6cec113STomasz Jozwiak 
377d6cec113STomasz Jozwiak 	if (test_data->perf_comp_force_stop) {
378d6cec113STomasz Jozwiak 		RTE_LOG(ERR, USER1,
379d6cec113STomasz Jozwiak 		      "lcore: %d Perf. test has been aborted by user\n",
380d6cec113STomasz Jozwiak 			mem->lcore_id);
381d6cec113STomasz Jozwiak 		res = -1;
382d6cec113STomasz Jozwiak 	}
383d6cec113STomasz Jozwiak 
3840bf1e98fSTomasz Jozwiak 	return res;
3850bf1e98fSTomasz Jozwiak }
3860bf1e98fSTomasz Jozwiak 
3870bf1e98fSTomasz Jozwiak int
38850fa48e4STomasz Jozwiak cperf_verify_test_runner(void *test_ctx)
3890bf1e98fSTomasz Jozwiak {
39050fa48e4STomasz Jozwiak 	struct cperf_verify_ctx *ctx = test_ctx;
39150fa48e4STomasz Jozwiak 	struct comp_test_data *test_data = ctx->options;
3920bf1e98fSTomasz Jozwiak 	int ret = EXIT_SUCCESS;
393d3fcd87cSJoyce Kong 	static uint16_t display_once;
39450fa48e4STomasz Jozwiak 	uint32_t lcore = rte_lcore_id();
39550fa48e4STomasz Jozwiak 
39650fa48e4STomasz Jozwiak 	ctx->mem.lcore_id = lcore;
3970bf1e98fSTomasz Jozwiak 
3980bf1e98fSTomasz Jozwiak 	test_data->ratio = 0;
3990bf1e98fSTomasz Jozwiak 
40050fa48e4STomasz Jozwiak 	if (main_loop(ctx, RTE_COMP_COMPRESS) < 0) {
4010bf1e98fSTomasz Jozwiak 		ret = EXIT_FAILURE;
4020bf1e98fSTomasz Jozwiak 		goto end;
4030bf1e98fSTomasz Jozwiak 	}
4040bf1e98fSTomasz Jozwiak 
40550fa48e4STomasz Jozwiak 	if (main_loop(ctx, RTE_COMP_DECOMPRESS) < 0) {
4060bf1e98fSTomasz Jozwiak 		ret = EXIT_FAILURE;
4070bf1e98fSTomasz Jozwiak 		goto end;
4080bf1e98fSTomasz Jozwiak 	}
4090bf1e98fSTomasz Jozwiak 
41050fa48e4STomasz Jozwiak 	if (ctx->decomp_data_sz != test_data->input_data_sz) {
4110bf1e98fSTomasz Jozwiak 		RTE_LOG(ERR, USER1,
4120bf1e98fSTomasz Jozwiak 	   "Decompressed data length not equal to input data length\n");
4130bf1e98fSTomasz Jozwiak 		RTE_LOG(ERR, USER1,
4140bf1e98fSTomasz Jozwiak 			"Decompressed size = %zu, expected = %zu\n",
41550fa48e4STomasz Jozwiak 			ctx->decomp_data_sz, test_data->input_data_sz);
4160bf1e98fSTomasz Jozwiak 		ret = EXIT_FAILURE;
4170bf1e98fSTomasz Jozwiak 		goto end;
4180bf1e98fSTomasz Jozwiak 	} else {
41950fa48e4STomasz Jozwiak 		if (memcmp(ctx->mem.decompressed_data,
4200bf1e98fSTomasz Jozwiak 				test_data->input_data,
4210bf1e98fSTomasz Jozwiak 				test_data->input_data_sz) != 0) {
4220bf1e98fSTomasz Jozwiak 			RTE_LOG(ERR, USER1,
4230bf1e98fSTomasz Jozwiak 		    "Decompressed data is not the same as file data\n");
4240bf1e98fSTomasz Jozwiak 			ret = EXIT_FAILURE;
4250bf1e98fSTomasz Jozwiak 			goto end;
4260bf1e98fSTomasz Jozwiak 		}
4270bf1e98fSTomasz Jozwiak 	}
4280bf1e98fSTomasz Jozwiak 
42950fa48e4STomasz Jozwiak 	ctx->ratio = (double) ctx->comp_data_sz /
4300bf1e98fSTomasz Jozwiak 			test_data->input_data_sz * 100;
4310bf1e98fSTomasz Jozwiak 
432d3fcd87cSJoyce Kong 	uint16_t exp = 0;
43350fa48e4STomasz Jozwiak 	if (!ctx->silent) {
434d3fcd87cSJoyce Kong 		if (__atomic_compare_exchange_n(&display_once, &exp, 1, 0,
435d3fcd87cSJoyce Kong 				__ATOMIC_RELAXED, __ATOMIC_RELAXED)) {
43650fa48e4STomasz Jozwiak 			printf("%12s%6s%12s%17s\n",
43750fa48e4STomasz Jozwiak 			    "lcore id", "Level", "Comp size", "Comp ratio [%]");
43850fa48e4STomasz Jozwiak 		}
43950fa48e4STomasz Jozwiak 		printf("%12u%6u%12zu%17.2f\n",
44050fa48e4STomasz Jozwiak 		       ctx->mem.lcore_id,
44150fa48e4STomasz Jozwiak 		       test_data->level, ctx->comp_data_sz, ctx->ratio);
44250fa48e4STomasz Jozwiak 	}
44350fa48e4STomasz Jozwiak 
4440bf1e98fSTomasz Jozwiak end:
4450bf1e98fSTomasz Jozwiak 	return ret;
4460bf1e98fSTomasz Jozwiak }
447