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