xref: /dpdk/app/test-crypto-perf/cperf_test_latency.c (revision 76a48d8ac0928d1a0afbd9f7abfe1d2d9f6d9aaf)
1174a1631SBruce Richardson /* SPDX-License-Identifier: BSD-3-Clause
2174a1631SBruce Richardson  * Copyright(c) 2016-2017 Intel Corporation
3f8be1786SSlawomir Mrozowicz  */
4f8be1786SSlawomir Mrozowicz #include <rte_malloc.h>
5f8be1786SSlawomir Mrozowicz #include <rte_cycles.h>
6f8be1786SSlawomir Mrozowicz #include <rte_crypto.h>
7f8be1786SSlawomir Mrozowicz #include <rte_cryptodev.h>
8f8be1786SSlawomir Mrozowicz 
9f8be1786SSlawomir Mrozowicz #include "cperf_test_latency.h"
10f8be1786SSlawomir Mrozowicz #include "cperf_ops.h"
11253624f4SPablo de Lara #include "cperf_test_common.h"
12f8be1786SSlawomir Mrozowicz 
13f8be1786SSlawomir Mrozowicz struct cperf_op_result {
14f8be1786SSlawomir Mrozowicz 	uint64_t tsc_start;
15f8be1786SSlawomir Mrozowicz 	uint64_t tsc_end;
16f8be1786SSlawomir Mrozowicz 	enum rte_crypto_op_status status;
17f8be1786SSlawomir Mrozowicz };
18f8be1786SSlawomir Mrozowicz 
19f8be1786SSlawomir Mrozowicz struct cperf_latency_ctx {
20f8be1786SSlawomir Mrozowicz 	uint8_t dev_id;
21f8be1786SSlawomir Mrozowicz 	uint16_t qp_id;
22f8be1786SSlawomir Mrozowicz 	uint8_t lcore_id;
23f8be1786SSlawomir Mrozowicz 
24bf9d6702SPablo de Lara 	struct rte_mempool *pool;
25f8be1786SSlawomir Mrozowicz 
262a440d6aSAkhil Goyal 	void *sess;
27*76a48d8aSJack Bond-Preston 	uint8_t sess_owner;
28f8be1786SSlawomir Mrozowicz 
29f8be1786SSlawomir Mrozowicz 	cperf_populate_ops_t populate_ops;
30f8be1786SSlawomir Mrozowicz 
31bf9d6702SPablo de Lara 	uint32_t src_buf_offset;
32bf9d6702SPablo de Lara 	uint32_t dst_buf_offset;
33bf9d6702SPablo de Lara 
34f8be1786SSlawomir Mrozowicz 	const struct cperf_options *options;
35f8be1786SSlawomir Mrozowicz 	const struct cperf_test_vector *test_vector;
36f8be1786SSlawomir Mrozowicz 	struct cperf_op_result *res;
37f8be1786SSlawomir Mrozowicz };
38f8be1786SSlawomir Mrozowicz 
39b1f6192bSPablo de Lara struct priv_op_data {
40b1f6192bSPablo de Lara 	struct cperf_op_result *result;
41b1f6192bSPablo de Lara };
42b1f6192bSPablo de Lara 
43f8be1786SSlawomir Mrozowicz static void
44253624f4SPablo de Lara cperf_latency_test_free(struct cperf_latency_ctx *ctx)
45f8be1786SSlawomir Mrozowicz {
46c5b531d6SAnoob Joseph 	if (ctx == NULL)
47c5b531d6SAnoob Joseph 		return;
48c5b531d6SAnoob Joseph 
49*76a48d8aSJack Bond-Preston 	if (ctx->sess != NULL && ctx->sess_owner) {
5071fa6e3fSGowrishankar Muthukrishnan 		if (cperf_is_asym_test(ctx->options))
51c5b531d6SAnoob Joseph 			rte_cryptodev_asym_session_free(ctx->dev_id, ctx->sess);
52c5b531d6SAnoob Joseph #ifdef RTE_LIB_SECURITY
53c5b531d6SAnoob Joseph 		else if (ctx->options->op_type == CPERF_PDCP ||
54c5b531d6SAnoob Joseph 			 ctx->options->op_type == CPERF_DOCSIS ||
559afa7a46SAkhil Goyal 			 ctx->options->op_type == CPERF_TLS ||
56c5b531d6SAnoob Joseph 			 ctx->options->op_type == CPERF_IPSEC) {
5779bdb787SAkhil Goyal 			void *sec_ctx = rte_cryptodev_get_sec_ctx(ctx->dev_id);
58c5b531d6SAnoob Joseph 			rte_security_session_destroy(sec_ctx, ctx->sess);
59c5b531d6SAnoob Joseph 		}
60c5b531d6SAnoob Joseph #endif
61c5b531d6SAnoob Joseph 		else
62bdce2564SAkhil Goyal 			rte_cryptodev_sym_session_free(ctx->dev_id, ctx->sess);
63c5b531d6SAnoob Joseph 	}
64f8be1786SSlawomir Mrozowicz 
65bf9d6702SPablo de Lara 	rte_mempool_free(ctx->pool);
66f8be1786SSlawomir Mrozowicz 	rte_free(ctx->res);
67f8be1786SSlawomir Mrozowicz 	rte_free(ctx);
68f8be1786SSlawomir Mrozowicz }
69f8be1786SSlawomir Mrozowicz 
70f8be1786SSlawomir Mrozowicz void *
71b3bbd9e5SSlawomir Mrozowicz cperf_latency_test_constructor(struct rte_mempool *sess_mp,
72b3bbd9e5SSlawomir Mrozowicz 		uint8_t dev_id, uint16_t qp_id,
73f8be1786SSlawomir Mrozowicz 		const struct cperf_options *options,
74f8be1786SSlawomir Mrozowicz 		const struct cperf_test_vector *test_vector,
75*76a48d8aSJack Bond-Preston 		const struct cperf_op_fns *op_fns,
76*76a48d8aSJack Bond-Preston 		void **sess)
77f8be1786SSlawomir Mrozowicz {
78f8be1786SSlawomir Mrozowicz 	struct cperf_latency_ctx *ctx = NULL;
79253624f4SPablo de Lara 	size_t extra_op_priv_size = sizeof(struct priv_op_data);
80f8be1786SSlawomir Mrozowicz 
81f8be1786SSlawomir Mrozowicz 	ctx = rte_malloc(NULL, sizeof(struct cperf_latency_ctx), 0);
82f8be1786SSlawomir Mrozowicz 	if (ctx == NULL)
83f8be1786SSlawomir Mrozowicz 		goto err;
84f8be1786SSlawomir Mrozowicz 
85f8be1786SSlawomir Mrozowicz 	ctx->dev_id = dev_id;
86f8be1786SSlawomir Mrozowicz 	ctx->qp_id = qp_id;
87f8be1786SSlawomir Mrozowicz 
88f8be1786SSlawomir Mrozowicz 	ctx->populate_ops = op_fns->populate_ops;
89f8be1786SSlawomir Mrozowicz 	ctx->options = options;
90f8be1786SSlawomir Mrozowicz 	ctx->test_vector = test_vector;
91f8be1786SSlawomir Mrozowicz 
920fbd75a9SPablo de Lara 	/* IV goes at the end of the crypto operation */
930fbd75a9SPablo de Lara 	uint16_t iv_offset = sizeof(struct rte_crypto_op) +
940fbd75a9SPablo de Lara 		sizeof(struct rte_crypto_sym_op) +
950fbd75a9SPablo de Lara 		sizeof(struct cperf_op_result *);
960fbd75a9SPablo de Lara 
97*76a48d8aSJack Bond-Preston 
98*76a48d8aSJack Bond-Preston 	if (*sess != NULL) {
99*76a48d8aSJack Bond-Preston 		ctx->sess = *sess;
100*76a48d8aSJack Bond-Preston 		ctx->sess_owner = false;
101*76a48d8aSJack Bond-Preston 	} else {
102*76a48d8aSJack Bond-Preston 		ctx->sess = op_fns->sess_create(sess_mp, dev_id, options, test_vector,
103*76a48d8aSJack Bond-Preston 			iv_offset);
104f8be1786SSlawomir Mrozowicz 		if (ctx->sess == NULL)
105f8be1786SSlawomir Mrozowicz 			goto err;
106*76a48d8aSJack Bond-Preston 		*sess = ctx->sess;
107*76a48d8aSJack Bond-Preston 		ctx->sess_owner = true;
108*76a48d8aSJack Bond-Preston 	}
109f8be1786SSlawomir Mrozowicz 
110c4f916e3SPablo de Lara 	if (cperf_alloc_common_memory(options, test_vector, dev_id, qp_id,
111253624f4SPablo de Lara 			extra_op_priv_size,
112bf9d6702SPablo de Lara 			&ctx->src_buf_offset, &ctx->dst_buf_offset,
113bf9d6702SPablo de Lara 			&ctx->pool) < 0)
114f8be1786SSlawomir Mrozowicz 		goto err;
115f8be1786SSlawomir Mrozowicz 
116f8be1786SSlawomir Mrozowicz 	ctx->res = rte_malloc(NULL, sizeof(struct cperf_op_result) *
117f8be1786SSlawomir Mrozowicz 			ctx->options->total_ops, 0);
118f8be1786SSlawomir Mrozowicz 
119f8be1786SSlawomir Mrozowicz 	if (ctx->res == NULL)
120f8be1786SSlawomir Mrozowicz 		goto err;
121f8be1786SSlawomir Mrozowicz 
122f8be1786SSlawomir Mrozowicz 	return ctx;
123f8be1786SSlawomir Mrozowicz err:
124253624f4SPablo de Lara 	cperf_latency_test_free(ctx);
125f8be1786SSlawomir Mrozowicz 
126f8be1786SSlawomir Mrozowicz 	return NULL;
127f8be1786SSlawomir Mrozowicz }
128f8be1786SSlawomir Mrozowicz 
129b1f6192bSPablo de Lara static inline void
130b1f6192bSPablo de Lara store_timestamp(struct rte_crypto_op *op, uint64_t timestamp)
131b1f6192bSPablo de Lara {
132b1f6192bSPablo de Lara 	struct priv_op_data *priv_data;
133b1f6192bSPablo de Lara 
134022f9bf9SGowrishankar Muthukrishnan 	if (op->type == RTE_CRYPTO_OP_TYPE_SYMMETRIC)
135b1f6192bSPablo de Lara 		priv_data = (struct priv_op_data *) (op->sym + 1);
136022f9bf9SGowrishankar Muthukrishnan 	else
137022f9bf9SGowrishankar Muthukrishnan 		priv_data = (struct priv_op_data *) (op->asym + 1);
138022f9bf9SGowrishankar Muthukrishnan 
139b1f6192bSPablo de Lara 	priv_data->result->status = op->status;
140b1f6192bSPablo de Lara 	priv_data->result->tsc_end = timestamp;
141b1f6192bSPablo de Lara }
142b1f6192bSPablo de Lara 
143f8be1786SSlawomir Mrozowicz int
144f8be1786SSlawomir Mrozowicz cperf_latency_test_runner(void *arg)
145f8be1786SSlawomir Mrozowicz {
146f8be1786SSlawomir Mrozowicz 	struct cperf_latency_ctx *ctx = arg;
147f6cefe25SPablo de Lara 	uint16_t test_burst_size;
148f6cefe25SPablo de Lara 	uint8_t burst_size_idx = 0;
14927c2e747SPablo de Lara 	uint32_t imix_idx = 0;
150f9adb427SAnoob Joseph 	int ret = 0;
151f8be1786SSlawomir Mrozowicz 
152b6a7e685STyler Retzlaff 	static RTE_ATOMIC(uint16_t) display_once;
153da40ebd6SPablo de Lara 
154f8be1786SSlawomir Mrozowicz 	if (ctx == NULL)
155f8be1786SSlawomir Mrozowicz 		return 0;
156f8be1786SSlawomir Mrozowicz 
157f6cefe25SPablo de Lara 	struct rte_crypto_op *ops[ctx->options->max_burst_size];
158f6cefe25SPablo de Lara 	struct rte_crypto_op *ops_processed[ctx->options->max_burst_size];
159da40ebd6SPablo de Lara 	uint64_t i;
160b1f6192bSPablo de Lara 	struct priv_op_data *priv_data;
161f8be1786SSlawomir Mrozowicz 
162f8be1786SSlawomir Mrozowicz 	uint32_t lcore = rte_lcore_id();
163f8be1786SSlawomir Mrozowicz 
164f8be1786SSlawomir Mrozowicz #ifdef CPERF_LINEARIZATION_ENABLE
165f8be1786SSlawomir Mrozowicz 	struct rte_cryptodev_info dev_info;
166f8be1786SSlawomir Mrozowicz 	int linearize = 0;
167f8be1786SSlawomir Mrozowicz 
168f8be1786SSlawomir Mrozowicz 	/* Check if source mbufs require coalescing */
169083de3ebSPablo de Lara 	if (ctx->options->segment_sz < ctx->options->max_buffer_size) {
170f8be1786SSlawomir Mrozowicz 		rte_cryptodev_info_get(ctx->dev_id, &dev_info);
171f8be1786SSlawomir Mrozowicz 		if ((dev_info.feature_flags &
172f8be1786SSlawomir Mrozowicz 				RTE_CRYPTODEV_FF_MBUF_SCATTER_GATHER) == 0)
173f8be1786SSlawomir Mrozowicz 			linearize = 1;
174f8be1786SSlawomir Mrozowicz 	}
175f8be1786SSlawomir Mrozowicz #endif /* CPERF_LINEARIZATION_ENABLE */
176f8be1786SSlawomir Mrozowicz 
177f8be1786SSlawomir Mrozowicz 	ctx->lcore_id = lcore;
178f8be1786SSlawomir Mrozowicz 
179f8be1786SSlawomir Mrozowicz 	/* Warm up the host CPU before starting the test */
180f8be1786SSlawomir Mrozowicz 	for (i = 0; i < ctx->options->total_ops; i++)
181f8be1786SSlawomir Mrozowicz 		rte_cryptodev_enqueue_burst(ctx->dev_id, ctx->qp_id, NULL, 0);
182f8be1786SSlawomir Mrozowicz 
183f6cefe25SPablo de Lara 	/* Get first size from range or list */
184f6cefe25SPablo de Lara 	if (ctx->options->inc_burst_size != 0)
185f6cefe25SPablo de Lara 		test_burst_size = ctx->options->min_burst_size;
186f6cefe25SPablo de Lara 	else
187f6cefe25SPablo de Lara 		test_burst_size = ctx->options->burst_size_list[0];
188f6cefe25SPablo de Lara 
189f8b7fdd3SPablo de Lara 	uint16_t iv_offset = sizeof(struct rte_crypto_op) +
190f8b7fdd3SPablo de Lara 		sizeof(struct rte_crypto_sym_op) +
191f8b7fdd3SPablo de Lara 		sizeof(struct cperf_op_result *);
192f8b7fdd3SPablo de Lara 
193f6cefe25SPablo de Lara 	while (test_burst_size <= ctx->options->max_burst_size) {
194da40ebd6SPablo de Lara 		uint64_t ops_enqd = 0, ops_deqd = 0;
195bf9d6702SPablo de Lara 		uint64_t b_idx = 0;
196f8be1786SSlawomir Mrozowicz 
197da40ebd6SPablo de Lara 		uint64_t tsc_val, tsc_end, tsc_start;
198da40ebd6SPablo de Lara 		uint64_t tsc_max = 0, tsc_min = ~0UL, tsc_tot = 0, tsc_idx = 0;
199da40ebd6SPablo de Lara 		uint64_t enqd_max = 0, enqd_min = ~0UL, enqd_tot = 0;
200da40ebd6SPablo de Lara 		uint64_t deqd_max = 0, deqd_min = ~0UL, deqd_tot = 0;
201da40ebd6SPablo de Lara 
202da40ebd6SPablo de Lara 		while (enqd_tot < ctx->options->total_ops) {
203f6cefe25SPablo de Lara 
204f6cefe25SPablo de Lara 			uint16_t burst_size = ((enqd_tot + test_burst_size)
205f8be1786SSlawomir Mrozowicz 					<= ctx->options->total_ops) ?
206f6cefe25SPablo de Lara 							test_burst_size :
207f8be1786SSlawomir Mrozowicz 							ctx->options->total_ops -
208f8be1786SSlawomir Mrozowicz 							enqd_tot;
209f8be1786SSlawomir Mrozowicz 
210bf9d6702SPablo de Lara 			/* Allocate objects containing crypto operations and mbufs */
211bf9d6702SPablo de Lara 			if (rte_mempool_get_bulk(ctx->pool, (void **)ops,
212bf9d6702SPablo de Lara 						burst_size) != 0) {
21315b4beabSPablo de Lara 				RTE_LOG(ERR, USER1,
21415b4beabSPablo de Lara 					"Failed to allocate more crypto operations "
2158f87ba70SThierry Herbelot 					"from the crypto operation pool.\n"
21615b4beabSPablo de Lara 					"Consider increasing the pool size "
21715b4beabSPablo de Lara 					"with --pool-sz\n");
218f8be1786SSlawomir Mrozowicz 				return -1;
21915b4beabSPablo de Lara 			}
220f8be1786SSlawomir Mrozowicz 
221f8be1786SSlawomir Mrozowicz 			/* Setup crypto op, attach mbuf etc */
222bf9d6702SPablo de Lara 			(ctx->populate_ops)(ops, ctx->src_buf_offset,
223bf9d6702SPablo de Lara 					ctx->dst_buf_offset,
2245d75fb09SSlawomir Mrozowicz 					burst_size, ctx->sess, ctx->options,
22527c2e747SPablo de Lara 					ctx->test_vector, iv_offset,
226fa609d94SAnoob Joseph 					&imix_idx, &tsc_start);
227f8be1786SSlawomir Mrozowicz 
22814864c42SArchana Muniganti 			/* Populate the mbuf with the test vector */
22971fa6e3fSGowrishankar Muthukrishnan 			if (!cperf_is_asym_test(ctx->options))
23014864c42SArchana Muniganti 				for (i = 0; i < burst_size; i++)
23114864c42SArchana Muniganti 					cperf_mbuf_set(ops[i]->sym->m_src,
23214864c42SArchana Muniganti 						ctx->options,
23314864c42SArchana Muniganti 						ctx->test_vector);
23414864c42SArchana Muniganti 
235f8be1786SSlawomir Mrozowicz 			tsc_start = rte_rdtsc_precise();
236f8be1786SSlawomir Mrozowicz 
237f8be1786SSlawomir Mrozowicz #ifdef CPERF_LINEARIZATION_ENABLE
238f8be1786SSlawomir Mrozowicz 			if (linearize) {
239f8be1786SSlawomir Mrozowicz 				/* PMD doesn't support scatter-gather and source buffer
240f8be1786SSlawomir Mrozowicz 				 * is segmented.
241f8be1786SSlawomir Mrozowicz 				 * We need to linearize it before enqueuing.
242f8be1786SSlawomir Mrozowicz 				 */
243f8be1786SSlawomir Mrozowicz 				for (i = 0; i < burst_size; i++)
244f8be1786SSlawomir Mrozowicz 					rte_pktmbuf_linearize(ops[i]->sym->m_src);
245f8be1786SSlawomir Mrozowicz 			}
246f8be1786SSlawomir Mrozowicz #endif /* CPERF_LINEARIZATION_ENABLE */
247f8be1786SSlawomir Mrozowicz 
248f8be1786SSlawomir Mrozowicz 			/* Enqueue burst of ops on crypto device */
249f8be1786SSlawomir Mrozowicz 			ops_enqd = rte_cryptodev_enqueue_burst(ctx->dev_id, ctx->qp_id,
250f8be1786SSlawomir Mrozowicz 					ops, burst_size);
251f8be1786SSlawomir Mrozowicz 
252f8be1786SSlawomir Mrozowicz 			/* Dequeue processed burst of ops from crypto device */
253f8be1786SSlawomir Mrozowicz 			ops_deqd = rte_cryptodev_dequeue_burst(ctx->dev_id, ctx->qp_id,
254f6cefe25SPablo de Lara 					ops_processed, test_burst_size);
255f8be1786SSlawomir Mrozowicz 
256f8be1786SSlawomir Mrozowicz 			tsc_end = rte_rdtsc_precise();
257f8be1786SSlawomir Mrozowicz 
2585d75fb09SSlawomir Mrozowicz 			/* Free memory for not enqueued operations */
25915b55dd7SSergio Gonzalez Monroy 			if (ops_enqd != burst_size)
260bf9d6702SPablo de Lara 				rte_mempool_put_bulk(ctx->pool,
26161bec362SPablo de Lara 						(void **)&ops[ops_enqd],
26215b55dd7SSergio Gonzalez Monroy 						burst_size - ops_enqd);
263f8be1786SSlawomir Mrozowicz 
2641e1d4fb7SPablo de Lara 			for (i = 0; i < ops_enqd; i++) {
265f6cefe25SPablo de Lara 				ctx->res[tsc_idx].tsc_start = tsc_start;
266b1f6192bSPablo de Lara 				/*
267b1f6192bSPablo de Lara 				 * Private data structure starts after the end of the
268022f9bf9SGowrishankar Muthukrishnan 				 * rte_crypto_sym_op (or rte_crypto_asym_op) structure.
269b1f6192bSPablo de Lara 				 */
270022f9bf9SGowrishankar Muthukrishnan 				if (ops[i]->type == RTE_CRYPTO_OP_TYPE_SYMMETRIC)
271b1f6192bSPablo de Lara 					priv_data = (struct priv_op_data *) (ops[i]->sym + 1);
272022f9bf9SGowrishankar Muthukrishnan 				else
273022f9bf9SGowrishankar Muthukrishnan 					priv_data = (struct priv_op_data *) (ops[i]->asym + 1);
274022f9bf9SGowrishankar Muthukrishnan 
275b1f6192bSPablo de Lara 				priv_data->result = (void *)&ctx->res[tsc_idx];
276f6cefe25SPablo de Lara 				tsc_idx++;
277f6cefe25SPablo de Lara 			}
278f6cefe25SPablo de Lara 
279f8be1786SSlawomir Mrozowicz 			if (likely(ops_deqd))  {
280f9adb427SAnoob Joseph 				for (i = 0; i < ops_deqd; i++) {
281f9adb427SAnoob Joseph 					struct rte_crypto_op *op = ops_processed[i];
282b1f6192bSPablo de Lara 
283f9adb427SAnoob Joseph 					if (op->status != RTE_CRYPTO_OP_STATUS_SUCCESS)
284f9adb427SAnoob Joseph 						ret = -1;
285f9adb427SAnoob Joseph 
286f9adb427SAnoob Joseph 					store_timestamp(ops_processed[i], tsc_end);
287f9adb427SAnoob Joseph 				}
288f9adb427SAnoob Joseph 
289f9adb427SAnoob Joseph 				/* Free crypto ops so they can be reused. */
290bf9d6702SPablo de Lara 				rte_mempool_put_bulk(ctx->pool,
29115b55dd7SSergio Gonzalez Monroy 						(void **)ops_processed, ops_deqd);
292f8be1786SSlawomir Mrozowicz 
293f8be1786SSlawomir Mrozowicz 				deqd_tot += ops_deqd;
2948aca7abdSThomas Monjalon 				deqd_max = RTE_MAX(ops_deqd, deqd_max);
2958aca7abdSThomas Monjalon 				deqd_min = RTE_MIN(ops_deqd, deqd_min);
296f8be1786SSlawomir Mrozowicz 			}
297f8be1786SSlawomir Mrozowicz 
298f8be1786SSlawomir Mrozowicz 			enqd_tot += ops_enqd;
2998aca7abdSThomas Monjalon 			enqd_max = RTE_MAX(ops_enqd, enqd_max);
3008aca7abdSThomas Monjalon 			enqd_min = RTE_MIN(ops_enqd, enqd_min);
301f8be1786SSlawomir Mrozowicz 
302f8be1786SSlawomir Mrozowicz 			b_idx++;
303f8be1786SSlawomir Mrozowicz 		}
304f8be1786SSlawomir Mrozowicz 
305f8be1786SSlawomir Mrozowicz 		/* Dequeue any operations still in the crypto device */
306f8be1786SSlawomir Mrozowicz 		while (deqd_tot < ctx->options->total_ops) {
307f8be1786SSlawomir Mrozowicz 			/* Sending 0 length burst to flush sw crypto device */
308f8be1786SSlawomir Mrozowicz 			rte_cryptodev_enqueue_burst(ctx->dev_id, ctx->qp_id, NULL, 0);
309f8be1786SSlawomir Mrozowicz 
310f8be1786SSlawomir Mrozowicz 			/* dequeue burst */
311f8be1786SSlawomir Mrozowicz 			ops_deqd = rte_cryptodev_dequeue_burst(ctx->dev_id, ctx->qp_id,
312f6cefe25SPablo de Lara 					ops_processed, test_burst_size);
313f8be1786SSlawomir Mrozowicz 
314f8be1786SSlawomir Mrozowicz 			tsc_end = rte_rdtsc_precise();
315f8be1786SSlawomir Mrozowicz 
316f8be1786SSlawomir Mrozowicz 			if (ops_deqd != 0) {
317f9adb427SAnoob Joseph 				for (i = 0; i < ops_deqd; i++) {
318f9adb427SAnoob Joseph 					struct rte_crypto_op *op = ops_processed[i];
319f9adb427SAnoob Joseph 
320f9adb427SAnoob Joseph 					if (op->status != RTE_CRYPTO_OP_STATUS_SUCCESS)
321f9adb427SAnoob Joseph 						ret = -1;
322f9adb427SAnoob Joseph 
323b1f6192bSPablo de Lara 					store_timestamp(ops_processed[i], tsc_end);
324f9adb427SAnoob Joseph 				}
325b1f6192bSPablo de Lara 
326bf9d6702SPablo de Lara 				rte_mempool_put_bulk(ctx->pool,
32715b55dd7SSergio Gonzalez Monroy 						(void **)ops_processed, ops_deqd);
328f8be1786SSlawomir Mrozowicz 
329f8be1786SSlawomir Mrozowicz 				deqd_tot += ops_deqd;
3308aca7abdSThomas Monjalon 				deqd_max = RTE_MAX(ops_deqd, deqd_max);
3318aca7abdSThomas Monjalon 				deqd_min = RTE_MIN(ops_deqd, deqd_min);
332f8be1786SSlawomir Mrozowicz 			}
333f8be1786SSlawomir Mrozowicz 		}
334f8be1786SSlawomir Mrozowicz 
335f9adb427SAnoob Joseph 		/* If there was any failure in crypto op, exit */
336f9adb427SAnoob Joseph 		if (ret)
337f9adb427SAnoob Joseph 			return ret;
338f9adb427SAnoob Joseph 
339f8be1786SSlawomir Mrozowicz 		for (i = 0; i < tsc_idx; i++) {
340f8be1786SSlawomir Mrozowicz 			tsc_val = ctx->res[i].tsc_end - ctx->res[i].tsc_start;
3418aca7abdSThomas Monjalon 			tsc_max = RTE_MAX(tsc_val, tsc_max);
3428aca7abdSThomas Monjalon 			tsc_min = RTE_MIN(tsc_val, tsc_min);
343f8be1786SSlawomir Mrozowicz 			tsc_tot += tsc_val;
344f8be1786SSlawomir Mrozowicz 		}
345f8be1786SSlawomir Mrozowicz 
346da40ebd6SPablo de Lara 		double time_tot, time_avg, time_max, time_min;
347f8be1786SSlawomir Mrozowicz 
348f8be1786SSlawomir Mrozowicz 		const uint64_t tunit = 1000000; /* us */
349f8be1786SSlawomir Mrozowicz 		const uint64_t tsc_hz = rte_get_tsc_hz();
350f8be1786SSlawomir Mrozowicz 
351da40ebd6SPablo de Lara 		uint64_t enqd_avg = enqd_tot / b_idx;
352da40ebd6SPablo de Lara 		uint64_t deqd_avg = deqd_tot / b_idx;
353da40ebd6SPablo de Lara 		uint64_t tsc_avg = tsc_tot / tsc_idx;
354f8be1786SSlawomir Mrozowicz 
355da40ebd6SPablo de Lara 		time_tot = tunit*(double)(tsc_tot) / tsc_hz;
356da40ebd6SPablo de Lara 		time_avg = tunit*(double)(tsc_avg) / tsc_hz;
357da40ebd6SPablo de Lara 		time_max = tunit*(double)(tsc_max) / tsc_hz;
358da40ebd6SPablo de Lara 		time_min = tunit*(double)(tsc_min) / tsc_hz;
359f8be1786SSlawomir Mrozowicz 
36045f838d6SJoyce Kong 		uint16_t exp = 0;
361f8be1786SSlawomir Mrozowicz 		if (ctx->options->csv) {
362b6a7e685STyler Retzlaff 			if (rte_atomic_compare_exchange_strong_explicit(&display_once, &exp, 1,
363b6a7e685STyler Retzlaff 					rte_memory_order_relaxed, rte_memory_order_relaxed))
364da40ebd6SPablo de Lara 				printf("\n# lcore, Buffer Size, Burst Size, Pakt Seq #, "
3652f04e824SCiara Power 						"cycles, time (us)");
366f8be1786SSlawomir Mrozowicz 
367f8be1786SSlawomir Mrozowicz 			for (i = 0; i < ctx->options->total_ops; i++) {
368f8be1786SSlawomir Mrozowicz 
369c6ddab87SCiara Power 				printf("\n%u,%u,%u,%"PRIu64",%"PRIu64",%.3f",
370f6cefe25SPablo de Lara 					ctx->lcore_id, ctx->options->test_buffer_size,
371f6cefe25SPablo de Lara 					test_burst_size, i + 1,
372f8be1786SSlawomir Mrozowicz 					ctx->res[i].tsc_end - ctx->res[i].tsc_start,
373f8be1786SSlawomir Mrozowicz 					tunit * (double) (ctx->res[i].tsc_end
374f8be1786SSlawomir Mrozowicz 							- ctx->res[i].tsc_start)
375f8be1786SSlawomir Mrozowicz 						/ tsc_hz);
376f8be1786SSlawomir Mrozowicz 
377f8be1786SSlawomir Mrozowicz 			}
378f8be1786SSlawomir Mrozowicz 		} else {
379f8be1786SSlawomir Mrozowicz 			printf("\n# Device %d on lcore %u\n", ctx->dev_id,
380f8be1786SSlawomir Mrozowicz 				ctx->lcore_id);
381f8be1786SSlawomir Mrozowicz 			printf("\n# total operations: %u", ctx->options->total_ops);
382f6cefe25SPablo de Lara 			printf("\n# Buffer size: %u", ctx->options->test_buffer_size);
383f6cefe25SPablo de Lara 			printf("\n# Burst size: %u", test_burst_size);
384da40ebd6SPablo de Lara 			printf("\n#     Number of bursts: %"PRIu64,
385da40ebd6SPablo de Lara 					b_idx);
386da40ebd6SPablo de Lara 
387f8be1786SSlawomir Mrozowicz 			printf("\n#");
388da40ebd6SPablo de Lara 			printf("\n#          \t       Total\t   Average\t   "
389da40ebd6SPablo de Lara 					"Maximum\t   Minimum");
390da40ebd6SPablo de Lara 			printf("\n#  enqueued\t%12"PRIu64"\t%10"PRIu64"\t"
391da40ebd6SPablo de Lara 					"%10"PRIu64"\t%10"PRIu64, enqd_tot,
392da40ebd6SPablo de Lara 					enqd_avg, enqd_max, enqd_min);
393da40ebd6SPablo de Lara 			printf("\n#  dequeued\t%12"PRIu64"\t%10"PRIu64"\t"
394da40ebd6SPablo de Lara 					"%10"PRIu64"\t%10"PRIu64, deqd_tot,
395da40ebd6SPablo de Lara 					deqd_avg, deqd_max, deqd_min);
396da40ebd6SPablo de Lara 			printf("\n#    cycles\t%12"PRIu64"\t%10"PRIu64"\t"
397da40ebd6SPablo de Lara 					"%10"PRIu64"\t%10"PRIu64, tsc_tot,
398da40ebd6SPablo de Lara 					tsc_avg, tsc_max, tsc_min);
399da40ebd6SPablo de Lara 			printf("\n# time [us]\t%12.0f\t%10.3f\t%10.3f\t%10.3f",
400da40ebd6SPablo de Lara 					time_tot, time_avg, time_max, time_min);
401f8be1786SSlawomir Mrozowicz 			printf("\n\n");
402f8be1786SSlawomir Mrozowicz 
403f8be1786SSlawomir Mrozowicz 		}
404da40ebd6SPablo de Lara 
405f6cefe25SPablo de Lara 		/* Get next size from range or list */
406f6cefe25SPablo de Lara 		if (ctx->options->inc_burst_size != 0)
407f6cefe25SPablo de Lara 			test_burst_size += ctx->options->inc_burst_size;
408f6cefe25SPablo de Lara 		else {
409f6cefe25SPablo de Lara 			if (++burst_size_idx == ctx->options->burst_size_count)
410f6cefe25SPablo de Lara 				break;
411f6cefe25SPablo de Lara 			test_burst_size =
412f6cefe25SPablo de Lara 				ctx->options->burst_size_list[burst_size_idx];
413f6cefe25SPablo de Lara 		}
414f6cefe25SPablo de Lara 	}
415f6cefe25SPablo de Lara 
416da40ebd6SPablo de Lara 	return 0;
417da40ebd6SPablo de Lara }
418da40ebd6SPablo de Lara 
419da40ebd6SPablo de Lara void
420da40ebd6SPablo de Lara cperf_latency_test_destructor(void *arg)
421da40ebd6SPablo de Lara {
422da40ebd6SPablo de Lara 	struct cperf_latency_ctx *ctx = arg;
423da40ebd6SPablo de Lara 
424da40ebd6SPablo de Lara 	if (ctx == NULL)
425da40ebd6SPablo de Lara 		return;
426da40ebd6SPablo de Lara 
427253624f4SPablo de Lara 	cperf_latency_test_free(ctx);
428f8be1786SSlawomir Mrozowicz }
429