xref: /dpdk/app/test-compress-perf/comp_perf_test_verify.c (revision 50fa48e4ede4d07078a3d037ab93bea06ed11c8c)
10bf1e98fSTomasz Jozwiak /* SPDX-License-Identifier: BSD-3-Clause
20bf1e98fSTomasz Jozwiak  * Copyright(c) 2018 Intel Corporation
30bf1e98fSTomasz Jozwiak  */
40bf1e98fSTomasz Jozwiak 
50bf1e98fSTomasz Jozwiak #include <rte_malloc.h>
60bf1e98fSTomasz Jozwiak #include <rte_eal.h>
70bf1e98fSTomasz Jozwiak #include <rte_log.h>
80bf1e98fSTomasz Jozwiak #include <rte_compressdev.h>
90bf1e98fSTomasz Jozwiak 
100bf1e98fSTomasz Jozwiak #include "comp_perf_test_verify.h"
11*50fa48e4STomasz Jozwiak #include "comp_perf_test_common.h"
12*50fa48e4STomasz Jozwiak 
13*50fa48e4STomasz Jozwiak void
14*50fa48e4STomasz Jozwiak cperf_verify_test_destructor(void *arg)
15*50fa48e4STomasz Jozwiak {
16*50fa48e4STomasz Jozwiak 	if (arg) {
17*50fa48e4STomasz Jozwiak 		comp_perf_free_memory(&((struct cperf_verify_ctx *)arg)->mem);
18*50fa48e4STomasz Jozwiak 		rte_free(arg);
19*50fa48e4STomasz Jozwiak 	}
20*50fa48e4STomasz Jozwiak }
21*50fa48e4STomasz Jozwiak 
22*50fa48e4STomasz Jozwiak void *
23*50fa48e4STomasz Jozwiak cperf_verify_test_constructor(uint8_t dev_id, uint16_t qp_id,
24*50fa48e4STomasz Jozwiak 		struct comp_test_data *options)
25*50fa48e4STomasz Jozwiak {
26*50fa48e4STomasz Jozwiak 	struct cperf_verify_ctx *ctx = NULL;
27*50fa48e4STomasz Jozwiak 
28*50fa48e4STomasz Jozwiak 	ctx = rte_malloc(NULL, sizeof(struct cperf_verify_ctx), 0);
29*50fa48e4STomasz Jozwiak 
30*50fa48e4STomasz Jozwiak 	if (ctx == NULL)
31*50fa48e4STomasz Jozwiak 		return NULL;
32*50fa48e4STomasz Jozwiak 
33*50fa48e4STomasz Jozwiak 	ctx->mem.dev_id = dev_id;
34*50fa48e4STomasz Jozwiak 	ctx->mem.qp_id = qp_id;
35*50fa48e4STomasz Jozwiak 	ctx->options = options;
36*50fa48e4STomasz Jozwiak 
37*50fa48e4STomasz Jozwiak 	if (!comp_perf_allocate_memory(ctx->options, &ctx->mem) &&
38*50fa48e4STomasz Jozwiak 			!prepare_bufs(ctx->options, &ctx->mem))
39*50fa48e4STomasz Jozwiak 		return ctx;
40*50fa48e4STomasz Jozwiak 
41*50fa48e4STomasz Jozwiak 	cperf_verify_test_destructor(ctx);
42*50fa48e4STomasz Jozwiak 	return NULL;
43*50fa48e4STomasz Jozwiak }
440bf1e98fSTomasz Jozwiak 
450bf1e98fSTomasz Jozwiak static int
46*50fa48e4STomasz Jozwiak main_loop(struct cperf_verify_ctx *ctx, enum rte_comp_xform_type type)
470bf1e98fSTomasz Jozwiak {
48*50fa48e4STomasz Jozwiak 	struct comp_test_data *test_data = ctx->options;
49*50fa48e4STomasz Jozwiak 	uint8_t *output_data_ptr;
50*50fa48e4STomasz Jozwiak 	size_t *output_data_sz;
51*50fa48e4STomasz Jozwiak 	struct cperf_mem_resources *mem = &ctx->mem;
52*50fa48e4STomasz Jozwiak 
53*50fa48e4STomasz Jozwiak 	uint8_t dev_id = mem->dev_id;
540bf1e98fSTomasz Jozwiak 	uint32_t i, iter, num_iter;
550bf1e98fSTomasz Jozwiak 	struct rte_comp_op **ops, **deq_ops;
560bf1e98fSTomasz Jozwiak 	void *priv_xform = NULL;
570bf1e98fSTomasz Jozwiak 	struct rte_comp_xform xform;
580bf1e98fSTomasz Jozwiak 	size_t output_size = 0;
590bf1e98fSTomasz Jozwiak 	struct rte_mbuf **input_bufs, **output_bufs;
600bf1e98fSTomasz Jozwiak 	int res = 0;
610bf1e98fSTomasz Jozwiak 	int allocated = 0;
6227cee417STomasz Jozwiak 	uint32_t out_seg_sz;
630bf1e98fSTomasz Jozwiak 
640bf1e98fSTomasz Jozwiak 	if (test_data == NULL || !test_data->burst_sz) {
650bf1e98fSTomasz Jozwiak 		RTE_LOG(ERR, USER1,
660bf1e98fSTomasz Jozwiak 			"Unknown burst size\n");
670bf1e98fSTomasz Jozwiak 		return -1;
680bf1e98fSTomasz Jozwiak 	}
690bf1e98fSTomasz Jozwiak 
700bf1e98fSTomasz Jozwiak 	ops = rte_zmalloc_socket(NULL,
71*50fa48e4STomasz Jozwiak 		2 * mem->total_bufs * sizeof(struct rte_comp_op *),
720bf1e98fSTomasz Jozwiak 		0, rte_socket_id());
730bf1e98fSTomasz Jozwiak 
740bf1e98fSTomasz Jozwiak 	if (ops == NULL) {
750bf1e98fSTomasz Jozwiak 		RTE_LOG(ERR, USER1,
760bf1e98fSTomasz Jozwiak 			"Can't allocate memory for ops strucures\n");
770bf1e98fSTomasz Jozwiak 		return -1;
780bf1e98fSTomasz Jozwiak 	}
790bf1e98fSTomasz Jozwiak 
80*50fa48e4STomasz Jozwiak 	deq_ops = &ops[mem->total_bufs];
810bf1e98fSTomasz Jozwiak 
820bf1e98fSTomasz Jozwiak 	if (type == RTE_COMP_COMPRESS) {
830bf1e98fSTomasz Jozwiak 		xform = (struct rte_comp_xform) {
840bf1e98fSTomasz Jozwiak 			.type = RTE_COMP_COMPRESS,
850bf1e98fSTomasz Jozwiak 			.compress = {
860bf1e98fSTomasz Jozwiak 				.algo = RTE_COMP_ALGO_DEFLATE,
870bf1e98fSTomasz Jozwiak 				.deflate.huffman = test_data->huffman_enc,
88*50fa48e4STomasz Jozwiak 				.level = test_data->level,
890bf1e98fSTomasz Jozwiak 				.window_size = test_data->window_sz,
900bf1e98fSTomasz Jozwiak 				.chksum = RTE_COMP_CHECKSUM_NONE,
910bf1e98fSTomasz Jozwiak 				.hash_algo = RTE_COMP_HASH_ALGO_NONE
920bf1e98fSTomasz Jozwiak 			}
930bf1e98fSTomasz Jozwiak 		};
94*50fa48e4STomasz Jozwiak 		output_data_ptr = ctx->mem.compressed_data;
95*50fa48e4STomasz Jozwiak 		output_data_sz = &ctx->comp_data_sz;
96*50fa48e4STomasz Jozwiak 		input_bufs = mem->decomp_bufs;
97*50fa48e4STomasz Jozwiak 		output_bufs = mem->comp_bufs;
9827cee417STomasz Jozwiak 		out_seg_sz = test_data->out_seg_sz;
990bf1e98fSTomasz Jozwiak 	} else {
1000bf1e98fSTomasz Jozwiak 		xform = (struct rte_comp_xform) {
1010bf1e98fSTomasz Jozwiak 			.type = RTE_COMP_DECOMPRESS,
1020bf1e98fSTomasz Jozwiak 			.decompress = {
1030bf1e98fSTomasz Jozwiak 				.algo = RTE_COMP_ALGO_DEFLATE,
1040bf1e98fSTomasz Jozwiak 				.chksum = RTE_COMP_CHECKSUM_NONE,
1050bf1e98fSTomasz Jozwiak 				.window_size = test_data->window_sz,
1060bf1e98fSTomasz Jozwiak 				.hash_algo = RTE_COMP_HASH_ALGO_NONE
1070bf1e98fSTomasz Jozwiak 			}
1080bf1e98fSTomasz Jozwiak 		};
109*50fa48e4STomasz Jozwiak 		output_data_ptr = ctx->mem.decompressed_data;
110*50fa48e4STomasz Jozwiak 		output_data_sz = &ctx->decomp_data_sz;
111*50fa48e4STomasz Jozwiak 		input_bufs = mem->comp_bufs;
112*50fa48e4STomasz Jozwiak 		output_bufs = mem->decomp_bufs;
11327cee417STomasz Jozwiak 		out_seg_sz = test_data->seg_sz;
1140bf1e98fSTomasz Jozwiak 	}
1150bf1e98fSTomasz Jozwiak 
1160bf1e98fSTomasz Jozwiak 	/* Create private xform */
1170bf1e98fSTomasz Jozwiak 	if (rte_compressdev_private_xform_create(dev_id, &xform,
1180bf1e98fSTomasz Jozwiak 			&priv_xform) < 0) {
1190bf1e98fSTomasz Jozwiak 		RTE_LOG(ERR, USER1, "Private xform could not be created\n");
1200bf1e98fSTomasz Jozwiak 		res = -1;
1210bf1e98fSTomasz Jozwiak 		goto end;
1220bf1e98fSTomasz Jozwiak 	}
1230bf1e98fSTomasz Jozwiak 
1240bf1e98fSTomasz Jozwiak 	num_iter = 1;
1250bf1e98fSTomasz Jozwiak 
1260bf1e98fSTomasz Jozwiak 	for (iter = 0; iter < num_iter; iter++) {
127*50fa48e4STomasz Jozwiak 		uint32_t total_ops = mem->total_bufs;
128*50fa48e4STomasz Jozwiak 		uint32_t remaining_ops = mem->total_bufs;
1290bf1e98fSTomasz Jozwiak 		uint32_t total_deq_ops = 0;
1300bf1e98fSTomasz Jozwiak 		uint32_t total_enq_ops = 0;
1310bf1e98fSTomasz Jozwiak 		uint16_t ops_unused = 0;
1320bf1e98fSTomasz Jozwiak 		uint16_t num_enq = 0;
1330bf1e98fSTomasz Jozwiak 		uint16_t num_deq = 0;
1340bf1e98fSTomasz Jozwiak 
1350bf1e98fSTomasz Jozwiak 		output_size = 0;
1360bf1e98fSTomasz Jozwiak 
1370bf1e98fSTomasz Jozwiak 		while (remaining_ops > 0) {
1380bf1e98fSTomasz Jozwiak 			uint16_t num_ops = RTE_MIN(remaining_ops,
1390bf1e98fSTomasz Jozwiak 						   test_data->burst_sz);
1400bf1e98fSTomasz Jozwiak 			uint16_t ops_needed = num_ops - ops_unused;
1410bf1e98fSTomasz Jozwiak 
1420bf1e98fSTomasz Jozwiak 			/*
1430bf1e98fSTomasz Jozwiak 			 * Move the unused operations from the previous
1440bf1e98fSTomasz Jozwiak 			 * enqueue_burst call to the front, to maintain order
1450bf1e98fSTomasz Jozwiak 			 */
1460bf1e98fSTomasz Jozwiak 			if ((ops_unused > 0) && (num_enq > 0)) {
1470bf1e98fSTomasz Jozwiak 				size_t nb_b_to_mov =
1480bf1e98fSTomasz Jozwiak 				      ops_unused * sizeof(struct rte_comp_op *);
1490bf1e98fSTomasz Jozwiak 
1500bf1e98fSTomasz Jozwiak 				memmove(ops, &ops[num_enq], nb_b_to_mov);
1510bf1e98fSTomasz Jozwiak 			}
1520bf1e98fSTomasz Jozwiak 
1530bf1e98fSTomasz Jozwiak 			/* Allocate compression operations */
1540bf1e98fSTomasz Jozwiak 			if (ops_needed && !rte_comp_op_bulk_alloc(
155*50fa48e4STomasz Jozwiak 						mem->op_pool,
1560bf1e98fSTomasz Jozwiak 						&ops[ops_unused],
1570bf1e98fSTomasz Jozwiak 						ops_needed)) {
1580bf1e98fSTomasz Jozwiak 				RTE_LOG(ERR, USER1,
1590bf1e98fSTomasz Jozwiak 				      "Could not allocate enough operations\n");
1600bf1e98fSTomasz Jozwiak 				res = -1;
1610bf1e98fSTomasz Jozwiak 				goto end;
1620bf1e98fSTomasz Jozwiak 			}
1630bf1e98fSTomasz Jozwiak 			allocated += ops_needed;
1640bf1e98fSTomasz Jozwiak 
1650bf1e98fSTomasz Jozwiak 			for (i = 0; i < ops_needed; i++) {
1660bf1e98fSTomasz Jozwiak 				/*
1670bf1e98fSTomasz Jozwiak 				 * Calculate next buffer to attach to operation
1680bf1e98fSTomasz Jozwiak 				 */
1690bf1e98fSTomasz Jozwiak 				uint32_t buf_id = total_enq_ops + i +
1700bf1e98fSTomasz Jozwiak 						ops_unused;
1710bf1e98fSTomasz Jozwiak 				uint16_t op_id = ops_unused + i;
1720bf1e98fSTomasz Jozwiak 				/* Reset all data in output buffers */
1730bf1e98fSTomasz Jozwiak 				struct rte_mbuf *m = output_bufs[buf_id];
1740bf1e98fSTomasz Jozwiak 
17527cee417STomasz Jozwiak 				m->pkt_len = out_seg_sz * m->nb_segs;
1760bf1e98fSTomasz Jozwiak 				while (m) {
1770bf1e98fSTomasz Jozwiak 					m->data_len = m->buf_len - m->data_off;
1780bf1e98fSTomasz Jozwiak 					m = m->next;
1790bf1e98fSTomasz Jozwiak 				}
1800bf1e98fSTomasz Jozwiak 				ops[op_id]->m_src = input_bufs[buf_id];
1810bf1e98fSTomasz Jozwiak 				ops[op_id]->m_dst = output_bufs[buf_id];
1820bf1e98fSTomasz Jozwiak 				ops[op_id]->src.offset = 0;
1830bf1e98fSTomasz Jozwiak 				ops[op_id]->src.length =
1840bf1e98fSTomasz Jozwiak 					rte_pktmbuf_pkt_len(input_bufs[buf_id]);
1850bf1e98fSTomasz Jozwiak 				ops[op_id]->dst.offset = 0;
1860bf1e98fSTomasz Jozwiak 				ops[op_id]->flush_flag = RTE_COMP_FLUSH_FINAL;
1870bf1e98fSTomasz Jozwiak 				ops[op_id]->input_chksum = buf_id;
1880bf1e98fSTomasz Jozwiak 				ops[op_id]->private_xform = priv_xform;
1890bf1e98fSTomasz Jozwiak 			}
1900bf1e98fSTomasz Jozwiak 
191*50fa48e4STomasz Jozwiak 			num_enq = rte_compressdev_enqueue_burst(dev_id,
192*50fa48e4STomasz Jozwiak 								mem->qp_id, ops,
1930bf1e98fSTomasz Jozwiak 								num_ops);
1940bf1e98fSTomasz Jozwiak 			if (num_enq == 0) {
1950bf1e98fSTomasz Jozwiak 				struct rte_compressdev_stats stats;
1960bf1e98fSTomasz Jozwiak 
1970bf1e98fSTomasz Jozwiak 				rte_compressdev_stats_get(dev_id, &stats);
1980bf1e98fSTomasz Jozwiak 				if (stats.enqueue_err_count) {
1990bf1e98fSTomasz Jozwiak 					res = -1;
2000bf1e98fSTomasz Jozwiak 					goto end;
2010bf1e98fSTomasz Jozwiak 				}
2020bf1e98fSTomasz Jozwiak 			}
2030bf1e98fSTomasz Jozwiak 
2040bf1e98fSTomasz Jozwiak 			ops_unused = num_ops - num_enq;
2050bf1e98fSTomasz Jozwiak 			remaining_ops -= num_enq;
2060bf1e98fSTomasz Jozwiak 			total_enq_ops += num_enq;
2070bf1e98fSTomasz Jozwiak 
208*50fa48e4STomasz Jozwiak 			num_deq = rte_compressdev_dequeue_burst(dev_id,
209*50fa48e4STomasz Jozwiak 							   mem->qp_id,
2100bf1e98fSTomasz Jozwiak 							   deq_ops,
2110bf1e98fSTomasz Jozwiak 							   test_data->burst_sz);
2120bf1e98fSTomasz Jozwiak 			total_deq_ops += num_deq;
2130bf1e98fSTomasz Jozwiak 
2140bf1e98fSTomasz Jozwiak 			for (i = 0; i < num_deq; i++) {
2150bf1e98fSTomasz Jozwiak 				struct rte_comp_op *op = deq_ops[i];
2160bf1e98fSTomasz Jozwiak 
2170bf1e98fSTomasz Jozwiak 				if (op->status != RTE_COMP_OP_STATUS_SUCCESS) {
2180bf1e98fSTomasz Jozwiak 					RTE_LOG(ERR, USER1,
2190bf1e98fSTomasz Jozwiak 						"Some operations were not successful\n");
2200bf1e98fSTomasz Jozwiak 					goto end;
2210bf1e98fSTomasz Jozwiak 				}
2220bf1e98fSTomasz Jozwiak 
2230bf1e98fSTomasz Jozwiak 				const void *read_data_addr =
2240bf1e98fSTomasz Jozwiak 						rte_pktmbuf_read(op->m_dst, 0,
2250bf1e98fSTomasz Jozwiak 						op->produced, output_data_ptr);
2260bf1e98fSTomasz Jozwiak 				if (read_data_addr == NULL) {
2270bf1e98fSTomasz Jozwiak 					RTE_LOG(ERR, USER1,
2280bf1e98fSTomasz Jozwiak 						"Could not copy buffer in destination\n");
2290bf1e98fSTomasz Jozwiak 					res = -1;
2300bf1e98fSTomasz Jozwiak 					goto end;
2310bf1e98fSTomasz Jozwiak 				}
2320bf1e98fSTomasz Jozwiak 
2330bf1e98fSTomasz Jozwiak 				if (read_data_addr != output_data_ptr)
2340bf1e98fSTomasz Jozwiak 					rte_memcpy(output_data_ptr,
2350bf1e98fSTomasz Jozwiak 						   rte_pktmbuf_mtod(op->m_dst,
2360bf1e98fSTomasz Jozwiak 								    uint8_t *),
2370bf1e98fSTomasz Jozwiak 						   op->produced);
2380bf1e98fSTomasz Jozwiak 				output_data_ptr += op->produced;
2390bf1e98fSTomasz Jozwiak 				output_size += op->produced;
2400bf1e98fSTomasz Jozwiak 
2410bf1e98fSTomasz Jozwiak 			}
2420bf1e98fSTomasz Jozwiak 
2430bf1e98fSTomasz Jozwiak 
2440bf1e98fSTomasz Jozwiak 			if (iter == num_iter - 1) {
2450bf1e98fSTomasz Jozwiak 				for (i = 0; i < num_deq; i++) {
2460bf1e98fSTomasz Jozwiak 					struct rte_comp_op *op = deq_ops[i];
2470bf1e98fSTomasz Jozwiak 					struct rte_mbuf *m = op->m_dst;
2480bf1e98fSTomasz Jozwiak 
2490bf1e98fSTomasz Jozwiak 					m->pkt_len = op->produced;
2500bf1e98fSTomasz Jozwiak 					uint32_t remaining_data = op->produced;
2510bf1e98fSTomasz Jozwiak 					uint16_t data_to_append;
2520bf1e98fSTomasz Jozwiak 
2530bf1e98fSTomasz Jozwiak 					while (remaining_data > 0) {
2540bf1e98fSTomasz Jozwiak 						data_to_append =
2550bf1e98fSTomasz Jozwiak 							RTE_MIN(remaining_data,
25627cee417STomasz Jozwiak 							out_seg_sz);
2570bf1e98fSTomasz Jozwiak 						m->data_len = data_to_append;
2580bf1e98fSTomasz Jozwiak 						remaining_data -=
2590bf1e98fSTomasz Jozwiak 								data_to_append;
2600bf1e98fSTomasz Jozwiak 						m = m->next;
2610bf1e98fSTomasz Jozwiak 					}
2620bf1e98fSTomasz Jozwiak 				}
2630bf1e98fSTomasz Jozwiak 			}
264*50fa48e4STomasz Jozwiak 			rte_mempool_put_bulk(mem->op_pool,
2650bf1e98fSTomasz Jozwiak 					     (void **)deq_ops, num_deq);
2660bf1e98fSTomasz Jozwiak 			allocated -= num_deq;
2670bf1e98fSTomasz Jozwiak 		}
2680bf1e98fSTomasz Jozwiak 
2690bf1e98fSTomasz Jozwiak 		/* Dequeue the last operations */
2700bf1e98fSTomasz Jozwiak 		while (total_deq_ops < total_ops) {
271*50fa48e4STomasz Jozwiak 			num_deq = rte_compressdev_dequeue_burst(dev_id,
272*50fa48e4STomasz Jozwiak 							mem->qp_id,
273*50fa48e4STomasz Jozwiak 							deq_ops,
274*50fa48e4STomasz Jozwiak 							test_data->burst_sz);
2750bf1e98fSTomasz Jozwiak 			if (num_deq == 0) {
2760bf1e98fSTomasz Jozwiak 				struct rte_compressdev_stats stats;
2770bf1e98fSTomasz Jozwiak 
2780bf1e98fSTomasz Jozwiak 				rte_compressdev_stats_get(dev_id, &stats);
2790bf1e98fSTomasz Jozwiak 				if (stats.dequeue_err_count) {
2800bf1e98fSTomasz Jozwiak 					res = -1;
2810bf1e98fSTomasz Jozwiak 					goto end;
2820bf1e98fSTomasz Jozwiak 				}
2830bf1e98fSTomasz Jozwiak 			}
2840bf1e98fSTomasz Jozwiak 
2850bf1e98fSTomasz Jozwiak 			total_deq_ops += num_deq;
2860bf1e98fSTomasz Jozwiak 
2870bf1e98fSTomasz Jozwiak 			for (i = 0; i < num_deq; i++) {
2880bf1e98fSTomasz Jozwiak 				struct rte_comp_op *op = deq_ops[i];
2890bf1e98fSTomasz Jozwiak 
2900bf1e98fSTomasz Jozwiak 				if (op->status != RTE_COMP_OP_STATUS_SUCCESS) {
2910bf1e98fSTomasz Jozwiak 					RTE_LOG(ERR, USER1,
2920bf1e98fSTomasz Jozwiak 						"Some operations were not successful\n");
2930bf1e98fSTomasz Jozwiak 					goto end;
2940bf1e98fSTomasz Jozwiak 				}
2950bf1e98fSTomasz Jozwiak 
2960bf1e98fSTomasz Jozwiak 				const void *read_data_addr =
2970bf1e98fSTomasz Jozwiak 						rte_pktmbuf_read(op->m_dst,
2980bf1e98fSTomasz Jozwiak 								 op->dst.offset,
2990bf1e98fSTomasz Jozwiak 						op->produced, output_data_ptr);
3000bf1e98fSTomasz Jozwiak 				if (read_data_addr == NULL) {
3010bf1e98fSTomasz Jozwiak 					RTE_LOG(ERR, USER1,
3020bf1e98fSTomasz Jozwiak 						"Could not copy buffer in destination\n");
3030bf1e98fSTomasz Jozwiak 					res = -1;
3040bf1e98fSTomasz Jozwiak 					goto end;
3050bf1e98fSTomasz Jozwiak 				}
3060bf1e98fSTomasz Jozwiak 
3070bf1e98fSTomasz Jozwiak 				if (read_data_addr != output_data_ptr)
3080bf1e98fSTomasz Jozwiak 					rte_memcpy(output_data_ptr,
3090bf1e98fSTomasz Jozwiak 						   rte_pktmbuf_mtod(
3100bf1e98fSTomasz Jozwiak 							op->m_dst, uint8_t *),
3110bf1e98fSTomasz Jozwiak 						   op->produced);
3120bf1e98fSTomasz Jozwiak 				output_data_ptr += op->produced;
3130bf1e98fSTomasz Jozwiak 				output_size += op->produced;
3140bf1e98fSTomasz Jozwiak 
3150bf1e98fSTomasz Jozwiak 			}
3160bf1e98fSTomasz Jozwiak 
3170bf1e98fSTomasz Jozwiak 			if (iter == num_iter - 1) {
3180bf1e98fSTomasz Jozwiak 				for (i = 0; i < num_deq; i++) {
3190bf1e98fSTomasz Jozwiak 					struct rte_comp_op *op = deq_ops[i];
3200bf1e98fSTomasz Jozwiak 					struct rte_mbuf *m = op->m_dst;
3210bf1e98fSTomasz Jozwiak 
3220bf1e98fSTomasz Jozwiak 					m->pkt_len = op->produced;
3230bf1e98fSTomasz Jozwiak 					uint32_t remaining_data = op->produced;
3240bf1e98fSTomasz Jozwiak 					uint16_t data_to_append;
3250bf1e98fSTomasz Jozwiak 
3260bf1e98fSTomasz Jozwiak 					while (remaining_data > 0) {
3270bf1e98fSTomasz Jozwiak 						data_to_append =
3280bf1e98fSTomasz Jozwiak 						RTE_MIN(remaining_data,
32927cee417STomasz Jozwiak 							out_seg_sz);
3300bf1e98fSTomasz Jozwiak 						m->data_len = data_to_append;
3310bf1e98fSTomasz Jozwiak 						remaining_data -=
3320bf1e98fSTomasz Jozwiak 								data_to_append;
3330bf1e98fSTomasz Jozwiak 						m = m->next;
3340bf1e98fSTomasz Jozwiak 					}
3350bf1e98fSTomasz Jozwiak 				}
3360bf1e98fSTomasz Jozwiak 			}
337*50fa48e4STomasz Jozwiak 			rte_mempool_put_bulk(mem->op_pool,
3380bf1e98fSTomasz Jozwiak 					     (void **)deq_ops, num_deq);
3390bf1e98fSTomasz Jozwiak 			allocated -= num_deq;
3400bf1e98fSTomasz Jozwiak 		}
3410bf1e98fSTomasz Jozwiak 	}
3420bf1e98fSTomasz Jozwiak 
3430bf1e98fSTomasz Jozwiak 	if (output_data_sz)
3440bf1e98fSTomasz Jozwiak 		*output_data_sz = output_size;
3450bf1e98fSTomasz Jozwiak end:
346*50fa48e4STomasz Jozwiak 	rte_mempool_put_bulk(mem->op_pool, (void **)ops, allocated);
3470bf1e98fSTomasz Jozwiak 	rte_compressdev_private_xform_free(dev_id, priv_xform);
3480bf1e98fSTomasz Jozwiak 	rte_free(ops);
3490bf1e98fSTomasz Jozwiak 	return res;
3500bf1e98fSTomasz Jozwiak }
3510bf1e98fSTomasz Jozwiak 
3520bf1e98fSTomasz Jozwiak int
353*50fa48e4STomasz Jozwiak cperf_verify_test_runner(void *test_ctx)
3540bf1e98fSTomasz Jozwiak {
355*50fa48e4STomasz Jozwiak 	struct cperf_verify_ctx *ctx = test_ctx;
356*50fa48e4STomasz Jozwiak 	struct comp_test_data *test_data = ctx->options;
3570bf1e98fSTomasz Jozwiak 	int ret = EXIT_SUCCESS;
358*50fa48e4STomasz Jozwiak 	static rte_atomic16_t display_once = RTE_ATOMIC16_INIT(0);
359*50fa48e4STomasz Jozwiak 	uint32_t lcore = rte_lcore_id();
360*50fa48e4STomasz Jozwiak 
361*50fa48e4STomasz Jozwiak 	ctx->mem.lcore_id = lcore;
3620bf1e98fSTomasz Jozwiak 
3630bf1e98fSTomasz Jozwiak 	test_data->ratio = 0;
3640bf1e98fSTomasz Jozwiak 
365*50fa48e4STomasz Jozwiak 	if (main_loop(ctx, RTE_COMP_COMPRESS) < 0) {
3660bf1e98fSTomasz Jozwiak 		ret = EXIT_FAILURE;
3670bf1e98fSTomasz Jozwiak 		goto end;
3680bf1e98fSTomasz Jozwiak 	}
3690bf1e98fSTomasz Jozwiak 
370*50fa48e4STomasz Jozwiak 	if (main_loop(ctx, RTE_COMP_DECOMPRESS) < 0) {
3710bf1e98fSTomasz Jozwiak 		ret = EXIT_FAILURE;
3720bf1e98fSTomasz Jozwiak 		goto end;
3730bf1e98fSTomasz Jozwiak 	}
3740bf1e98fSTomasz Jozwiak 
375*50fa48e4STomasz Jozwiak 	if (ctx->decomp_data_sz != test_data->input_data_sz) {
3760bf1e98fSTomasz Jozwiak 		RTE_LOG(ERR, USER1,
3770bf1e98fSTomasz Jozwiak 	   "Decompressed data length not equal to input data length\n");
3780bf1e98fSTomasz Jozwiak 		RTE_LOG(ERR, USER1,
3790bf1e98fSTomasz Jozwiak 			"Decompressed size = %zu, expected = %zu\n",
380*50fa48e4STomasz Jozwiak 			ctx->decomp_data_sz, test_data->input_data_sz);
3810bf1e98fSTomasz Jozwiak 		ret = EXIT_FAILURE;
3820bf1e98fSTomasz Jozwiak 		goto end;
3830bf1e98fSTomasz Jozwiak 	} else {
384*50fa48e4STomasz Jozwiak 		if (memcmp(ctx->mem.decompressed_data,
3850bf1e98fSTomasz Jozwiak 				test_data->input_data,
3860bf1e98fSTomasz Jozwiak 				test_data->input_data_sz) != 0) {
3870bf1e98fSTomasz Jozwiak 			RTE_LOG(ERR, USER1,
3880bf1e98fSTomasz Jozwiak 		    "Decompressed data is not the same as file data\n");
3890bf1e98fSTomasz Jozwiak 			ret = EXIT_FAILURE;
3900bf1e98fSTomasz Jozwiak 			goto end;
3910bf1e98fSTomasz Jozwiak 		}
3920bf1e98fSTomasz Jozwiak 	}
3930bf1e98fSTomasz Jozwiak 
394*50fa48e4STomasz Jozwiak 	ctx->ratio = (double) ctx->comp_data_sz /
3950bf1e98fSTomasz Jozwiak 			test_data->input_data_sz * 100;
3960bf1e98fSTomasz Jozwiak 
397*50fa48e4STomasz Jozwiak 	if (!ctx->silent) {
398*50fa48e4STomasz Jozwiak 		if (rte_atomic16_test_and_set(&display_once)) {
399*50fa48e4STomasz Jozwiak 			printf("%12s%6s%12s%17s\n",
400*50fa48e4STomasz Jozwiak 			    "lcore id", "Level", "Comp size", "Comp ratio [%]");
401*50fa48e4STomasz Jozwiak 		}
402*50fa48e4STomasz Jozwiak 		printf("%12u%6u%12zu%17.2f\n",
403*50fa48e4STomasz Jozwiak 		       ctx->mem.lcore_id,
404*50fa48e4STomasz Jozwiak 		       test_data->level, ctx->comp_data_sz, ctx->ratio);
405*50fa48e4STomasz Jozwiak 	}
406*50fa48e4STomasz Jozwiak 
4070bf1e98fSTomasz Jozwiak end:
4080bf1e98fSTomasz Jozwiak 	return ret;
4090bf1e98fSTomasz Jozwiak }
410