xref: /dpdk/app/test-crypto-perf/cperf_test_verify.c (revision 76a48d8ac0928d1a0afbd9f7abfe1d2d9f6d9aaf)
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