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