1174a1631SBruce Richardson /* SPDX-License-Identifier: BSD-3-Clause 2174a1631SBruce Richardson * Copyright(c) 2016-2017 Intel Corporation 3df52cb3bSSergio Gonzalez Monroy */ 4df52cb3bSSergio Gonzalez Monroy 572b452c5SDmitry Kozlyuk #include <stdlib.h> 672b452c5SDmitry Kozlyuk 7df52cb3bSSergio Gonzalez Monroy #include <rte_malloc.h> 8df52cb3bSSergio Gonzalez Monroy #include <rte_cycles.h> 9df52cb3bSSergio Gonzalez Monroy #include <rte_crypto.h> 10df52cb3bSSergio Gonzalez Monroy #include <rte_cryptodev.h> 11df52cb3bSSergio Gonzalez Monroy 12df52cb3bSSergio Gonzalez Monroy #include "cperf_test_verify.h" 13df52cb3bSSergio Gonzalez Monroy #include "cperf_ops.h" 14253624f4SPablo de Lara #include "cperf_test_common.h" 15df52cb3bSSergio Gonzalez Monroy 16df52cb3bSSergio Gonzalez Monroy struct cperf_verify_ctx { 17df52cb3bSSergio Gonzalez Monroy uint8_t dev_id; 18df52cb3bSSergio Gonzalez Monroy uint16_t qp_id; 19df52cb3bSSergio Gonzalez Monroy uint8_t lcore_id; 20df52cb3bSSergio Gonzalez Monroy 21bf9d6702SPablo de Lara struct rte_mempool *pool; 22df52cb3bSSergio Gonzalez Monroy 232a440d6aSAkhil Goyal void *sess; 24*76a48d8aSJack Bond-Preston uint8_t sess_owner; 25df52cb3bSSergio Gonzalez Monroy 26df52cb3bSSergio Gonzalez Monroy cperf_populate_ops_t populate_ops; 27df52cb3bSSergio Gonzalez Monroy 28bf9d6702SPablo de Lara uint32_t src_buf_offset; 29bf9d6702SPablo de Lara uint32_t dst_buf_offset; 30bf9d6702SPablo de Lara 31df52cb3bSSergio Gonzalez Monroy const struct cperf_options *options; 32df52cb3bSSergio Gonzalez Monroy const struct cperf_test_vector *test_vector; 33df52cb3bSSergio Gonzalez Monroy }; 34df52cb3bSSergio Gonzalez Monroy 35df52cb3bSSergio Gonzalez Monroy struct cperf_op_result { 36df52cb3bSSergio Gonzalez Monroy enum rte_crypto_op_status status; 37df52cb3bSSergio Gonzalez Monroy }; 38df52cb3bSSergio Gonzalez Monroy 39df52cb3bSSergio Gonzalez Monroy static void 40253624f4SPablo de Lara cperf_verify_test_free(struct cperf_verify_ctx *ctx) 41df52cb3bSSergio Gonzalez Monroy { 42c5b531d6SAnoob Joseph if (ctx == NULL) 43c5b531d6SAnoob Joseph return; 44c5b531d6SAnoob Joseph 45*76a48d8aSJack Bond-Preston if (ctx->sess != NULL && ctx->sess_owner) { 4671fa6e3fSGowrishankar Muthukrishnan if (cperf_is_asym_test(ctx->options)) 47c5b531d6SAnoob Joseph rte_cryptodev_asym_session_free(ctx->dev_id, ctx->sess); 48c5b531d6SAnoob Joseph #ifdef RTE_LIB_SECURITY 49c5b531d6SAnoob Joseph else if (ctx->options->op_type == CPERF_PDCP || 50c5b531d6SAnoob Joseph ctx->options->op_type == CPERF_DOCSIS || 519afa7a46SAkhil Goyal ctx->options->op_type == CPERF_TLS || 52c5b531d6SAnoob Joseph ctx->options->op_type == CPERF_IPSEC) { 5379bdb787SAkhil Goyal void *sec_ctx = rte_cryptodev_get_sec_ctx(ctx->dev_id); 5479bdb787SAkhil Goyal 55c5b531d6SAnoob Joseph rte_security_session_destroy(sec_ctx, ctx->sess); 56c5b531d6SAnoob Joseph } 57c5b531d6SAnoob Joseph #endif 58c5b531d6SAnoob Joseph else 59bdce2564SAkhil Goyal rte_cryptodev_sym_session_free(ctx->dev_id, ctx->sess); 60c5b531d6SAnoob Joseph } 61df52cb3bSSergio Gonzalez Monroy 62bf9d6702SPablo de Lara rte_mempool_free(ctx->pool); 63df52cb3bSSergio Gonzalez Monroy rte_free(ctx); 64df52cb3bSSergio Gonzalez Monroy } 65df52cb3bSSergio Gonzalez Monroy 66df52cb3bSSergio Gonzalez Monroy void * 67b3bbd9e5SSlawomir Mrozowicz cperf_verify_test_constructor(struct rte_mempool *sess_mp, 68b3bbd9e5SSlawomir Mrozowicz uint8_t dev_id, uint16_t qp_id, 69df52cb3bSSergio Gonzalez Monroy const struct cperf_options *options, 70df52cb3bSSergio Gonzalez Monroy const struct cperf_test_vector *test_vector, 71*76a48d8aSJack Bond-Preston const struct cperf_op_fns *op_fns, 72*76a48d8aSJack Bond-Preston void **sess) 73df52cb3bSSergio Gonzalez Monroy { 74df52cb3bSSergio Gonzalez Monroy struct cperf_verify_ctx *ctx = NULL; 75df52cb3bSSergio Gonzalez Monroy 76df52cb3bSSergio Gonzalez Monroy ctx = rte_malloc(NULL, sizeof(struct cperf_verify_ctx), 0); 77df52cb3bSSergio Gonzalez Monroy if (ctx == NULL) 78df52cb3bSSergio Gonzalez Monroy goto err; 79df52cb3bSSergio Gonzalez Monroy 80df52cb3bSSergio Gonzalez Monroy ctx->dev_id = dev_id; 81df52cb3bSSergio Gonzalez Monroy ctx->qp_id = qp_id; 82df52cb3bSSergio Gonzalez Monroy 83df52cb3bSSergio Gonzalez Monroy ctx->populate_ops = op_fns->populate_ops; 84df52cb3bSSergio Gonzalez Monroy ctx->options = options; 85df52cb3bSSergio Gonzalez Monroy ctx->test_vector = test_vector; 86df52cb3bSSergio Gonzalez Monroy 87bf9d6702SPablo de Lara /* IV goes at the end of the crypto operation */ 880fbd75a9SPablo de Lara uint16_t iv_offset = sizeof(struct rte_crypto_op) + 890fbd75a9SPablo de Lara sizeof(struct rte_crypto_sym_op); 900fbd75a9SPablo de Lara 91*76a48d8aSJack Bond-Preston if (*sess != NULL) { 92*76a48d8aSJack Bond-Preston ctx->sess = *sess; 93*76a48d8aSJack Bond-Preston ctx->sess_owner = false; 94*76a48d8aSJack Bond-Preston } else { 953f3fc330SAkhil Goyal ctx->sess = op_fns->sess_create(sess_mp, dev_id, options, 96d4ad392cSFan Zhang test_vector, iv_offset); 97df52cb3bSSergio Gonzalez Monroy if (ctx->sess == NULL) 98df52cb3bSSergio Gonzalez Monroy goto err; 99*76a48d8aSJack Bond-Preston *sess = ctx->sess; 100*76a48d8aSJack Bond-Preston ctx->sess_owner = true; 101*76a48d8aSJack Bond-Preston } 102df52cb3bSSergio Gonzalez Monroy 103c4f916e3SPablo de Lara if (cperf_alloc_common_memory(options, test_vector, dev_id, qp_id, 0, 104bf9d6702SPablo de Lara &ctx->src_buf_offset, &ctx->dst_buf_offset, 105bf9d6702SPablo de Lara &ctx->pool) < 0) 106df52cb3bSSergio Gonzalez Monroy goto err; 107df52cb3bSSergio Gonzalez Monroy 108df52cb3bSSergio Gonzalez Monroy return ctx; 109df52cb3bSSergio Gonzalez Monroy err: 110253624f4SPablo de Lara cperf_verify_test_free(ctx); 111df52cb3bSSergio Gonzalez Monroy 112df52cb3bSSergio Gonzalez Monroy return NULL; 113df52cb3bSSergio Gonzalez Monroy } 114df52cb3bSSergio Gonzalez Monroy 115df52cb3bSSergio Gonzalez Monroy static int 116df52cb3bSSergio Gonzalez Monroy cperf_verify_op(struct rte_crypto_op *op, 117df52cb3bSSergio Gonzalez Monroy const struct cperf_options *options, 118df52cb3bSSergio Gonzalez Monroy const struct cperf_test_vector *vector) 119df52cb3bSSergio Gonzalez Monroy { 120df52cb3bSSergio Gonzalez Monroy const struct rte_mbuf *m; 121df52cb3bSSergio Gonzalez Monroy uint32_t len; 122df52cb3bSSergio Gonzalez Monroy uint16_t nb_segs; 123df52cb3bSSergio Gonzalez Monroy uint8_t *data; 1247d55ca15SSuanming Mou uint32_t cipher_offset, auth_offset = 0; 1257d55ca15SSuanming Mou bool cipher = false; 1267d55ca15SSuanming Mou bool digest_verify = false; 1277d55ca15SSuanming Mou bool is_encrypt = false; 128df52cb3bSSergio Gonzalez Monroy int res = 0; 129df52cb3bSSergio Gonzalez Monroy 130df52cb3bSSergio Gonzalez Monroy if (op->status != RTE_CRYPTO_OP_STATUS_SUCCESS) 131df52cb3bSSergio Gonzalez Monroy return 1; 132df52cb3bSSergio Gonzalez Monroy 133df52cb3bSSergio Gonzalez Monroy if (op->sym->m_dst) 134df52cb3bSSergio Gonzalez Monroy m = op->sym->m_dst; 135df52cb3bSSergio Gonzalez Monroy else 136df52cb3bSSergio Gonzalez Monroy m = op->sym->m_src; 137df52cb3bSSergio Gonzalez Monroy nb_segs = m->nb_segs; 138df52cb3bSSergio Gonzalez Monroy len = 0; 139df52cb3bSSergio Gonzalez Monroy while (m && nb_segs != 0) { 140df52cb3bSSergio Gonzalez Monroy len += m->data_len; 141df52cb3bSSergio Gonzalez Monroy m = m->next; 142df52cb3bSSergio Gonzalez Monroy nb_segs--; 143df52cb3bSSergio Gonzalez Monroy } 144df52cb3bSSergio Gonzalez Monroy 145df52cb3bSSergio Gonzalez Monroy data = rte_malloc(NULL, len, 0); 146df52cb3bSSergio Gonzalez Monroy if (data == NULL) 147df52cb3bSSergio Gonzalez Monroy return 1; 148df52cb3bSSergio Gonzalez Monroy 149df52cb3bSSergio Gonzalez Monroy if (op->sym->m_dst) 150df52cb3bSSergio Gonzalez Monroy m = op->sym->m_dst; 151df52cb3bSSergio Gonzalez Monroy else 152df52cb3bSSergio Gonzalez Monroy m = op->sym->m_src; 153df52cb3bSSergio Gonzalez Monroy nb_segs = m->nb_segs; 154df52cb3bSSergio Gonzalez Monroy len = 0; 155df52cb3bSSergio Gonzalez Monroy while (m && nb_segs != 0) { 156df52cb3bSSergio Gonzalez Monroy memcpy(data + len, rte_pktmbuf_mtod(m, uint8_t *), 157df52cb3bSSergio Gonzalez Monroy m->data_len); 158df52cb3bSSergio Gonzalez Monroy len += m->data_len; 159df52cb3bSSergio Gonzalez Monroy m = m->next; 160df52cb3bSSergio Gonzalez Monroy nb_segs--; 161df52cb3bSSergio Gonzalez Monroy } 162df52cb3bSSergio Gonzalez Monroy 163df52cb3bSSergio Gonzalez Monroy switch (options->op_type) { 164df52cb3bSSergio Gonzalez Monroy case CPERF_CIPHER_ONLY: 1657d55ca15SSuanming Mou cipher = true; 166df52cb3bSSergio Gonzalez Monroy cipher_offset = 0; 1677d55ca15SSuanming Mou is_encrypt = options->cipher_op == RTE_CRYPTO_CIPHER_OP_ENCRYPT; 168df52cb3bSSergio Gonzalez Monroy break; 169df52cb3bSSergio Gonzalez Monroy case CPERF_AUTH_ONLY: 170df52cb3bSSergio Gonzalez Monroy cipher_offset = 0; 1717d55ca15SSuanming Mou if (options->auth_op == RTE_CRYPTO_AUTH_OP_GENERATE) { 172f6cefe25SPablo de Lara auth_offset = options->test_buffer_size; 1737d55ca15SSuanming Mou digest_verify = true; 1747d55ca15SSuanming Mou } 175df52cb3bSSergio Gonzalez Monroy break; 1767d55ca15SSuanming Mou case CPERF_CIPHER_THEN_AUTH: 177df52cb3bSSergio Gonzalez Monroy case CPERF_AUTH_THEN_CIPHER: 1787d55ca15SSuanming Mou cipher = true; 179df52cb3bSSergio Gonzalez Monroy cipher_offset = 0; 1807d55ca15SSuanming Mou if (options->cipher_op == RTE_CRYPTO_CIPHER_OP_ENCRYPT) { 181f6cefe25SPablo de Lara auth_offset = options->test_buffer_size; 1827d55ca15SSuanming Mou digest_verify = true; 1837d55ca15SSuanming Mou is_encrypt = true; 1847d55ca15SSuanming Mou } 185df52cb3bSSergio Gonzalez Monroy break; 186df52cb3bSSergio Gonzalez Monroy case CPERF_AEAD: 1877d55ca15SSuanming Mou cipher = true; 1880b242422SPablo de Lara cipher_offset = 0; 1897d55ca15SSuanming Mou if (options->aead_op == RTE_CRYPTO_AEAD_OP_ENCRYPT) { 1900b242422SPablo de Lara auth_offset = options->test_buffer_size; 1917d55ca15SSuanming Mou digest_verify = true; 1927d55ca15SSuanming Mou is_encrypt = true; 1937d55ca15SSuanming Mou } 194df52cb3bSSergio Gonzalez Monroy break; 195addaac42SOlivier Matz default: 196addaac42SOlivier Matz res = 1; 197addaac42SOlivier Matz goto out; 198df52cb3bSSergio Gonzalez Monroy } 199df52cb3bSSergio Gonzalez Monroy 2007d55ca15SSuanming Mou if (cipher) { 2017d55ca15SSuanming Mou if (is_encrypt) 202ddec2a39SSuanming Mou res += !!memcmp(data + cipher_offset, 203df52cb3bSSergio Gonzalez Monroy vector->ciphertext.data, 204f6cefe25SPablo de Lara options->test_buffer_size); 205df52cb3bSSergio Gonzalez Monroy else 206ddec2a39SSuanming Mou res += !!memcmp(data + cipher_offset, 207df52cb3bSSergio Gonzalez Monroy vector->plaintext.data, 208f6cefe25SPablo de Lara options->test_buffer_size); 209df52cb3bSSergio Gonzalez Monroy } 210df52cb3bSSergio Gonzalez Monroy 2117d55ca15SSuanming Mou if (digest_verify) 2127d55ca15SSuanming Mou res += !!memcmp(data + auth_offset, vector->digest.data, options->digest_sz); 213df52cb3bSSergio Gonzalez Monroy 214addaac42SOlivier Matz out: 2150afa5e39SOlivier Matz rte_free(data); 216df52cb3bSSergio Gonzalez Monroy return !!res; 217df52cb3bSSergio Gonzalez Monroy } 218df52cb3bSSergio Gonzalez Monroy 219df52cb3bSSergio Gonzalez Monroy int 220df52cb3bSSergio Gonzalez Monroy cperf_verify_test_runner(void *test_ctx) 221df52cb3bSSergio Gonzalez Monroy { 222df52cb3bSSergio Gonzalez Monroy struct cperf_verify_ctx *ctx = test_ctx; 223df52cb3bSSergio Gonzalez Monroy 224df52cb3bSSergio Gonzalez Monroy uint64_t ops_enqd = 0, ops_enqd_total = 0, ops_enqd_failed = 0; 225df52cb3bSSergio Gonzalez Monroy uint64_t ops_deqd = 0, ops_deqd_total = 0, ops_deqd_failed = 0; 226da40ebd6SPablo de Lara uint64_t ops_failed = 0; 227da40ebd6SPablo de Lara 228b6a7e685STyler Retzlaff static RTE_ATOMIC(uint16_t) display_once; 229df52cb3bSSergio Gonzalez Monroy 230bf9d6702SPablo de Lara uint64_t i; 231df52cb3bSSergio Gonzalez Monroy uint16_t ops_unused = 0; 23227c2e747SPablo de Lara uint32_t imix_idx = 0; 233df52cb3bSSergio Gonzalez Monroy 234f6cefe25SPablo de Lara struct rte_crypto_op *ops[ctx->options->max_burst_size]; 235f6cefe25SPablo de Lara struct rte_crypto_op *ops_processed[ctx->options->max_burst_size]; 236df52cb3bSSergio Gonzalez Monroy 237df52cb3bSSergio Gonzalez Monroy uint32_t lcore = rte_lcore_id(); 238df52cb3bSSergio Gonzalez Monroy 239df52cb3bSSergio Gonzalez Monroy #ifdef CPERF_LINEARIZATION_ENABLE 240df52cb3bSSergio Gonzalez Monroy struct rte_cryptodev_info dev_info; 241df52cb3bSSergio Gonzalez Monroy int linearize = 0; 242df52cb3bSSergio Gonzalez Monroy 243df52cb3bSSergio Gonzalez Monroy /* Check if source mbufs require coalescing */ 244083de3ebSPablo de Lara if (ctx->options->segment_sz < ctx->options->max_buffer_size) { 245df52cb3bSSergio Gonzalez Monroy rte_cryptodev_info_get(ctx->dev_id, &dev_info); 246df52cb3bSSergio Gonzalez Monroy if ((dev_info.feature_flags & 247df52cb3bSSergio Gonzalez Monroy RTE_CRYPTODEV_FF_MBUF_SCATTER_GATHER) == 0) 248df52cb3bSSergio Gonzalez Monroy linearize = 1; 249df52cb3bSSergio Gonzalez Monroy } 250df52cb3bSSergio Gonzalez Monroy #endif /* CPERF_LINEARIZATION_ENABLE */ 251df52cb3bSSergio Gonzalez Monroy 252df52cb3bSSergio Gonzalez Monroy ctx->lcore_id = lcore; 253df52cb3bSSergio Gonzalez Monroy 254df52cb3bSSergio Gonzalez Monroy if (!ctx->options->csv) 255df52cb3bSSergio Gonzalez Monroy printf("\n# Running verify test on device: %u, lcore: %u\n", 256df52cb3bSSergio Gonzalez Monroy ctx->dev_id, lcore); 257df52cb3bSSergio Gonzalez Monroy 258f8b7fdd3SPablo de Lara uint16_t iv_offset = sizeof(struct rte_crypto_op) + 259f8b7fdd3SPablo de Lara sizeof(struct rte_crypto_sym_op); 260f8b7fdd3SPablo de Lara 261df52cb3bSSergio Gonzalez Monroy while (ops_enqd_total < ctx->options->total_ops) { 262df52cb3bSSergio Gonzalez Monroy 263f6cefe25SPablo de Lara uint16_t burst_size = ((ops_enqd_total + ctx->options->max_burst_size) 264df52cb3bSSergio Gonzalez Monroy <= ctx->options->total_ops) ? 265f6cefe25SPablo de Lara ctx->options->max_burst_size : 266df52cb3bSSergio Gonzalez Monroy ctx->options->total_ops - 267df52cb3bSSergio Gonzalez Monroy ops_enqd_total; 268df52cb3bSSergio Gonzalez Monroy 269df52cb3bSSergio Gonzalez Monroy uint16_t ops_needed = burst_size - ops_unused; 270df52cb3bSSergio Gonzalez Monroy 271bf9d6702SPablo de Lara /* Allocate objects containing crypto operations and mbufs */ 272bf9d6702SPablo de Lara if (rte_mempool_get_bulk(ctx->pool, (void **)ops, 273bf9d6702SPablo de Lara ops_needed) != 0) { 27415b4beabSPablo de Lara RTE_LOG(ERR, USER1, 27515b4beabSPablo de Lara "Failed to allocate more crypto operations " 2768f87ba70SThierry Herbelot "from the crypto operation pool.\n" 27715b4beabSPablo de Lara "Consider increasing the pool size " 27815b4beabSPablo de Lara "with --pool-sz\n"); 279df52cb3bSSergio Gonzalez Monroy return -1; 28015b4beabSPablo de Lara } 281df52cb3bSSergio Gonzalez Monroy 282df52cb3bSSergio Gonzalez Monroy /* Setup crypto op, attach mbuf etc */ 283bf9d6702SPablo de Lara (ctx->populate_ops)(ops, ctx->src_buf_offset, 284bf9d6702SPablo de Lara ctx->dst_buf_offset, 285df52cb3bSSergio Gonzalez Monroy ops_needed, ctx->sess, ctx->options, 28628dde5daSAkhil Goyal ctx->test_vector, iv_offset, &imix_idx, NULL); 287df52cb3bSSergio Gonzalez Monroy 2885b2b0a74SPablo de Lara /* Populate the mbuf with the test vector, for verification */ 2895b2b0a74SPablo de Lara for (i = 0; i < ops_needed; i++) 2905b2b0a74SPablo de Lara cperf_mbuf_set(ops[i]->sym->m_src, 2915b2b0a74SPablo de Lara ctx->options, 2925b2b0a74SPablo de Lara ctx->test_vector); 2935b2b0a74SPablo de Lara 294df52cb3bSSergio Gonzalez Monroy #ifdef CPERF_LINEARIZATION_ENABLE 295df52cb3bSSergio Gonzalez Monroy if (linearize) { 296df52cb3bSSergio Gonzalez Monroy /* PMD doesn't support scatter-gather and source buffer 297df52cb3bSSergio Gonzalez Monroy * is segmented. 298df52cb3bSSergio Gonzalez Monroy * We need to linearize it before enqueuing. 299df52cb3bSSergio Gonzalez Monroy */ 300df52cb3bSSergio Gonzalez Monroy for (i = 0; i < burst_size; i++) 301df52cb3bSSergio Gonzalez Monroy rte_pktmbuf_linearize(ops[i]->sym->m_src); 302df52cb3bSSergio Gonzalez Monroy } 303df52cb3bSSergio Gonzalez Monroy #endif /* CPERF_LINEARIZATION_ENABLE */ 304df52cb3bSSergio Gonzalez Monroy 30574d7c028SSuanming Mou /** 30674d7c028SSuanming Mou * When ops_needed is smaller than ops_enqd, the 30774d7c028SSuanming Mou * unused ops need to be moved to the front for 30874d7c028SSuanming Mou * next round use. 30974d7c028SSuanming Mou */ 31074d7c028SSuanming Mou if (unlikely(ops_enqd > ops_needed)) { 31174d7c028SSuanming Mou size_t nb_b_to_mov = ops_unused * sizeof(struct rte_crypto_op *); 31274d7c028SSuanming Mou 31374d7c028SSuanming Mou memmove(&ops[ops_needed], &ops[ops_enqd], nb_b_to_mov); 31474d7c028SSuanming Mou } 31574d7c028SSuanming Mou 316df52cb3bSSergio Gonzalez Monroy /* Enqueue burst of ops on crypto device */ 317df52cb3bSSergio Gonzalez Monroy ops_enqd = rte_cryptodev_enqueue_burst(ctx->dev_id, ctx->qp_id, 318df52cb3bSSergio Gonzalez Monroy ops, burst_size); 319df52cb3bSSergio Gonzalez Monroy if (ops_enqd < burst_size) 320df52cb3bSSergio Gonzalez Monroy ops_enqd_failed++; 321df52cb3bSSergio Gonzalez Monroy 322df52cb3bSSergio Gonzalez Monroy /** 323df52cb3bSSergio Gonzalez Monroy * Calculate number of ops not enqueued (mainly for hw 324df52cb3bSSergio Gonzalez Monroy * accelerators whose ingress queue can fill up). 325df52cb3bSSergio Gonzalez Monroy */ 326df52cb3bSSergio Gonzalez Monroy ops_unused = burst_size - ops_enqd; 327df52cb3bSSergio Gonzalez Monroy ops_enqd_total += ops_enqd; 328df52cb3bSSergio Gonzalez Monroy 329df52cb3bSSergio Gonzalez Monroy 330df52cb3bSSergio Gonzalez Monroy /* Dequeue processed burst of ops from crypto device */ 331df52cb3bSSergio Gonzalez Monroy ops_deqd = rte_cryptodev_dequeue_burst(ctx->dev_id, ctx->qp_id, 332f6cefe25SPablo de Lara ops_processed, ctx->options->max_burst_size); 333df52cb3bSSergio Gonzalez Monroy 334df52cb3bSSergio Gonzalez Monroy if (ops_deqd == 0) { 335df52cb3bSSergio Gonzalez Monroy /** 336df52cb3bSSergio Gonzalez Monroy * Count dequeue polls which didn't return any 337df52cb3bSSergio Gonzalez Monroy * processed operations. This statistic is mainly 338df52cb3bSSergio Gonzalez Monroy * relevant to hw accelerators. 339df52cb3bSSergio Gonzalez Monroy */ 340df52cb3bSSergio Gonzalez Monroy ops_deqd_failed++; 341df52cb3bSSergio Gonzalez Monroy continue; 342df52cb3bSSergio Gonzalez Monroy } 343df52cb3bSSergio Gonzalez Monroy 344df52cb3bSSergio Gonzalez Monroy for (i = 0; i < ops_deqd; i++) { 345df52cb3bSSergio Gonzalez Monroy if (cperf_verify_op(ops_processed[i], ctx->options, 346df52cb3bSSergio Gonzalez Monroy ctx->test_vector)) 347da40ebd6SPablo de Lara ops_failed++; 348df52cb3bSSergio Gonzalez Monroy } 349bf9d6702SPablo de Lara /* Free crypto ops so they can be reused. */ 350bf9d6702SPablo de Lara rte_mempool_put_bulk(ctx->pool, 351bf9d6702SPablo de Lara (void **)ops_processed, ops_deqd); 352da40ebd6SPablo de Lara ops_deqd_total += ops_deqd; 353df52cb3bSSergio Gonzalez Monroy } 354df52cb3bSSergio Gonzalez Monroy 355df52cb3bSSergio Gonzalez Monroy /* Dequeue any operations still in the crypto device */ 356df52cb3bSSergio Gonzalez Monroy 357df52cb3bSSergio Gonzalez Monroy while (ops_deqd_total < ctx->options->total_ops) { 358df52cb3bSSergio Gonzalez Monroy /* Sending 0 length burst to flush sw crypto device */ 359df52cb3bSSergio Gonzalez Monroy rte_cryptodev_enqueue_burst(ctx->dev_id, ctx->qp_id, NULL, 0); 360df52cb3bSSergio Gonzalez Monroy 361df52cb3bSSergio Gonzalez Monroy /* dequeue burst */ 362df52cb3bSSergio Gonzalez Monroy ops_deqd = rte_cryptodev_dequeue_burst(ctx->dev_id, ctx->qp_id, 363f6cefe25SPablo de Lara ops_processed, ctx->options->max_burst_size); 364df52cb3bSSergio Gonzalez Monroy if (ops_deqd == 0) { 365df52cb3bSSergio Gonzalez Monroy ops_deqd_failed++; 366df52cb3bSSergio Gonzalez Monroy continue; 367df52cb3bSSergio Gonzalez Monroy } 368df52cb3bSSergio Gonzalez Monroy 369df52cb3bSSergio Gonzalez Monroy for (i = 0; i < ops_deqd; i++) { 370df52cb3bSSergio Gonzalez Monroy if (cperf_verify_op(ops_processed[i], ctx->options, 371df52cb3bSSergio Gonzalez Monroy ctx->test_vector)) 372da40ebd6SPablo de Lara ops_failed++; 373da40ebd6SPablo de Lara } 374bf9d6702SPablo de Lara /* Free crypto ops so they can be reused. */ 375bf9d6702SPablo de Lara rte_mempool_put_bulk(ctx->pool, 376bf9d6702SPablo de Lara (void **)ops_processed, ops_deqd); 377df52cb3bSSergio Gonzalez Monroy ops_deqd_total += ops_deqd; 378df52cb3bSSergio Gonzalez Monroy } 379da40ebd6SPablo de Lara 38045f838d6SJoyce Kong uint16_t exp = 0; 381da40ebd6SPablo de Lara if (!ctx->options->csv) { 382b6a7e685STyler Retzlaff if (rte_atomic_compare_exchange_strong_explicit(&display_once, &exp, 1, 383b6a7e685STyler Retzlaff rte_memory_order_relaxed, rte_memory_order_relaxed)) 384da40ebd6SPablo de Lara printf("%12s%12s%12s%12s%12s%12s%12s%12s\n\n", 385da40ebd6SPablo de Lara "lcore id", "Buf Size", "Burst size", 386da40ebd6SPablo de Lara "Enqueued", "Dequeued", "Failed Enq", 387da40ebd6SPablo de Lara "Failed Deq", "Failed Ops"); 388da40ebd6SPablo de Lara 389da40ebd6SPablo de Lara printf("%12u%12u%12u%12"PRIu64"%12"PRIu64"%12"PRIu64 390da40ebd6SPablo de Lara "%12"PRIu64"%12"PRIu64"\n", 391da40ebd6SPablo de Lara ctx->lcore_id, 392f6cefe25SPablo de Lara ctx->options->max_buffer_size, 393f6cefe25SPablo de Lara ctx->options->max_burst_size, 394da40ebd6SPablo de Lara ops_enqd_total, 395da40ebd6SPablo de Lara ops_deqd_total, 396da40ebd6SPablo de Lara ops_enqd_failed, 397da40ebd6SPablo de Lara ops_deqd_failed, 398da40ebd6SPablo de Lara ops_failed); 399da40ebd6SPablo de Lara } else { 400b6a7e685STyler Retzlaff if (rte_atomic_compare_exchange_strong_explicit(&display_once, &exp, 1, 401b6a7e685STyler Retzlaff rte_memory_order_relaxed, rte_memory_order_relaxed)) 402da40ebd6SPablo de Lara printf("\n# lcore id, Buffer Size(B), " 403da40ebd6SPablo de Lara "Burst Size,Enqueued,Dequeued,Failed Enq," 404da40ebd6SPablo de Lara "Failed Deq,Failed Ops\n"); 405da40ebd6SPablo de Lara 406c6ddab87SCiara Power printf("%10u,%10u,%u,%"PRIu64",%"PRIu64",%"PRIu64",%"PRIu64"," 407da40ebd6SPablo de Lara "%"PRIu64"\n", 408da40ebd6SPablo de Lara ctx->lcore_id, 409f6cefe25SPablo de Lara ctx->options->max_buffer_size, 410f6cefe25SPablo de Lara ctx->options->max_burst_size, 411da40ebd6SPablo de Lara ops_enqd_total, 412da40ebd6SPablo de Lara ops_deqd_total, 413da40ebd6SPablo de Lara ops_enqd_failed, 414da40ebd6SPablo de Lara ops_deqd_failed, 415da40ebd6SPablo de Lara ops_failed); 416df52cb3bSSergio Gonzalez Monroy } 417df52cb3bSSergio Gonzalez Monroy 418df52cb3bSSergio Gonzalez Monroy return 0; 419df52cb3bSSergio Gonzalez Monroy } 420df52cb3bSSergio Gonzalez Monroy 421df52cb3bSSergio Gonzalez Monroy 422df52cb3bSSergio Gonzalez Monroy 423df52cb3bSSergio Gonzalez Monroy void 424df52cb3bSSergio Gonzalez Monroy cperf_verify_test_destructor(void *arg) 425df52cb3bSSergio Gonzalez Monroy { 426df52cb3bSSergio Gonzalez Monroy struct cperf_verify_ctx *ctx = arg; 427df52cb3bSSergio Gonzalez Monroy 428df52cb3bSSergio Gonzalez Monroy if (ctx == NULL) 429df52cb3bSSergio Gonzalez Monroy return; 430df52cb3bSSergio Gonzalez Monroy 431253624f4SPablo de Lara cperf_verify_test_free(ctx); 432df52cb3bSSergio Gonzalez Monroy } 433