12695db95SArtur Trybula /* SPDX-License-Identifier: BSD-3-Clause
22695db95SArtur Trybula * Copyright(c) 2019 Intel Corporation
32695db95SArtur Trybula */
42695db95SArtur Trybula
572b452c5SDmitry Kozlyuk #include <stdlib.h>
672b452c5SDmitry Kozlyuk
72695db95SArtur Trybula #include <rte_malloc.h>
82695db95SArtur Trybula #include <rte_eal.h>
92695db95SArtur Trybula #include <rte_log.h>
102695db95SArtur Trybula #include <rte_cycles.h>
112695db95SArtur Trybula #include "rte_spinlock.h"
122695db95SArtur Trybula #include <rte_compressdev.h>
132695db95SArtur Trybula
142695db95SArtur Trybula #include "comp_perf_test_cyclecount.h"
152695db95SArtur Trybula
162695db95SArtur Trybula struct cperf_cyclecount_ctx {
172695db95SArtur Trybula struct cperf_verify_ctx ver;
182695db95SArtur Trybula
192695db95SArtur Trybula uint32_t ops_enq_retries;
202695db95SArtur Trybula uint32_t ops_deq_retries;
212695db95SArtur Trybula
222695db95SArtur Trybula uint64_t duration_op;
232695db95SArtur Trybula uint64_t duration_enq;
242695db95SArtur Trybula uint64_t duration_deq;
252695db95SArtur Trybula };
262695db95SArtur Trybula
272695db95SArtur Trybula void
cperf_cyclecount_test_destructor(void * arg)282695db95SArtur Trybula cperf_cyclecount_test_destructor(void *arg)
292695db95SArtur Trybula {
302695db95SArtur Trybula struct cperf_cyclecount_ctx *ctx = arg;
312695db95SArtur Trybula
322695db95SArtur Trybula if (arg) {
332695db95SArtur Trybula comp_perf_free_memory(ctx->ver.options, &ctx->ver.mem);
342695db95SArtur Trybula rte_free(arg);
352695db95SArtur Trybula }
362695db95SArtur Trybula }
372695db95SArtur Trybula
382695db95SArtur Trybula void *
cperf_cyclecount_test_constructor(uint8_t dev_id,uint16_t qp_id,struct comp_test_data * options)392695db95SArtur Trybula cperf_cyclecount_test_constructor(uint8_t dev_id, uint16_t qp_id,
402695db95SArtur Trybula struct comp_test_data *options)
412695db95SArtur Trybula {
422695db95SArtur Trybula struct cperf_cyclecount_ctx *ctx = NULL;
432695db95SArtur Trybula
442695db95SArtur Trybula ctx = rte_malloc(NULL, sizeof(struct cperf_cyclecount_ctx), 0);
452695db95SArtur Trybula
462695db95SArtur Trybula if (ctx == NULL)
472695db95SArtur Trybula return NULL;
482695db95SArtur Trybula
492695db95SArtur Trybula ctx->ver.mem.dev_id = dev_id;
502695db95SArtur Trybula ctx->ver.mem.qp_id = qp_id;
512695db95SArtur Trybula ctx->ver.options = options;
522695db95SArtur Trybula ctx->ver.silent = 1; /* ver. part will be silent */
532695db95SArtur Trybula
542695db95SArtur Trybula if (!comp_perf_allocate_memory(ctx->ver.options, &ctx->ver.mem)
552695db95SArtur Trybula && !prepare_bufs(ctx->ver.options, &ctx->ver.mem))
562695db95SArtur Trybula return ctx;
572695db95SArtur Trybula
582695db95SArtur Trybula cperf_cyclecount_test_destructor(ctx);
592695db95SArtur Trybula return NULL;
602695db95SArtur Trybula }
612695db95SArtur Trybula
622695db95SArtur Trybula static int
cperf_cyclecount_op_setup(struct rte_comp_op ** ops,struct cperf_cyclecount_ctx * ctx,struct rte_mbuf ** input_bufs,struct rte_mbuf ** output_bufs,void * priv_xform,uint32_t out_seg_sz)632695db95SArtur Trybula cperf_cyclecount_op_setup(struct rte_comp_op **ops,
642695db95SArtur Trybula struct cperf_cyclecount_ctx *ctx,
652695db95SArtur Trybula struct rte_mbuf **input_bufs,
662695db95SArtur Trybula struct rte_mbuf **output_bufs,
672695db95SArtur Trybula void *priv_xform,
682695db95SArtur Trybula uint32_t out_seg_sz)
692695db95SArtur Trybula {
702695db95SArtur Trybula struct comp_test_data *test_data = ctx->ver.options;
712695db95SArtur Trybula struct cperf_mem_resources *mem = &ctx->ver.mem;
722695db95SArtur Trybula
732695db95SArtur Trybula uint32_t i, iter, num_iter;
742695db95SArtur Trybula int res = 0;
752695db95SArtur Trybula uint16_t ops_needed;
762695db95SArtur Trybula
772695db95SArtur Trybula num_iter = test_data->num_iter;
782695db95SArtur Trybula
792695db95SArtur Trybula for (iter = 0; iter < num_iter; iter++) {
802695db95SArtur Trybula uint32_t remaining_ops = mem->total_bufs;
812695db95SArtur Trybula uint32_t total_enq_ops = 0;
822695db95SArtur Trybula uint16_t num_enq = 0;
832695db95SArtur Trybula uint16_t num_deq = 0;
842695db95SArtur Trybula
852695db95SArtur Trybula while (remaining_ops > 0) {
862695db95SArtur Trybula uint16_t num_ops = RTE_MIN(remaining_ops,
872695db95SArtur Trybula test_data->burst_sz);
882695db95SArtur Trybula ops_needed = num_ops;
892695db95SArtur Trybula
902695db95SArtur Trybula /* Allocate compression operations */
912695db95SArtur Trybula if (ops_needed && rte_mempool_get_bulk(
922695db95SArtur Trybula mem->op_pool,
932695db95SArtur Trybula (void **)ops,
942695db95SArtur Trybula ops_needed) != 0) {
952695db95SArtur Trybula RTE_LOG(ERR, USER1,
962695db95SArtur Trybula "Cyclecount: could not allocate enough operations\n");
972695db95SArtur Trybula res = -1;
982695db95SArtur Trybula goto end;
992695db95SArtur Trybula }
1002695db95SArtur Trybula
1012695db95SArtur Trybula for (i = 0; i < ops_needed; i++) {
1022695db95SArtur Trybula
1032695db95SArtur Trybula /* Calculate next buffer to attach */
1042695db95SArtur Trybula /* to operation */
1052695db95SArtur Trybula uint32_t buf_id = total_enq_ops + i;
1062695db95SArtur Trybula uint16_t op_id = i;
1072695db95SArtur Trybula
1082695db95SArtur Trybula /* Reset all data in output buffers */
1092695db95SArtur Trybula struct rte_mbuf *m = output_bufs[buf_id];
1102695db95SArtur Trybula
1112695db95SArtur Trybula m->pkt_len = out_seg_sz * m->nb_segs;
1122695db95SArtur Trybula while (m) {
1132695db95SArtur Trybula m->data_len = m->buf_len - m->data_off;
1142695db95SArtur Trybula m = m->next;
1152695db95SArtur Trybula }
1162695db95SArtur Trybula ops[op_id]->m_src = input_bufs[buf_id];
1172695db95SArtur Trybula ops[op_id]->m_dst = output_bufs[buf_id];
1182695db95SArtur Trybula ops[op_id]->src.offset = 0;
1192695db95SArtur Trybula ops[op_id]->src.length =
1202695db95SArtur Trybula rte_pktmbuf_pkt_len(input_bufs[buf_id]);
1212695db95SArtur Trybula ops[op_id]->dst.offset = 0;
1222695db95SArtur Trybula ops[op_id]->flush_flag = RTE_COMP_FLUSH_FINAL;
1232695db95SArtur Trybula ops[op_id]->input_chksum = buf_id;
1242695db95SArtur Trybula ops[op_id]->private_xform = priv_xform;
1252695db95SArtur Trybula }
1262695db95SArtur Trybula
1272695db95SArtur Trybula /* E N Q U E U I N G */
1282695db95SArtur Trybula /* assuming that all ops are enqueued */
1292695db95SArtur Trybula /* instead of the real enqueue operation */
1302695db95SArtur Trybula num_enq = num_ops;
1312695db95SArtur Trybula
1322695db95SArtur Trybula remaining_ops -= num_enq;
1332695db95SArtur Trybula total_enq_ops += num_enq;
1342695db95SArtur Trybula
1352695db95SArtur Trybula /* D E Q U E U I N G */
1362695db95SArtur Trybula /* assuming that all ops dequeued */
1372695db95SArtur Trybula /* instead of the real dequeue operation */
1382695db95SArtur Trybula num_deq = num_ops;
1392695db95SArtur Trybula
1402695db95SArtur Trybula rte_mempool_put_bulk(mem->op_pool,
1412695db95SArtur Trybula (void **)ops, num_deq);
1422695db95SArtur Trybula }
1432695db95SArtur Trybula }
1442695db95SArtur Trybula return res;
1452695db95SArtur Trybula end:
1462695db95SArtur Trybula rte_mempool_put_bulk(mem->op_pool, (void **)ops, ops_needed);
1472695db95SArtur Trybula rte_free(ops);
1482695db95SArtur Trybula
1492695db95SArtur Trybula return res;
1502695db95SArtur Trybula }
1512695db95SArtur Trybula
1522695db95SArtur Trybula static int
main_loop(struct cperf_cyclecount_ctx * ctx,enum rte_comp_xform_type type)1532695db95SArtur Trybula main_loop(struct cperf_cyclecount_ctx *ctx, enum rte_comp_xform_type type)
1542695db95SArtur Trybula {
1552695db95SArtur Trybula struct comp_test_data *test_data = ctx->ver.options;
1562695db95SArtur Trybula struct cperf_mem_resources *mem = &ctx->ver.mem;
1572695db95SArtur Trybula uint8_t dev_id = mem->dev_id;
1582695db95SArtur Trybula uint32_t i, iter, num_iter;
1592695db95SArtur Trybula struct rte_comp_op **ops, **deq_ops;
1602695db95SArtur Trybula void *priv_xform = NULL;
1612695db95SArtur Trybula struct rte_comp_xform xform;
1622695db95SArtur Trybula struct rte_mbuf **input_bufs, **output_bufs;
1632695db95SArtur Trybula int ret, res = 0;
1642695db95SArtur Trybula int allocated = 0;
1652695db95SArtur Trybula uint32_t out_seg_sz;
1662695db95SArtur Trybula
1672695db95SArtur Trybula uint64_t tsc_start, tsc_end, tsc_duration;
1682695db95SArtur Trybula
1692695db95SArtur Trybula if (test_data == NULL || !test_data->burst_sz) {
1702695db95SArtur Trybula RTE_LOG(ERR, USER1, "Unknown burst size\n");
1712695db95SArtur Trybula return -1;
1722695db95SArtur Trybula }
1732695db95SArtur Trybula ctx->duration_enq = 0;
1742695db95SArtur Trybula ctx->duration_deq = 0;
1752695db95SArtur Trybula ctx->ops_enq_retries = 0;
1762695db95SArtur Trybula ctx->ops_deq_retries = 0;
1772695db95SArtur Trybula
1782695db95SArtur Trybula /* one array for both enqueue and dequeue */
1792695db95SArtur Trybula ops = rte_zmalloc_socket(NULL,
18068d3287fSRaja Zidane (test_data->burst_sz + mem->total_bufs) *
18168d3287fSRaja Zidane sizeof(struct rte_comp_op *),
1822695db95SArtur Trybula 0, rte_socket_id());
1832695db95SArtur Trybula
1842695db95SArtur Trybula if (ops == NULL) {
1852695db95SArtur Trybula RTE_LOG(ERR, USER1,
1867be78d02SJosh Soref "Can't allocate memory for ops structures\n");
1872695db95SArtur Trybula return -1;
1882695db95SArtur Trybula }
1892695db95SArtur Trybula
19068d3287fSRaja Zidane deq_ops = &ops[test_data->burst_sz];
1912695db95SArtur Trybula
1922695db95SArtur Trybula if (type == RTE_COMP_COMPRESS) {
1932695db95SArtur Trybula xform = (struct rte_comp_xform) {
1942695db95SArtur Trybula .type = RTE_COMP_COMPRESS,
1952695db95SArtur Trybula .compress = {
19672c64a34SMichael Baum .algo = test_data->test_algo,
1972695db95SArtur Trybula .level = test_data->level,
1982695db95SArtur Trybula .window_size = test_data->window_sz,
1992695db95SArtur Trybula .chksum = RTE_COMP_CHECKSUM_NONE,
2002695db95SArtur Trybula .hash_algo = RTE_COMP_HASH_ALGO_NONE
2012695db95SArtur Trybula }
2022695db95SArtur Trybula };
20372c64a34SMichael Baum if (test_data->test_algo == RTE_COMP_ALGO_DEFLATE)
20472c64a34SMichael Baum xform.compress.deflate.huffman = test_data->huffman_enc;
20572c64a34SMichael Baum else if (test_data->test_algo == RTE_COMP_ALGO_LZ4)
20672c64a34SMichael Baum xform.compress.lz4.flags = test_data->lz4_flags;
2072695db95SArtur Trybula input_bufs = mem->decomp_bufs;
2082695db95SArtur Trybula output_bufs = mem->comp_bufs;
2092695db95SArtur Trybula out_seg_sz = test_data->out_seg_sz;
2102695db95SArtur Trybula } else {
2112695db95SArtur Trybula xform = (struct rte_comp_xform) {
2122695db95SArtur Trybula .type = RTE_COMP_DECOMPRESS,
2132695db95SArtur Trybula .decompress = {
21472c64a34SMichael Baum .algo = test_data->test_algo,
2152695db95SArtur Trybula .chksum = RTE_COMP_CHECKSUM_NONE,
2162695db95SArtur Trybula .window_size = test_data->window_sz,
2172695db95SArtur Trybula .hash_algo = RTE_COMP_HASH_ALGO_NONE
2182695db95SArtur Trybula }
2192695db95SArtur Trybula };
22072c64a34SMichael Baum if (test_data->test_algo == RTE_COMP_ALGO_LZ4)
22172c64a34SMichael Baum xform.decompress.lz4.flags = test_data->lz4_flags;
2222695db95SArtur Trybula input_bufs = mem->comp_bufs;
2232695db95SArtur Trybula output_bufs = mem->decomp_bufs;
2242695db95SArtur Trybula out_seg_sz = test_data->seg_sz;
2252695db95SArtur Trybula }
2262695db95SArtur Trybula
2272695db95SArtur Trybula /* Create private xform */
2282695db95SArtur Trybula if (rte_compressdev_private_xform_create(dev_id, &xform,
2292695db95SArtur Trybula &priv_xform) < 0) {
2302695db95SArtur Trybula RTE_LOG(ERR, USER1, "Private xform could not be created\n");
2312695db95SArtur Trybula res = -1;
2322695db95SArtur Trybula goto end;
2332695db95SArtur Trybula }
2342695db95SArtur Trybula
2352695db95SArtur Trybula tsc_start = rte_rdtsc_precise();
2362695db95SArtur Trybula ret = cperf_cyclecount_op_setup(ops,
2372695db95SArtur Trybula ctx,
2382695db95SArtur Trybula input_bufs,
2392695db95SArtur Trybula output_bufs,
2402695db95SArtur Trybula priv_xform,
2412695db95SArtur Trybula out_seg_sz);
2422695db95SArtur Trybula
2432695db95SArtur Trybula tsc_end = rte_rdtsc_precise();
2442695db95SArtur Trybula
2452695db95SArtur Trybula /* ret value check postponed a bit to cancel extra 'if' bias */
2462695db95SArtur Trybula if (ret < 0) {
2472695db95SArtur Trybula RTE_LOG(ERR, USER1, "Setup function failed\n");
2482695db95SArtur Trybula res = -1;
2492695db95SArtur Trybula goto end;
2502695db95SArtur Trybula }
2512695db95SArtur Trybula
2522695db95SArtur Trybula tsc_duration = tsc_end - tsc_start;
2532695db95SArtur Trybula ctx->duration_op = tsc_duration;
2542695db95SArtur Trybula
2552695db95SArtur Trybula num_iter = test_data->num_iter;
2562695db95SArtur Trybula for (iter = 0; iter < num_iter; iter++) {
2572695db95SArtur Trybula uint32_t total_ops = mem->total_bufs;
2582695db95SArtur Trybula uint32_t remaining_ops = mem->total_bufs;
2592695db95SArtur Trybula uint32_t total_deq_ops = 0;
2602695db95SArtur Trybula uint32_t total_enq_ops = 0;
2612695db95SArtur Trybula uint16_t ops_unused = 0;
2622695db95SArtur Trybula uint16_t num_enq = 0;
2632695db95SArtur Trybula uint16_t num_deq = 0;
2642695db95SArtur Trybula
2652695db95SArtur Trybula while (remaining_ops > 0) {
2662695db95SArtur Trybula uint16_t num_ops = RTE_MIN(remaining_ops,
2672695db95SArtur Trybula test_data->burst_sz);
2682695db95SArtur Trybula uint16_t ops_needed = num_ops - ops_unused;
2692695db95SArtur Trybula
2702695db95SArtur Trybula /*
2712695db95SArtur Trybula * Move the unused operations from the previous
2722695db95SArtur Trybula * enqueue_burst call to the front, to maintain order
2732695db95SArtur Trybula */
2742695db95SArtur Trybula if ((ops_unused > 0) && (num_enq > 0)) {
2752695db95SArtur Trybula size_t nb_b_to_mov =
2762695db95SArtur Trybula ops_unused * sizeof(struct rte_comp_op *);
2772695db95SArtur Trybula
2782695db95SArtur Trybula memmove(ops, &ops[num_enq], nb_b_to_mov);
2792695db95SArtur Trybula }
2802695db95SArtur Trybula
2812695db95SArtur Trybula /* Allocate compression operations */
2822695db95SArtur Trybula if (ops_needed && rte_mempool_get_bulk(
2832695db95SArtur Trybula mem->op_pool,
28481353ea4SRaja Zidane (void **)&ops[ops_unused],
2852695db95SArtur Trybula ops_needed) != 0) {
2862695db95SArtur Trybula RTE_LOG(ERR, USER1,
2872695db95SArtur Trybula "Could not allocate enough operations\n");
2882695db95SArtur Trybula res = -1;
2892695db95SArtur Trybula goto end;
2902695db95SArtur Trybula }
2912695db95SArtur Trybula allocated += ops_needed;
2922695db95SArtur Trybula
2932695db95SArtur Trybula for (i = 0; i < ops_needed; i++) {
2942695db95SArtur Trybula /*
2952695db95SArtur Trybula * Calculate next buffer to attach to operation
2962695db95SArtur Trybula */
2972695db95SArtur Trybula uint32_t buf_id = total_enq_ops + i +
2982695db95SArtur Trybula ops_unused;
2992695db95SArtur Trybula uint16_t op_id = ops_unused + i;
3002695db95SArtur Trybula /* Reset all data in output buffers */
3012695db95SArtur Trybula struct rte_mbuf *m = output_bufs[buf_id];
3022695db95SArtur Trybula
3032695db95SArtur Trybula m->pkt_len = out_seg_sz * m->nb_segs;
3042695db95SArtur Trybula while (m) {
3052695db95SArtur Trybula m->data_len = m->buf_len - m->data_off;
3062695db95SArtur Trybula m = m->next;
3072695db95SArtur Trybula }
3082695db95SArtur Trybula ops[op_id]->m_src = input_bufs[buf_id];
3092695db95SArtur Trybula ops[op_id]->m_dst = output_bufs[buf_id];
3102695db95SArtur Trybula ops[op_id]->src.offset = 0;
3112695db95SArtur Trybula ops[op_id]->src.length =
3122695db95SArtur Trybula rte_pktmbuf_pkt_len(input_bufs[buf_id]);
3132695db95SArtur Trybula ops[op_id]->dst.offset = 0;
3142695db95SArtur Trybula ops[op_id]->flush_flag = RTE_COMP_FLUSH_FINAL;
3152695db95SArtur Trybula ops[op_id]->input_chksum = buf_id;
3162695db95SArtur Trybula ops[op_id]->private_xform = priv_xform;
3172695db95SArtur Trybula }
3182695db95SArtur Trybula
3192695db95SArtur Trybula if (unlikely(test_data->perf_comp_force_stop))
3202695db95SArtur Trybula goto end;
3212695db95SArtur Trybula
3222695db95SArtur Trybula tsc_start = rte_rdtsc_precise();
3232695db95SArtur Trybula num_enq = rte_compressdev_enqueue_burst(dev_id,
3242695db95SArtur Trybula mem->qp_id, ops,
3252695db95SArtur Trybula num_ops);
3262695db95SArtur Trybula tsc_end = rte_rdtsc_precise();
3272695db95SArtur Trybula tsc_duration = tsc_end - tsc_start;
3282695db95SArtur Trybula ctx->duration_enq += tsc_duration;
3292695db95SArtur Trybula
3302695db95SArtur Trybula if (num_enq < num_ops)
3312695db95SArtur Trybula ctx->ops_enq_retries++;
3322695db95SArtur Trybula
3332695db95SArtur Trybula if (test_data->cyclecount_delay)
3342695db95SArtur Trybula rte_delay_us_block(test_data->cyclecount_delay);
3352695db95SArtur Trybula
3362695db95SArtur Trybula if (num_enq == 0) {
3372695db95SArtur Trybula struct rte_compressdev_stats stats;
3382695db95SArtur Trybula
3392695db95SArtur Trybula rte_compressdev_stats_get(dev_id, &stats);
3402695db95SArtur Trybula if (stats.enqueue_err_count) {
3412695db95SArtur Trybula res = -1;
3422695db95SArtur Trybula goto end;
3432695db95SArtur Trybula }
3442695db95SArtur Trybula }
3452695db95SArtur Trybula
3462695db95SArtur Trybula ops_unused = num_ops - num_enq;
3472695db95SArtur Trybula remaining_ops -= num_enq;
3482695db95SArtur Trybula total_enq_ops += num_enq;
3492695db95SArtur Trybula
3502695db95SArtur Trybula tsc_start = rte_rdtsc_precise();
3512695db95SArtur Trybula num_deq = rte_compressdev_dequeue_burst(dev_id,
3522695db95SArtur Trybula mem->qp_id,
3532695db95SArtur Trybula deq_ops,
3542695db95SArtur Trybula allocated);
3552695db95SArtur Trybula tsc_end = rte_rdtsc_precise();
3562695db95SArtur Trybula tsc_duration = tsc_end - tsc_start;
3572695db95SArtur Trybula ctx->duration_deq += tsc_duration;
3582695db95SArtur Trybula
3592695db95SArtur Trybula if (num_deq < allocated)
3602695db95SArtur Trybula ctx->ops_deq_retries++;
3612695db95SArtur Trybula
3622695db95SArtur Trybula total_deq_ops += num_deq;
3632695db95SArtur Trybula
3642695db95SArtur Trybula if (iter == num_iter - 1) {
3652695db95SArtur Trybula for (i = 0; i < num_deq; i++) {
3662695db95SArtur Trybula struct rte_comp_op *op = deq_ops[i];
3672695db95SArtur Trybula
3682695db95SArtur Trybula if (op->status !=
3692695db95SArtur Trybula RTE_COMP_OP_STATUS_SUCCESS) {
3702695db95SArtur Trybula RTE_LOG(ERR, USER1, "Some operations were not successful\n");
3712695db95SArtur Trybula goto end;
3722695db95SArtur Trybula }
3732695db95SArtur Trybula
3742695db95SArtur Trybula struct rte_mbuf *m = op->m_dst;
3752695db95SArtur Trybula
3762695db95SArtur Trybula m->pkt_len = op->produced;
3772695db95SArtur Trybula uint32_t remaining_data = op->produced;
3782695db95SArtur Trybula uint16_t data_to_append;
3792695db95SArtur Trybula
3802695db95SArtur Trybula while (remaining_data > 0) {
3812695db95SArtur Trybula data_to_append =
3822695db95SArtur Trybula RTE_MIN(remaining_data,
3832695db95SArtur Trybula out_seg_sz);
3842695db95SArtur Trybula m->data_len = data_to_append;
3852695db95SArtur Trybula remaining_data -=
3862695db95SArtur Trybula data_to_append;
3872695db95SArtur Trybula m = m->next;
3882695db95SArtur Trybula }
3892695db95SArtur Trybula }
3902695db95SArtur Trybula }
3912695db95SArtur Trybula rte_mempool_put_bulk(mem->op_pool,
3922695db95SArtur Trybula (void **)deq_ops, num_deq);
3932695db95SArtur Trybula allocated -= num_deq;
3942695db95SArtur Trybula }
3952695db95SArtur Trybula
3962695db95SArtur Trybula /* Dequeue the last operations */
3972695db95SArtur Trybula while (total_deq_ops < total_ops) {
3982695db95SArtur Trybula if (unlikely(test_data->perf_comp_force_stop))
3992695db95SArtur Trybula goto end;
4002695db95SArtur Trybula
4012695db95SArtur Trybula tsc_start = rte_rdtsc_precise();
4022695db95SArtur Trybula num_deq = rte_compressdev_dequeue_burst(dev_id,
4032695db95SArtur Trybula mem->qp_id,
4042695db95SArtur Trybula deq_ops,
4052695db95SArtur Trybula test_data->burst_sz);
4062695db95SArtur Trybula tsc_end = rte_rdtsc_precise();
4072695db95SArtur Trybula tsc_duration = tsc_end - tsc_start;
4082695db95SArtur Trybula ctx->duration_deq += tsc_duration;
4092695db95SArtur Trybula ctx->ops_deq_retries++;
4102695db95SArtur Trybula
4112695db95SArtur Trybula if (num_deq == 0) {
4122695db95SArtur Trybula struct rte_compressdev_stats stats;
4132695db95SArtur Trybula
4142695db95SArtur Trybula rte_compressdev_stats_get(dev_id, &stats);
4152695db95SArtur Trybula if (stats.dequeue_err_count) {
4162695db95SArtur Trybula res = -1;
4172695db95SArtur Trybula goto end;
4182695db95SArtur Trybula }
4192695db95SArtur Trybula }
4202695db95SArtur Trybula total_deq_ops += num_deq;
4212695db95SArtur Trybula
4222695db95SArtur Trybula if (iter == num_iter - 1) {
4232695db95SArtur Trybula for (i = 0; i < num_deq; i++) {
4242695db95SArtur Trybula struct rte_comp_op *op = deq_ops[i];
4252695db95SArtur Trybula
4262695db95SArtur Trybula if (op->status !=
4272695db95SArtur Trybula RTE_COMP_OP_STATUS_SUCCESS) {
4282695db95SArtur Trybula RTE_LOG(ERR, USER1, "Some operations were not successful\n");
4292695db95SArtur Trybula goto end;
4302695db95SArtur Trybula }
4312695db95SArtur Trybula
4322695db95SArtur Trybula struct rte_mbuf *m = op->m_dst;
4332695db95SArtur Trybula
4342695db95SArtur Trybula m->pkt_len = op->produced;
4352695db95SArtur Trybula uint32_t remaining_data = op->produced;
4362695db95SArtur Trybula uint16_t data_to_append;
4372695db95SArtur Trybula
4382695db95SArtur Trybula while (remaining_data > 0) {
4392695db95SArtur Trybula data_to_append =
4402695db95SArtur Trybula RTE_MIN(remaining_data,
4412695db95SArtur Trybula out_seg_sz);
4422695db95SArtur Trybula m->data_len = data_to_append;
4432695db95SArtur Trybula remaining_data -=
4442695db95SArtur Trybula data_to_append;
4452695db95SArtur Trybula m = m->next;
4462695db95SArtur Trybula }
4472695db95SArtur Trybula }
4482695db95SArtur Trybula }
4492695db95SArtur Trybula rte_mempool_put_bulk(mem->op_pool,
4502695db95SArtur Trybula (void **)deq_ops, num_deq);
4512695db95SArtur Trybula allocated -= num_deq;
4522695db95SArtur Trybula }
4532695db95SArtur Trybula }
4542695db95SArtur Trybula allocated = 0;
4552695db95SArtur Trybula
4562695db95SArtur Trybula end:
4572695db95SArtur Trybula if (allocated)
4582695db95SArtur Trybula rte_mempool_put_bulk(mem->op_pool, (void **)ops, allocated);
4592695db95SArtur Trybula rte_compressdev_private_xform_free(dev_id, priv_xform);
4602695db95SArtur Trybula rte_free(ops);
4612695db95SArtur Trybula
4622695db95SArtur Trybula if (test_data->perf_comp_force_stop) {
4632695db95SArtur Trybula RTE_LOG(ERR, USER1,
4642695db95SArtur Trybula "lcore: %d Perf. test has been aborted by user\n",
4652695db95SArtur Trybula mem->lcore_id);
4662695db95SArtur Trybula res = -1;
4672695db95SArtur Trybula }
4682695db95SArtur Trybula return res;
4692695db95SArtur Trybula }
4702695db95SArtur Trybula
4712695db95SArtur Trybula int
cperf_cyclecount_test_runner(void * test_ctx)4722695db95SArtur Trybula cperf_cyclecount_test_runner(void *test_ctx)
4732695db95SArtur Trybula {
4742695db95SArtur Trybula struct cperf_cyclecount_ctx *ctx = test_ctx;
4752695db95SArtur Trybula struct comp_test_data *test_data = ctx->ver.options;
4762695db95SArtur Trybula uint32_t lcore = rte_lcore_id();
477d3fcd87cSJoyce Kong static uint16_t display_once;
4782695db95SArtur Trybula static rte_spinlock_t print_spinlock;
4792695db95SArtur Trybula int i;
4802695db95SArtur Trybula
4812695db95SArtur Trybula uint32_t ops_enq_retries_comp;
4822695db95SArtur Trybula uint32_t ops_deq_retries_comp;
4832695db95SArtur Trybula
4842695db95SArtur Trybula uint32_t ops_enq_retries_decomp;
4852695db95SArtur Trybula uint32_t ops_deq_retries_decomp;
4862695db95SArtur Trybula
4872695db95SArtur Trybula uint32_t duration_setup_per_op;
4882695db95SArtur Trybula
4892695db95SArtur Trybula uint32_t duration_enq_per_op_comp;
4902695db95SArtur Trybula uint32_t duration_deq_per_op_comp;
4912695db95SArtur Trybula
4922695db95SArtur Trybula uint32_t duration_enq_per_op_decomp;
4932695db95SArtur Trybula uint32_t duration_deq_per_op_decomp;
4942695db95SArtur Trybula
4952695db95SArtur Trybula ctx->ver.mem.lcore_id = lcore;
4962695db95SArtur Trybula
497d3fcd87cSJoyce Kong uint16_t exp = 0;
4982695db95SArtur Trybula /*
4992695db95SArtur Trybula * printing information about current compression thread
5002695db95SArtur Trybula */
501*b6a7e685STyler Retzlaff if (rte_atomic_compare_exchange_strong_explicit(&ctx->ver.mem.print_info_once, &exp,
502*b6a7e685STyler Retzlaff 1, rte_memory_order_relaxed, rte_memory_order_relaxed))
5032695db95SArtur Trybula printf(" lcore: %u,"
5042695db95SArtur Trybula " driver name: %s,"
5052695db95SArtur Trybula " device name: %s,"
5062695db95SArtur Trybula " device id: %u,"
5072695db95SArtur Trybula " socket id: %u,"
5082695db95SArtur Trybula " queue pair id: %u\n",
5092695db95SArtur Trybula lcore,
5102695db95SArtur Trybula ctx->ver.options->driver_name,
5112695db95SArtur Trybula rte_compressdev_name_get(ctx->ver.mem.dev_id),
5122695db95SArtur Trybula ctx->ver.mem.dev_id,
5132695db95SArtur Trybula rte_compressdev_socket_id(ctx->ver.mem.dev_id),
5142695db95SArtur Trybula ctx->ver.mem.qp_id);
5152695db95SArtur Trybula
5162695db95SArtur Trybula /*
5172695db95SArtur Trybula * First the verification part is needed
5182695db95SArtur Trybula */
5192695db95SArtur Trybula if (cperf_verify_test_runner(&ctx->ver))
5202695db95SArtur Trybula return EXIT_FAILURE;
5212695db95SArtur Trybula
52283cc3b90SMichael Baum if (test_data->test_op & COMPRESS) {
5232695db95SArtur Trybula /*
52483cc3b90SMichael Baum * Run the test twice, discarding the first performance
5252695db95SArtur Trybula * results, before the cache is warmed up
5262695db95SArtur Trybula */
5272695db95SArtur Trybula for (i = 0; i < 2; i++) {
5282695db95SArtur Trybula if (main_loop(ctx, RTE_COMP_COMPRESS) < 0)
5292695db95SArtur Trybula return EXIT_FAILURE;
5302695db95SArtur Trybula }
5312695db95SArtur Trybula
5322695db95SArtur Trybula ops_enq_retries_comp = ctx->ops_enq_retries;
5332695db95SArtur Trybula ops_deq_retries_comp = ctx->ops_deq_retries;
5342695db95SArtur Trybula
5352695db95SArtur Trybula duration_enq_per_op_comp = ctx->duration_enq /
5362695db95SArtur Trybula (ctx->ver.mem.total_bufs * test_data->num_iter);
5372695db95SArtur Trybula duration_deq_per_op_comp = ctx->duration_deq /
5382695db95SArtur Trybula (ctx->ver.mem.total_bufs * test_data->num_iter);
53983cc3b90SMichael Baum } else {
54083cc3b90SMichael Baum ops_enq_retries_comp = 0;
54183cc3b90SMichael Baum ops_deq_retries_comp = 0;
5422695db95SArtur Trybula
54383cc3b90SMichael Baum duration_enq_per_op_comp = 0;
54483cc3b90SMichael Baum duration_deq_per_op_comp = 0;
54583cc3b90SMichael Baum }
54683cc3b90SMichael Baum
54783cc3b90SMichael Baum if (test_data->test_op & DECOMPRESS) {
54883cc3b90SMichael Baum /*
54983cc3b90SMichael Baum * Run the test twice, discarding the first performance
55083cc3b90SMichael Baum * results, before the cache is warmed up
55183cc3b90SMichael Baum */
5522695db95SArtur Trybula for (i = 0; i < 2; i++) {
5532695db95SArtur Trybula if (main_loop(ctx, RTE_COMP_DECOMPRESS) < 0)
5542695db95SArtur Trybula return EXIT_FAILURE;
5552695db95SArtur Trybula }
5562695db95SArtur Trybula
5572695db95SArtur Trybula ops_enq_retries_decomp = ctx->ops_enq_retries;
5582695db95SArtur Trybula ops_deq_retries_decomp = ctx->ops_deq_retries;
5592695db95SArtur Trybula
5602695db95SArtur Trybula duration_enq_per_op_decomp = ctx->duration_enq /
5612695db95SArtur Trybula (ctx->ver.mem.total_bufs * test_data->num_iter);
5622695db95SArtur Trybula duration_deq_per_op_decomp = ctx->duration_deq /
5632695db95SArtur Trybula (ctx->ver.mem.total_bufs * test_data->num_iter);
56483cc3b90SMichael Baum } else {
56583cc3b90SMichael Baum ops_enq_retries_decomp = 0;
56683cc3b90SMichael Baum ops_deq_retries_decomp = 0;
56783cc3b90SMichael Baum
56883cc3b90SMichael Baum duration_enq_per_op_decomp = 0;
56983cc3b90SMichael Baum duration_deq_per_op_decomp = 0;
57083cc3b90SMichael Baum }
5712695db95SArtur Trybula
5722695db95SArtur Trybula duration_setup_per_op = ctx->duration_op /
5732695db95SArtur Trybula (ctx->ver.mem.total_bufs * test_data->num_iter);
5742695db95SArtur Trybula
5752695db95SArtur Trybula /* R E P O R T processing */
5762695db95SArtur Trybula rte_spinlock_lock(&print_spinlock);
5772695db95SArtur Trybula
578d3fcd87cSJoyce Kong if (display_once == 0) {
579d3fcd87cSJoyce Kong display_once = 1;
580d3fcd87cSJoyce Kong
5812695db95SArtur Trybula printf("\nLegend for the table\n"
5822695db95SArtur Trybula " - Retries section: number of retries for the following operations:\n"
5832695db95SArtur Trybula " [C-e] - compression enqueue\n"
5842695db95SArtur Trybula " [C-d] - compression dequeue\n"
5852695db95SArtur Trybula " [D-e] - decompression enqueue\n"
5862695db95SArtur Trybula " [D-d] - decompression dequeue\n"
5872695db95SArtur Trybula " - Cycles section: number of cycles per 'op' for the following operations:\n"
5881643fc9bSMichael Baum " setup/op - memory allocation, op configuration and memory deallocation\n"
5892695db95SArtur Trybula " [C-e] - compression enqueue\n"
5902695db95SArtur Trybula " [C-d] - compression dequeue\n"
5912695db95SArtur Trybula " [D-e] - decompression enqueue\n"
5922695db95SArtur Trybula " [D-d] - decompression dequeue\n\n");
5932695db95SArtur Trybula
5942695db95SArtur Trybula printf("\n%12s%6s%12s%17s",
5952695db95SArtur Trybula "lcore id", "Level", "Comp size", "Comp ratio [%]");
5962695db95SArtur Trybula
5972695db95SArtur Trybula printf(" |%10s %6s %8s %6s %8s",
5982695db95SArtur Trybula " Retries:",
5992695db95SArtur Trybula "[C-e]", "[C-d]",
6002695db95SArtur Trybula "[D-e]", "[D-d]");
6012695db95SArtur Trybula
6022695db95SArtur Trybula printf(" |%9s %9s %9s %9s %9s %9s\n",
6032695db95SArtur Trybula " Cycles:",
6042695db95SArtur Trybula "setup/op",
6052695db95SArtur Trybula "[C-e]", "[C-d]",
6062695db95SArtur Trybula "[D-e]", "[D-d]");
6072695db95SArtur Trybula }
6082695db95SArtur Trybula
6092695db95SArtur Trybula printf("%12u"
6102695db95SArtur Trybula "%6u"
6112695db95SArtur Trybula "%12zu"
6122695db95SArtur Trybula "%17.2f",
6132695db95SArtur Trybula ctx->ver.mem.lcore_id,
6142695db95SArtur Trybula test_data->level,
6152695db95SArtur Trybula ctx->ver.comp_data_sz,
6162695db95SArtur Trybula ctx->ver.ratio);
6172695db95SArtur Trybula
6182695db95SArtur Trybula printf(" |%10s %6u %8u %6u %8u",
6192695db95SArtur Trybula " ",
6202695db95SArtur Trybula ops_enq_retries_comp,
6212695db95SArtur Trybula ops_deq_retries_comp,
6222695db95SArtur Trybula ops_enq_retries_decomp,
6232695db95SArtur Trybula ops_deq_retries_decomp);
6242695db95SArtur Trybula
6252695db95SArtur Trybula printf(" |%9s %9u %9u %9u %9u %9u\n",
6262695db95SArtur Trybula " ",
6272695db95SArtur Trybula duration_setup_per_op,
6282695db95SArtur Trybula duration_enq_per_op_comp,
6292695db95SArtur Trybula duration_deq_per_op_comp,
6302695db95SArtur Trybula duration_enq_per_op_decomp,
6312695db95SArtur Trybula duration_deq_per_op_decomp);
6322695db95SArtur Trybula
6332695db95SArtur Trybula rte_spinlock_unlock(&print_spinlock);
6342695db95SArtur Trybula
6352695db95SArtur Trybula return EXIT_SUCCESS;
6362695db95SArtur Trybula }
637