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