xref: /dpdk/app/test-eventdev/test_perf_common.c (revision bdce2564dbf78e1fecc0db438b562ae19f0c057c)
153a3b7e8SJerin Jacob /* SPDX-License-Identifier: BSD-3-Clause
253a3b7e8SJerin Jacob  * Copyright(c) 2017 Cavium, Inc
3ffbae86fSJerin Jacob  */
4ffbae86fSJerin Jacob 
5626b12a8SPavan Nikhilesh #include <math.h>
6626b12a8SPavan Nikhilesh 
7ffbae86fSJerin Jacob #include "test_perf_common.h"
8ffbae86fSJerin Jacob 
9f3a67078SVolodymyr Fialko #define NB_CRYPTODEV_DESCRIPTORS 1024
108f5b5495SAkhil Goyal #define DATA_SIZE		512
118f5b5495SAkhil Goyal struct modex_test_data {
128f5b5495SAkhil Goyal 	enum rte_crypto_asym_xform_type xform_type;
138f5b5495SAkhil Goyal 	struct {
148f5b5495SAkhil Goyal 		uint8_t data[DATA_SIZE];
158f5b5495SAkhil Goyal 		uint16_t len;
168f5b5495SAkhil Goyal 	} base;
178f5b5495SAkhil Goyal 	struct {
188f5b5495SAkhil Goyal 		uint8_t data[DATA_SIZE];
198f5b5495SAkhil Goyal 		uint16_t len;
208f5b5495SAkhil Goyal 	} exponent;
218f5b5495SAkhil Goyal 	struct {
228f5b5495SAkhil Goyal 		uint8_t data[DATA_SIZE];
238f5b5495SAkhil Goyal 		uint16_t len;
248f5b5495SAkhil Goyal 	} modulus;
258f5b5495SAkhil Goyal 	struct {
268f5b5495SAkhil Goyal 		uint8_t data[DATA_SIZE];
278f5b5495SAkhil Goyal 		uint16_t len;
288f5b5495SAkhil Goyal 	} reminder;
298f5b5495SAkhil Goyal 	uint16_t result_len;
308f5b5495SAkhil Goyal };
318f5b5495SAkhil Goyal 
328f5b5495SAkhil Goyal static struct
338f5b5495SAkhil Goyal modex_test_data modex_test_case = {
348f5b5495SAkhil Goyal 	.xform_type = RTE_CRYPTO_ASYM_XFORM_MODEX,
358f5b5495SAkhil Goyal 	.base = {
368f5b5495SAkhil Goyal 		.data = {
378f5b5495SAkhil Goyal 			0xF8, 0xBA, 0x1A, 0x55, 0xD0, 0x2F, 0x85,
388f5b5495SAkhil Goyal 			0xAE, 0x96, 0x7B, 0xB6, 0x2F, 0xB6, 0xCD,
398f5b5495SAkhil Goyal 			0xA8, 0xEB, 0x7E, 0x78, 0xA0, 0x50
408f5b5495SAkhil Goyal 		},
418f5b5495SAkhil Goyal 		.len = 20,
428f5b5495SAkhil Goyal 	},
438f5b5495SAkhil Goyal 	.exponent = {
448f5b5495SAkhil Goyal 		.data = {
458f5b5495SAkhil Goyal 			0x01, 0x00, 0x01
468f5b5495SAkhil Goyal 		},
478f5b5495SAkhil Goyal 		.len = 3,
488f5b5495SAkhil Goyal 	},
498f5b5495SAkhil Goyal 	.reminder = {
508f5b5495SAkhil Goyal 		.data = {
518f5b5495SAkhil Goyal 			0x2C, 0x60, 0x75, 0x45, 0x98, 0x9D, 0xE0, 0x72,
528f5b5495SAkhil Goyal 			0xA0, 0x9D, 0x3A, 0x9E, 0x03, 0x38, 0x73, 0x3C,
538f5b5495SAkhil Goyal 			0x31, 0x83, 0x04, 0xFE, 0x75, 0x43, 0xE6, 0x17,
548f5b5495SAkhil Goyal 			0x5C, 0x01, 0x29, 0x51, 0x69, 0x33, 0x62, 0x2D,
558f5b5495SAkhil Goyal 			0x78, 0xBE, 0xAE, 0xC4, 0xBC, 0xDE, 0x7E, 0x2C,
568f5b5495SAkhil Goyal 			0x77, 0x84, 0xF2, 0xC5, 0x14, 0xB5, 0x2F, 0xF7,
578f5b5495SAkhil Goyal 			0xC5, 0x94, 0xEF, 0x86, 0x75, 0x75, 0xB5, 0x11,
588f5b5495SAkhil Goyal 			0xE5, 0x0E, 0x0A, 0x29, 0x76, 0xE2, 0xEA, 0x32,
598f5b5495SAkhil Goyal 			0x0E, 0x43, 0x77, 0x7E, 0x2C, 0x27, 0xAC, 0x3B,
608f5b5495SAkhil Goyal 			0x86, 0xA5, 0xDB, 0xC9, 0x48, 0x40, 0xE8, 0x99,
618f5b5495SAkhil Goyal 			0x9A, 0x0A, 0x3D, 0xD6, 0x74, 0xFA, 0x2E, 0x2E,
628f5b5495SAkhil Goyal 			0x5B, 0xAF, 0x8C, 0x99, 0x44, 0x2A, 0x67, 0x38,
638f5b5495SAkhil Goyal 			0x27, 0x41, 0x59, 0x9D, 0xB8, 0x51, 0xC9, 0xF7,
648f5b5495SAkhil Goyal 			0x43, 0x61, 0x31, 0x6E, 0xF1, 0x25, 0x38, 0x7F,
658f5b5495SAkhil Goyal 			0xAE, 0xC6, 0xD0, 0xBB, 0x29, 0x76, 0x3F, 0x46,
668f5b5495SAkhil Goyal 			0x2E, 0x1B, 0xE4, 0x67, 0x71, 0xE3, 0x87, 0x5A
678f5b5495SAkhil Goyal 		},
688f5b5495SAkhil Goyal 		.len = 128,
698f5b5495SAkhil Goyal 	},
708f5b5495SAkhil Goyal 	.modulus = {
718f5b5495SAkhil Goyal 		.data = {
728f5b5495SAkhil Goyal 			0xb3, 0xa1, 0xaf, 0xb7, 0x13, 0x08, 0x00, 0x0a,
738f5b5495SAkhil Goyal 			0x35, 0xdc, 0x2b, 0x20, 0x8d, 0xa1, 0xb5, 0xce,
748f5b5495SAkhil Goyal 			0x47, 0x8a, 0xc3, 0x80, 0xf4, 0x7d, 0x4a, 0xa2,
758f5b5495SAkhil Goyal 			0x62, 0xfd, 0x61, 0x7f, 0xb5, 0xa8, 0xde, 0x0a,
768f5b5495SAkhil Goyal 			0x17, 0x97, 0xa0, 0xbf, 0xdf, 0x56, 0x5a, 0x3d,
778f5b5495SAkhil Goyal 			0x51, 0x56, 0x4f, 0x70, 0x70, 0x3f, 0x63, 0x6a,
788f5b5495SAkhil Goyal 			0x44, 0x5b, 0xad, 0x84, 0x0d, 0x3f, 0x27, 0x6e,
798f5b5495SAkhil Goyal 			0x3b, 0x34, 0x91, 0x60, 0x14, 0xb9, 0xaa, 0x72,
808f5b5495SAkhil Goyal 			0xfd, 0xa3, 0x64, 0xd2, 0x03, 0xa7, 0x53, 0x87,
818f5b5495SAkhil Goyal 			0x9e, 0x88, 0x0b, 0xc1, 0x14, 0x93, 0x1a, 0x62,
828f5b5495SAkhil Goyal 			0xff, 0xb1, 0x5d, 0x74, 0xcd, 0x59, 0x63, 0x18,
838f5b5495SAkhil Goyal 			0x11, 0x3d, 0x4f, 0xba, 0x75, 0xd4, 0x33, 0x4e,
848f5b5495SAkhil Goyal 			0x23, 0x6b, 0x7b, 0x57, 0x44, 0xe1, 0xd3, 0x03,
858f5b5495SAkhil Goyal 			0x13, 0xa6, 0xf0, 0x8b, 0x60, 0xb0, 0x9e, 0xee,
868f5b5495SAkhil Goyal 			0x75, 0x08, 0x9d, 0x71, 0x63, 0x13, 0xcb, 0xa6,
878f5b5495SAkhil Goyal 			0x81, 0x92, 0x14, 0x03, 0x22, 0x2d, 0xde, 0x55
888f5b5495SAkhil Goyal 		},
898f5b5495SAkhil Goyal 		.len = 128,
908f5b5495SAkhil Goyal 	},
918f5b5495SAkhil Goyal 	.result_len = 128,
928f5b5495SAkhil Goyal };
93de2bc16eSShijith Thotton 
9441c219e6SJerin Jacob int
9541c219e6SJerin Jacob perf_test_result(struct evt_test *test, struct evt_options *opt)
9641c219e6SJerin Jacob {
9741c219e6SJerin Jacob 	RTE_SET_USED(opt);
986b1a14a8SPavan Nikhilesh 	int i;
996b1a14a8SPavan Nikhilesh 	uint64_t total = 0;
10041c219e6SJerin Jacob 	struct test_perf *t = evt_test_priv(test);
10141c219e6SJerin Jacob 
1026b1a14a8SPavan Nikhilesh 	printf("Packet distribution across worker cores :\n");
1036b1a14a8SPavan Nikhilesh 	for (i = 0; i < t->nb_workers; i++)
1046b1a14a8SPavan Nikhilesh 		total += t->worker[i].processed_pkts;
1056b1a14a8SPavan Nikhilesh 	for (i = 0; i < t->nb_workers; i++)
1066b1a14a8SPavan Nikhilesh 		printf("Worker %d packets: "CLGRN"%"PRIx64" "CLNRM"percentage:"
107c0900d33SHarry van Haaren 				CLGRN" %3.2f"CLNRM"\n", i,
1086b1a14a8SPavan Nikhilesh 				t->worker[i].processed_pkts,
1096b1a14a8SPavan Nikhilesh 				(((double)t->worker[i].processed_pkts)/total)
1106b1a14a8SPavan Nikhilesh 				* 100);
1116b1a14a8SPavan Nikhilesh 
11241c219e6SJerin Jacob 	return t->result;
11341c219e6SJerin Jacob }
11441c219e6SJerin Jacob 
1159d3aeb18SJerin Jacob static inline int
1169d3aeb18SJerin Jacob perf_producer(void *arg)
1179d3aeb18SJerin Jacob {
1189a618803SPavan Nikhilesh 	int i;
1199d3aeb18SJerin Jacob 	struct prod_data *p  = arg;
1209d3aeb18SJerin Jacob 	struct test_perf *t = p->t;
1219d3aeb18SJerin Jacob 	struct evt_options *opt = t->opt;
1229d3aeb18SJerin Jacob 	const uint8_t dev_id = p->dev_id;
1239d3aeb18SJerin Jacob 	const uint8_t port = p->port_id;
1249d3aeb18SJerin Jacob 	struct rte_mempool *pool = t->pool;
1259d3aeb18SJerin Jacob 	const uint64_t nb_pkts = t->nb_pkts;
1269d3aeb18SJerin Jacob 	const uint32_t nb_flows = t->nb_flows;
1279d3aeb18SJerin Jacob 	uint32_t flow_counter = 0;
1289d3aeb18SJerin Jacob 	uint64_t count = 0;
1299a618803SPavan Nikhilesh 	struct perf_elt *m[BURST_SIZE + 1] = {NULL};
1309d3aeb18SJerin Jacob 	struct rte_event ev;
1319d3aeb18SJerin Jacob 
1329d3aeb18SJerin Jacob 	if (opt->verbose_level > 1)
1339d3aeb18SJerin Jacob 		printf("%s(): lcore %d dev_id %d port=%d queue %d\n", __func__,
1349d3aeb18SJerin Jacob 				rte_lcore_id(), dev_id, port, p->queue_id);
1359d3aeb18SJerin Jacob 
1369d3aeb18SJerin Jacob 	ev.event = 0;
1379d3aeb18SJerin Jacob 	ev.op = RTE_EVENT_OP_NEW;
1389d3aeb18SJerin Jacob 	ev.queue_id = p->queue_id;
1399d3aeb18SJerin Jacob 	ev.sched_type = t->opt->sched_type_list[0];
1409d3aeb18SJerin Jacob 	ev.priority = RTE_EVENT_DEV_PRIORITY_NORMAL;
1419d3aeb18SJerin Jacob 	ev.event_type =  RTE_EVENT_TYPE_CPU;
1429d3aeb18SJerin Jacob 	ev.sub_event_type = 0; /* stage 0 */
1439d3aeb18SJerin Jacob 
1449d3aeb18SJerin Jacob 	while (count < nb_pkts && t->done == false) {
1459a618803SPavan Nikhilesh 		if (rte_mempool_get_bulk(pool, (void **)m, BURST_SIZE) < 0)
1469d3aeb18SJerin Jacob 			continue;
1479a618803SPavan Nikhilesh 		for (i = 0; i < BURST_SIZE; i++) {
1489d3aeb18SJerin Jacob 			ev.flow_id = flow_counter++ % nb_flows;
1499a618803SPavan Nikhilesh 			ev.event_ptr = m[i];
1509a618803SPavan Nikhilesh 			m[i]->timestamp = rte_get_timer_cycles();
1519a618803SPavan Nikhilesh 			while (rte_event_enqueue_burst(dev_id,
1529a618803SPavan Nikhilesh 						       port, &ev, 1) != 1) {
1539d3aeb18SJerin Jacob 				if (t->done)
1549d3aeb18SJerin Jacob 					break;
1559d3aeb18SJerin Jacob 				rte_pause();
1569a618803SPavan Nikhilesh 				m[i]->timestamp = rte_get_timer_cycles();
1579d3aeb18SJerin Jacob 			}
1589a618803SPavan Nikhilesh 		}
1599a618803SPavan Nikhilesh 		count += BURST_SIZE;
1609d3aeb18SJerin Jacob 	}
1619d3aeb18SJerin Jacob 
1629d3aeb18SJerin Jacob 	return 0;
1639d3aeb18SJerin Jacob }
1649d3aeb18SJerin Jacob 
165d008f20bSPavan Nikhilesh static inline int
16620841a25SRashmi Shetty perf_producer_burst(void *arg)
16720841a25SRashmi Shetty {
16820841a25SRashmi Shetty 	uint32_t i;
16920841a25SRashmi Shetty 	uint64_t timestamp;
17020841a25SRashmi Shetty 	struct rte_event_dev_info dev_info;
17120841a25SRashmi Shetty 	struct prod_data *p  = arg;
17220841a25SRashmi Shetty 	struct test_perf *t = p->t;
17320841a25SRashmi Shetty 	struct evt_options *opt = t->opt;
17420841a25SRashmi Shetty 	const uint8_t dev_id = p->dev_id;
17520841a25SRashmi Shetty 	const uint8_t port = p->port_id;
17620841a25SRashmi Shetty 	struct rte_mempool *pool = t->pool;
17720841a25SRashmi Shetty 	const uint64_t nb_pkts = t->nb_pkts;
17820841a25SRashmi Shetty 	const uint32_t nb_flows = t->nb_flows;
17920841a25SRashmi Shetty 	uint32_t flow_counter = 0;
18020841a25SRashmi Shetty 	uint16_t enq = 0;
18120841a25SRashmi Shetty 	uint64_t count = 0;
18220841a25SRashmi Shetty 	struct perf_elt *m[MAX_PROD_ENQ_BURST_SIZE + 1];
18320841a25SRashmi Shetty 	struct rte_event ev[MAX_PROD_ENQ_BURST_SIZE + 1];
18420841a25SRashmi Shetty 	uint32_t burst_size = opt->prod_enq_burst_sz;
18520841a25SRashmi Shetty 
18620841a25SRashmi Shetty 	memset(m, 0, sizeof(*m) * (MAX_PROD_ENQ_BURST_SIZE + 1));
18720841a25SRashmi Shetty 	rte_event_dev_info_get(dev_id, &dev_info);
18820841a25SRashmi Shetty 	if (dev_info.max_event_port_enqueue_depth < burst_size)
18920841a25SRashmi Shetty 		burst_size = dev_info.max_event_port_enqueue_depth;
19020841a25SRashmi Shetty 
19120841a25SRashmi Shetty 	if (opt->verbose_level > 1)
19220841a25SRashmi Shetty 		printf("%s(): lcore %d dev_id %d port=%d queue %d\n", __func__,
19320841a25SRashmi Shetty 				rte_lcore_id(), dev_id, port, p->queue_id);
19420841a25SRashmi Shetty 
19520841a25SRashmi Shetty 	for (i = 0; i < burst_size; i++) {
19620841a25SRashmi Shetty 		ev[i].op = RTE_EVENT_OP_NEW;
19720841a25SRashmi Shetty 		ev[i].queue_id = p->queue_id;
19820841a25SRashmi Shetty 		ev[i].sched_type = t->opt->sched_type_list[0];
19920841a25SRashmi Shetty 		ev[i].priority = RTE_EVENT_DEV_PRIORITY_NORMAL;
20020841a25SRashmi Shetty 		ev[i].event_type =  RTE_EVENT_TYPE_CPU;
20120841a25SRashmi Shetty 		ev[i].sub_event_type = 0; /* stage 0 */
20220841a25SRashmi Shetty 	}
20320841a25SRashmi Shetty 
20420841a25SRashmi Shetty 	while (count < nb_pkts && t->done == false) {
20520841a25SRashmi Shetty 		if (rte_mempool_get_bulk(pool, (void **)m, burst_size) < 0)
20620841a25SRashmi Shetty 			continue;
20720841a25SRashmi Shetty 		timestamp = rte_get_timer_cycles();
20820841a25SRashmi Shetty 		for (i = 0; i < burst_size; i++) {
20920841a25SRashmi Shetty 			ev[i].flow_id = flow_counter++ % nb_flows;
21020841a25SRashmi Shetty 			ev[i].event_ptr = m[i];
21120841a25SRashmi Shetty 			m[i]->timestamp = timestamp;
21220841a25SRashmi Shetty 		}
21320841a25SRashmi Shetty 		enq = rte_event_enqueue_burst(dev_id, port, ev, burst_size);
21420841a25SRashmi Shetty 		while (enq < burst_size) {
21520841a25SRashmi Shetty 			enq += rte_event_enqueue_burst(dev_id, port,
21620841a25SRashmi Shetty 							ev + enq,
21720841a25SRashmi Shetty 							burst_size - enq);
21820841a25SRashmi Shetty 			if (t->done)
21920841a25SRashmi Shetty 				break;
22020841a25SRashmi Shetty 			rte_pause();
22120841a25SRashmi Shetty 			timestamp = rte_get_timer_cycles();
22220841a25SRashmi Shetty 			for (i = enq; i < burst_size; i++)
22320841a25SRashmi Shetty 				m[i]->timestamp = timestamp;
22420841a25SRashmi Shetty 		}
22520841a25SRashmi Shetty 		count += burst_size;
22620841a25SRashmi Shetty 	}
22720841a25SRashmi Shetty 	return 0;
22820841a25SRashmi Shetty }
22920841a25SRashmi Shetty 
23020841a25SRashmi Shetty static inline int
231d008f20bSPavan Nikhilesh perf_event_timer_producer(void *arg)
232d008f20bSPavan Nikhilesh {
2339a618803SPavan Nikhilesh 	int i;
234d008f20bSPavan Nikhilesh 	struct prod_data *p  = arg;
235d008f20bSPavan Nikhilesh 	struct test_perf *t = p->t;
236d008f20bSPavan Nikhilesh 	struct evt_options *opt = t->opt;
237d008f20bSPavan Nikhilesh 	uint32_t flow_counter = 0;
238d008f20bSPavan Nikhilesh 	uint64_t count = 0;
239d008f20bSPavan Nikhilesh 	uint64_t arm_latency = 0;
240d008f20bSPavan Nikhilesh 	const uint8_t nb_timer_adptrs = opt->nb_timer_adptrs;
241d008f20bSPavan Nikhilesh 	const uint32_t nb_flows = t->nb_flows;
242d008f20bSPavan Nikhilesh 	const uint64_t nb_timers = opt->nb_timers;
243d008f20bSPavan Nikhilesh 	struct rte_mempool *pool = t->pool;
2449a618803SPavan Nikhilesh 	struct perf_elt *m[BURST_SIZE + 1] = {NULL};
245d008f20bSPavan Nikhilesh 	struct rte_event_timer_adapter **adptr = t->timer_adptr;
24652553263SPavan Nikhilesh 	struct rte_event_timer tim;
247d008f20bSPavan Nikhilesh 	uint64_t timeout_ticks = opt->expiry_nsec / opt->timer_tick_nsec;
248d008f20bSPavan Nikhilesh 
24952553263SPavan Nikhilesh 	memset(&tim, 0, sizeof(struct rte_event_timer));
250626b12a8SPavan Nikhilesh 	timeout_ticks =
251626b12a8SPavan Nikhilesh 		opt->optm_timer_tick_nsec
252626b12a8SPavan Nikhilesh 			? ceil((double)(timeout_ticks * opt->timer_tick_nsec) /
253626b12a8SPavan Nikhilesh 			       opt->optm_timer_tick_nsec)
254626b12a8SPavan Nikhilesh 			: timeout_ticks;
255d008f20bSPavan Nikhilesh 	timeout_ticks += timeout_ticks ? 0 : 1;
25652553263SPavan Nikhilesh 	tim.ev.event_type = RTE_EVENT_TYPE_TIMER;
25752553263SPavan Nikhilesh 	tim.ev.op = RTE_EVENT_OP_NEW;
25852553263SPavan Nikhilesh 	tim.ev.sched_type = t->opt->sched_type_list[0];
25952553263SPavan Nikhilesh 	tim.ev.queue_id = p->queue_id;
26052553263SPavan Nikhilesh 	tim.ev.priority = RTE_EVENT_DEV_PRIORITY_NORMAL;
26152553263SPavan Nikhilesh 	tim.state = RTE_EVENT_TIMER_NOT_ARMED;
26252553263SPavan Nikhilesh 	tim.timeout_ticks = timeout_ticks;
263d008f20bSPavan Nikhilesh 
264d008f20bSPavan Nikhilesh 	if (opt->verbose_level > 1)
265d008f20bSPavan Nikhilesh 		printf("%s(): lcore %d\n", __func__, rte_lcore_id());
266d008f20bSPavan Nikhilesh 
267d008f20bSPavan Nikhilesh 	while (count < nb_timers && t->done == false) {
2689a618803SPavan Nikhilesh 		if (rte_mempool_get_bulk(pool, (void **)m, BURST_SIZE) < 0)
269d008f20bSPavan Nikhilesh 			continue;
2709a618803SPavan Nikhilesh 		for (i = 0; i < BURST_SIZE; i++) {
2719a618803SPavan Nikhilesh 			rte_prefetch0(m[i + 1]);
2729a618803SPavan Nikhilesh 			m[i]->tim = tim;
2739a618803SPavan Nikhilesh 			m[i]->tim.ev.flow_id = flow_counter++ % nb_flows;
2749a618803SPavan Nikhilesh 			m[i]->tim.ev.event_ptr = m[i];
2759a618803SPavan Nikhilesh 			m[i]->timestamp = rte_get_timer_cycles();
276d008f20bSPavan Nikhilesh 			while (rte_event_timer_arm_burst(
277d008f20bSPavan Nikhilesh 			       adptr[flow_counter % nb_timer_adptrs],
2789a618803SPavan Nikhilesh 			       (struct rte_event_timer **)&m[i], 1) != 1) {
279d008f20bSPavan Nikhilesh 				if (t->done)
280d008f20bSPavan Nikhilesh 					break;
2819a618803SPavan Nikhilesh 				m[i]->timestamp = rte_get_timer_cycles();
282d008f20bSPavan Nikhilesh 			}
2839a618803SPavan Nikhilesh 			arm_latency += rte_get_timer_cycles() - m[i]->timestamp;
2849a618803SPavan Nikhilesh 		}
2859a618803SPavan Nikhilesh 		count += BURST_SIZE;
286d008f20bSPavan Nikhilesh 	}
287d008f20bSPavan Nikhilesh 	fflush(stdout);
288d008f20bSPavan Nikhilesh 	rte_delay_ms(1000);
289d008f20bSPavan Nikhilesh 	printf("%s(): lcore %d Average event timer arm latency = %.3f us\n",
29093b7794bSPavan Nikhilesh 			__func__, rte_lcore_id(),
29193b7794bSPavan Nikhilesh 			count ? (float)(arm_latency / count) /
29293b7794bSPavan Nikhilesh 			(rte_get_timer_hz() / 1000000) : 0);
293d008f20bSPavan Nikhilesh 	return 0;
294d008f20bSPavan Nikhilesh }
295d008f20bSPavan Nikhilesh 
29617b22d0bSPavan Nikhilesh static inline int
29717b22d0bSPavan Nikhilesh perf_event_timer_producer_burst(void *arg)
29817b22d0bSPavan Nikhilesh {
29917b22d0bSPavan Nikhilesh 	int i;
30017b22d0bSPavan Nikhilesh 	struct prod_data *p  = arg;
30117b22d0bSPavan Nikhilesh 	struct test_perf *t = p->t;
30217b22d0bSPavan Nikhilesh 	struct evt_options *opt = t->opt;
30317b22d0bSPavan Nikhilesh 	uint32_t flow_counter = 0;
30417b22d0bSPavan Nikhilesh 	uint64_t count = 0;
30517b22d0bSPavan Nikhilesh 	uint64_t arm_latency = 0;
30617b22d0bSPavan Nikhilesh 	const uint8_t nb_timer_adptrs = opt->nb_timer_adptrs;
30717b22d0bSPavan Nikhilesh 	const uint32_t nb_flows = t->nb_flows;
30817b22d0bSPavan Nikhilesh 	const uint64_t nb_timers = opt->nb_timers;
30917b22d0bSPavan Nikhilesh 	struct rte_mempool *pool = t->pool;
31017b22d0bSPavan Nikhilesh 	struct perf_elt *m[BURST_SIZE + 1] = {NULL};
31117b22d0bSPavan Nikhilesh 	struct rte_event_timer_adapter **adptr = t->timer_adptr;
31252553263SPavan Nikhilesh 	struct rte_event_timer tim;
31317b22d0bSPavan Nikhilesh 	uint64_t timeout_ticks = opt->expiry_nsec / opt->timer_tick_nsec;
31417b22d0bSPavan Nikhilesh 
31552553263SPavan Nikhilesh 	memset(&tim, 0, sizeof(struct rte_event_timer));
316626b12a8SPavan Nikhilesh 	timeout_ticks =
317626b12a8SPavan Nikhilesh 		opt->optm_timer_tick_nsec
318626b12a8SPavan Nikhilesh 			? ceil((double)(timeout_ticks * opt->timer_tick_nsec) /
319626b12a8SPavan Nikhilesh 			       opt->optm_timer_tick_nsec)
320626b12a8SPavan Nikhilesh 			: timeout_ticks;
32117b22d0bSPavan Nikhilesh 	timeout_ticks += timeout_ticks ? 0 : 1;
32252553263SPavan Nikhilesh 	tim.ev.event_type = RTE_EVENT_TYPE_TIMER;
32352553263SPavan Nikhilesh 	tim.ev.op = RTE_EVENT_OP_NEW;
32452553263SPavan Nikhilesh 	tim.ev.sched_type = t->opt->sched_type_list[0];
32552553263SPavan Nikhilesh 	tim.ev.queue_id = p->queue_id;
32652553263SPavan Nikhilesh 	tim.ev.priority = RTE_EVENT_DEV_PRIORITY_NORMAL;
32752553263SPavan Nikhilesh 	tim.state = RTE_EVENT_TIMER_NOT_ARMED;
32852553263SPavan Nikhilesh 	tim.timeout_ticks = timeout_ticks;
32917b22d0bSPavan Nikhilesh 
33017b22d0bSPavan Nikhilesh 	if (opt->verbose_level > 1)
33117b22d0bSPavan Nikhilesh 		printf("%s(): lcore %d\n", __func__, rte_lcore_id());
33217b22d0bSPavan Nikhilesh 
33317b22d0bSPavan Nikhilesh 	while (count < nb_timers && t->done == false) {
33417b22d0bSPavan Nikhilesh 		if (rte_mempool_get_bulk(pool, (void **)m, BURST_SIZE) < 0)
33517b22d0bSPavan Nikhilesh 			continue;
33617b22d0bSPavan Nikhilesh 		for (i = 0; i < BURST_SIZE; i++) {
33717b22d0bSPavan Nikhilesh 			rte_prefetch0(m[i + 1]);
33817b22d0bSPavan Nikhilesh 			m[i]->tim = tim;
33917b22d0bSPavan Nikhilesh 			m[i]->tim.ev.flow_id = flow_counter++ % nb_flows;
34017b22d0bSPavan Nikhilesh 			m[i]->tim.ev.event_ptr = m[i];
34117b22d0bSPavan Nikhilesh 			m[i]->timestamp = rte_get_timer_cycles();
34217b22d0bSPavan Nikhilesh 		}
34317b22d0bSPavan Nikhilesh 		rte_event_timer_arm_tmo_tick_burst(
34417b22d0bSPavan Nikhilesh 				adptr[flow_counter % nb_timer_adptrs],
34517b22d0bSPavan Nikhilesh 				(struct rte_event_timer **)m,
34617b22d0bSPavan Nikhilesh 				tim.timeout_ticks,
34717b22d0bSPavan Nikhilesh 				BURST_SIZE);
34817b22d0bSPavan Nikhilesh 		arm_latency += rte_get_timer_cycles() - m[i - 1]->timestamp;
34917b22d0bSPavan Nikhilesh 		count += BURST_SIZE;
35017b22d0bSPavan Nikhilesh 	}
35117b22d0bSPavan Nikhilesh 	fflush(stdout);
35217b22d0bSPavan Nikhilesh 	rte_delay_ms(1000);
35317b22d0bSPavan Nikhilesh 	printf("%s(): lcore %d Average event timer arm latency = %.3f us\n",
35493b7794bSPavan Nikhilesh 			__func__, rte_lcore_id(),
35593b7794bSPavan Nikhilesh 			count ? (float)(arm_latency / count) /
35693b7794bSPavan Nikhilesh 			(rte_get_timer_hz() / 1000000) : 0);
35717b22d0bSPavan Nikhilesh 	return 0;
35817b22d0bSPavan Nikhilesh }
35917b22d0bSPavan Nikhilesh 
360de2bc16eSShijith Thotton static inline void
361de2bc16eSShijith Thotton crypto_adapter_enq_op_new(struct prod_data *p)
362de2bc16eSShijith Thotton {
363de2bc16eSShijith Thotton 	struct test_perf *t = p->t;
364de2bc16eSShijith Thotton 	const uint32_t nb_flows = t->nb_flows;
365de2bc16eSShijith Thotton 	const uint64_t nb_pkts = t->nb_pkts;
366de2bc16eSShijith Thotton 	struct rte_mempool *pool = t->pool;
367de2bc16eSShijith Thotton 	struct evt_options *opt = t->opt;
368de2bc16eSShijith Thotton 	uint16_t qp_id = p->ca.cdev_qp_id;
369de2bc16eSShijith Thotton 	uint8_t cdev_id = p->ca.cdev_id;
3703158ec9fSVolodymyr Fialko 	uint64_t alloc_failures = 0;
371de2bc16eSShijith Thotton 	uint32_t flow_counter = 0;
372de2bc16eSShijith Thotton 	struct rte_crypto_op *op;
373de2bc16eSShijith Thotton 	struct rte_mbuf *m;
374de2bc16eSShijith Thotton 	uint64_t count = 0;
375de2bc16eSShijith Thotton 	uint16_t len;
376de2bc16eSShijith Thotton 
377de2bc16eSShijith Thotton 	if (opt->verbose_level > 1)
378de2bc16eSShijith Thotton 		printf("%s(): lcore %d queue %d cdev_id %u cdev_qp_id %u\n",
379de2bc16eSShijith Thotton 		       __func__, rte_lcore_id(), p->queue_id, p->ca.cdev_id,
380de2bc16eSShijith Thotton 		       p->ca.cdev_qp_id);
381de2bc16eSShijith Thotton 
382de2bc16eSShijith Thotton 	len = opt->mbuf_sz ? opt->mbuf_sz : RTE_ETHER_MIN_LEN;
383de2bc16eSShijith Thotton 
384de2bc16eSShijith Thotton 	while (count < nb_pkts && t->done == false) {
3858f5b5495SAkhil Goyal 		if (opt->crypto_op_type == RTE_CRYPTO_OP_TYPE_SYMMETRIC) {
3868f5b5495SAkhil Goyal 			struct rte_crypto_sym_op *sym_op;
3878f5b5495SAkhil Goyal 
3888f5b5495SAkhil Goyal 			op = rte_crypto_op_alloc(t->ca_op_pool,
3898f5b5495SAkhil Goyal 					 RTE_CRYPTO_OP_TYPE_SYMMETRIC);
3903158ec9fSVolodymyr Fialko 			if (unlikely(op == NULL)) {
3913158ec9fSVolodymyr Fialko 				alloc_failures++;
392de2bc16eSShijith Thotton 				continue;
3933158ec9fSVolodymyr Fialko 			}
3943158ec9fSVolodymyr Fialko 
3953158ec9fSVolodymyr Fialko 			m = rte_pktmbuf_alloc(pool);
3963158ec9fSVolodymyr Fialko 			if (unlikely(m == NULL)) {
3973158ec9fSVolodymyr Fialko 				alloc_failures++;
3983158ec9fSVolodymyr Fialko 				rte_crypto_op_free(op);
3993158ec9fSVolodymyr Fialko 				continue;
4003158ec9fSVolodymyr Fialko 			}
401de2bc16eSShijith Thotton 
402de2bc16eSShijith Thotton 			rte_pktmbuf_append(m, len);
403de2bc16eSShijith Thotton 			sym_op = op->sym;
404de2bc16eSShijith Thotton 			sym_op->m_src = m;
405de2bc16eSShijith Thotton 			sym_op->cipher.data.offset = 0;
406de2bc16eSShijith Thotton 			sym_op->cipher.data.length = len;
407de2bc16eSShijith Thotton 			rte_crypto_op_attach_sym_session(
4088f5b5495SAkhil Goyal 				op, p->ca.crypto_sess[flow_counter++ % nb_flows]);
4098f5b5495SAkhil Goyal 		} else {
4108f5b5495SAkhil Goyal 			struct rte_crypto_asym_op *asym_op;
4118f5b5495SAkhil Goyal 			uint8_t *result = rte_zmalloc(NULL,
4128f5b5495SAkhil Goyal 					modex_test_case.result_len, 0);
413de2bc16eSShijith Thotton 
4148f5b5495SAkhil Goyal 			op = rte_crypto_op_alloc(t->ca_op_pool,
4158f5b5495SAkhil Goyal 					 RTE_CRYPTO_OP_TYPE_ASYMMETRIC);
4163158ec9fSVolodymyr Fialko 			if (unlikely(op == NULL)) {
4173158ec9fSVolodymyr Fialko 				alloc_failures++;
4183158ec9fSVolodymyr Fialko 				continue;
4193158ec9fSVolodymyr Fialko 			}
4203158ec9fSVolodymyr Fialko 
4218f5b5495SAkhil Goyal 			asym_op = op->asym;
4228f5b5495SAkhil Goyal 			asym_op->modex.base.data = modex_test_case.base.data;
4238f5b5495SAkhil Goyal 			asym_op->modex.base.length = modex_test_case.base.len;
4248f5b5495SAkhil Goyal 			asym_op->modex.result.data = result;
4258f5b5495SAkhil Goyal 			asym_op->modex.result.length = modex_test_case.result_len;
4268f5b5495SAkhil Goyal 			rte_crypto_op_attach_asym_session(
4278f5b5495SAkhil Goyal 				op, p->ca.crypto_sess[flow_counter++ % nb_flows]);
4288f5b5495SAkhil Goyal 		}
429de2bc16eSShijith Thotton 		while (rte_cryptodev_enqueue_burst(cdev_id, qp_id, &op, 1) != 1 &&
430de2bc16eSShijith Thotton 				t->done == false)
431de2bc16eSShijith Thotton 			rte_pause();
432de2bc16eSShijith Thotton 
433de2bc16eSShijith Thotton 		count++;
434de2bc16eSShijith Thotton 	}
4353158ec9fSVolodymyr Fialko 
4363158ec9fSVolodymyr Fialko 	if (opt->verbose_level > 1 && alloc_failures)
4373158ec9fSVolodymyr Fialko 		printf("%s(): lcore %d allocation failures: %"PRIu64"\n",
4383158ec9fSVolodymyr Fialko 		       __func__, rte_lcore_id(), alloc_failures);
439de2bc16eSShijith Thotton }
440de2bc16eSShijith Thotton 
441de2bc16eSShijith Thotton static inline void
442de2bc16eSShijith Thotton crypto_adapter_enq_op_fwd(struct prod_data *p)
443de2bc16eSShijith Thotton {
444de2bc16eSShijith Thotton 	const uint8_t dev_id = p->dev_id;
445de2bc16eSShijith Thotton 	const uint8_t port = p->port_id;
446de2bc16eSShijith Thotton 	struct test_perf *t = p->t;
447de2bc16eSShijith Thotton 	const uint32_t nb_flows = t->nb_flows;
448de2bc16eSShijith Thotton 	const uint64_t nb_pkts = t->nb_pkts;
449de2bc16eSShijith Thotton 	struct rte_mempool *pool = t->pool;
450de2bc16eSShijith Thotton 	struct evt_options *opt = t->opt;
4513158ec9fSVolodymyr Fialko 	uint64_t alloc_failures = 0;
452de2bc16eSShijith Thotton 	uint32_t flow_counter = 0;
453de2bc16eSShijith Thotton 	struct rte_crypto_op *op;
454de2bc16eSShijith Thotton 	struct rte_event ev;
455de2bc16eSShijith Thotton 	struct rte_mbuf *m;
456de2bc16eSShijith Thotton 	uint64_t count = 0;
457de2bc16eSShijith Thotton 	uint16_t len;
458de2bc16eSShijith Thotton 
459de2bc16eSShijith Thotton 	if (opt->verbose_level > 1)
460de2bc16eSShijith Thotton 		printf("%s(): lcore %d port %d queue %d cdev_id %u cdev_qp_id %u\n",
461de2bc16eSShijith Thotton 		       __func__, rte_lcore_id(), port, p->queue_id,
462de2bc16eSShijith Thotton 		       p->ca.cdev_id, p->ca.cdev_qp_id);
463de2bc16eSShijith Thotton 
464de2bc16eSShijith Thotton 	ev.event = 0;
465de2bc16eSShijith Thotton 	ev.op = RTE_EVENT_OP_NEW;
466de2bc16eSShijith Thotton 	ev.queue_id = p->queue_id;
467de2bc16eSShijith Thotton 	ev.sched_type = RTE_SCHED_TYPE_ATOMIC;
468de2bc16eSShijith Thotton 	ev.event_type = RTE_EVENT_TYPE_CPU;
469de2bc16eSShijith Thotton 	len = opt->mbuf_sz ? opt->mbuf_sz : RTE_ETHER_MIN_LEN;
470de2bc16eSShijith Thotton 
471de2bc16eSShijith Thotton 	while (count < nb_pkts && t->done == false) {
4728f5b5495SAkhil Goyal 		if (opt->crypto_op_type == RTE_CRYPTO_OP_TYPE_SYMMETRIC) {
4738f5b5495SAkhil Goyal 			struct rte_crypto_sym_op *sym_op;
4748f5b5495SAkhil Goyal 
4758f5b5495SAkhil Goyal 			op = rte_crypto_op_alloc(t->ca_op_pool,
4768f5b5495SAkhil Goyal 					 RTE_CRYPTO_OP_TYPE_SYMMETRIC);
4773158ec9fSVolodymyr Fialko 			if (unlikely(op == NULL)) {
4783158ec9fSVolodymyr Fialko 				alloc_failures++;
479de2bc16eSShijith Thotton 				continue;
4803158ec9fSVolodymyr Fialko 			}
4813158ec9fSVolodymyr Fialko 
4823158ec9fSVolodymyr Fialko 			m = rte_pktmbuf_alloc(pool);
4833158ec9fSVolodymyr Fialko 			if (unlikely(m == NULL)) {
4843158ec9fSVolodymyr Fialko 				alloc_failures++;
4853158ec9fSVolodymyr Fialko 				rte_crypto_op_free(op);
4863158ec9fSVolodymyr Fialko 				continue;
4873158ec9fSVolodymyr Fialko 			}
488de2bc16eSShijith Thotton 
489de2bc16eSShijith Thotton 			rte_pktmbuf_append(m, len);
490de2bc16eSShijith Thotton 			sym_op = op->sym;
491de2bc16eSShijith Thotton 			sym_op->m_src = m;
492de2bc16eSShijith Thotton 			sym_op->cipher.data.offset = 0;
493de2bc16eSShijith Thotton 			sym_op->cipher.data.length = len;
494de2bc16eSShijith Thotton 			rte_crypto_op_attach_sym_session(
4958f5b5495SAkhil Goyal 				op, p->ca.crypto_sess[flow_counter++ % nb_flows]);
4968f5b5495SAkhil Goyal 		} else {
4978f5b5495SAkhil Goyal 			struct rte_crypto_asym_op *asym_op;
4988f5b5495SAkhil Goyal 			uint8_t *result = rte_zmalloc(NULL,
4998f5b5495SAkhil Goyal 					modex_test_case.result_len, 0);
5008f5b5495SAkhil Goyal 
5018f5b5495SAkhil Goyal 			op = rte_crypto_op_alloc(t->ca_op_pool,
5028f5b5495SAkhil Goyal 					 RTE_CRYPTO_OP_TYPE_ASYMMETRIC);
5033158ec9fSVolodymyr Fialko 			if (unlikely(op == NULL)) {
5043158ec9fSVolodymyr Fialko 				alloc_failures++;
5053158ec9fSVolodymyr Fialko 				continue;
5063158ec9fSVolodymyr Fialko 			}
5073158ec9fSVolodymyr Fialko 
5088f5b5495SAkhil Goyal 			asym_op = op->asym;
5098f5b5495SAkhil Goyal 			asym_op->modex.base.data = modex_test_case.base.data;
5108f5b5495SAkhil Goyal 			asym_op->modex.base.length = modex_test_case.base.len;
5118f5b5495SAkhil Goyal 			asym_op->modex.result.data = result;
5128f5b5495SAkhil Goyal 			asym_op->modex.result.length = modex_test_case.result_len;
5138f5b5495SAkhil Goyal 			rte_crypto_op_attach_asym_session(
5148f5b5495SAkhil Goyal 				op, p->ca.crypto_sess[flow_counter++ % nb_flows]);
5158f5b5495SAkhil Goyal 		}
516de2bc16eSShijith Thotton 		ev.event_ptr = op;
517de2bc16eSShijith Thotton 
518de2bc16eSShijith Thotton 		while (rte_event_crypto_adapter_enqueue(dev_id, port, &ev, 1) != 1 &&
519de2bc16eSShijith Thotton 		       t->done == false)
520de2bc16eSShijith Thotton 			rte_pause();
521de2bc16eSShijith Thotton 
522de2bc16eSShijith Thotton 		count++;
523de2bc16eSShijith Thotton 	}
5243158ec9fSVolodymyr Fialko 
5253158ec9fSVolodymyr Fialko 	if (opt->verbose_level > 1 && alloc_failures)
5263158ec9fSVolodymyr Fialko 		printf("%s(): lcore %d allocation failures: %"PRIu64"\n",
5273158ec9fSVolodymyr Fialko 		       __func__, rte_lcore_id(), alloc_failures);
528de2bc16eSShijith Thotton }
529de2bc16eSShijith Thotton 
530de2bc16eSShijith Thotton static inline int
531de2bc16eSShijith Thotton perf_event_crypto_producer(void *arg)
532de2bc16eSShijith Thotton {
533de2bc16eSShijith Thotton 	struct prod_data *p = arg;
534de2bc16eSShijith Thotton 	struct evt_options *opt = p->t->opt;
535de2bc16eSShijith Thotton 
536de2bc16eSShijith Thotton 	if (opt->crypto_adptr_mode == RTE_EVENT_CRYPTO_ADAPTER_OP_NEW)
537de2bc16eSShijith Thotton 		crypto_adapter_enq_op_new(p);
538de2bc16eSShijith Thotton 	else
539de2bc16eSShijith Thotton 		crypto_adapter_enq_op_fwd(p);
540de2bc16eSShijith Thotton 
541de2bc16eSShijith Thotton 	return 0;
542de2bc16eSShijith Thotton }
543de2bc16eSShijith Thotton 
54459f697e3SPavan Nikhilesh static int
54559f697e3SPavan Nikhilesh perf_producer_wrapper(void *arg)
54659f697e3SPavan Nikhilesh {
54759f697e3SPavan Nikhilesh 	struct prod_data *p  = arg;
54859f697e3SPavan Nikhilesh 	struct test_perf *t = p->t;
54920841a25SRashmi Shetty 	bool burst = evt_has_burst_mode(p->dev_id);
55020841a25SRashmi Shetty 
55120841a25SRashmi Shetty 	/* In case of synthetic producer, launch perf_producer or
55220841a25SRashmi Shetty 	 * perf_producer_burst depending on producer enqueue burst size
55320841a25SRashmi Shetty 	 */
55420841a25SRashmi Shetty 	if (t->opt->prod_type == EVT_PROD_TYPE_SYNT &&
55520841a25SRashmi Shetty 			t->opt->prod_enq_burst_sz == 1)
55659f697e3SPavan Nikhilesh 		return perf_producer(arg);
55720841a25SRashmi Shetty 	else if (t->opt->prod_type == EVT_PROD_TYPE_SYNT &&
55820841a25SRashmi Shetty 			t->opt->prod_enq_burst_sz > 1) {
55920841a25SRashmi Shetty 		if (!burst)
56020841a25SRashmi Shetty 			evt_err("This event device does not support burst mode");
56120841a25SRashmi Shetty 		else
56220841a25SRashmi Shetty 			return perf_producer_burst(arg);
56320841a25SRashmi Shetty 	}
56417b22d0bSPavan Nikhilesh 	else if (t->opt->prod_type == EVT_PROD_TYPE_EVENT_TIMER_ADPTR &&
56517b22d0bSPavan Nikhilesh 			!t->opt->timdev_use_burst)
566d008f20bSPavan Nikhilesh 		return perf_event_timer_producer(arg);
56717b22d0bSPavan Nikhilesh 	else if (t->opt->prod_type == EVT_PROD_TYPE_EVENT_TIMER_ADPTR &&
56817b22d0bSPavan Nikhilesh 			t->opt->timdev_use_burst)
56917b22d0bSPavan Nikhilesh 		return perf_event_timer_producer_burst(arg);
570de2bc16eSShijith Thotton 	else if (t->opt->prod_type == EVT_PROD_TYPE_EVENT_CRYPTO_ADPTR)
571de2bc16eSShijith Thotton 		return perf_event_crypto_producer(arg);
57259f697e3SPavan Nikhilesh 	return 0;
57359f697e3SPavan Nikhilesh }
57459f697e3SPavan Nikhilesh 
5759d3aeb18SJerin Jacob static inline uint64_t
5769d3aeb18SJerin Jacob processed_pkts(struct test_perf *t)
5779d3aeb18SJerin Jacob {
5789d3aeb18SJerin Jacob 	uint8_t i;
5799d3aeb18SJerin Jacob 	uint64_t total = 0;
5809d3aeb18SJerin Jacob 
5819d3aeb18SJerin Jacob 	for (i = 0; i < t->nb_workers; i++)
5829d3aeb18SJerin Jacob 		total += t->worker[i].processed_pkts;
5839d3aeb18SJerin Jacob 
5849d3aeb18SJerin Jacob 	return total;
5859d3aeb18SJerin Jacob }
5869d3aeb18SJerin Jacob 
5879d3aeb18SJerin Jacob static inline uint64_t
5889d3aeb18SJerin Jacob total_latency(struct test_perf *t)
5899d3aeb18SJerin Jacob {
5909d3aeb18SJerin Jacob 	uint8_t i;
5919d3aeb18SJerin Jacob 	uint64_t total = 0;
5929d3aeb18SJerin Jacob 
5939d3aeb18SJerin Jacob 	for (i = 0; i < t->nb_workers; i++)
5949d3aeb18SJerin Jacob 		total += t->worker[i].latency;
5959d3aeb18SJerin Jacob 
5969d3aeb18SJerin Jacob 	return total;
5979d3aeb18SJerin Jacob }
5989d3aeb18SJerin Jacob 
5999d3aeb18SJerin Jacob 
6009d3aeb18SJerin Jacob int
6019d3aeb18SJerin Jacob perf_launch_lcores(struct evt_test *test, struct evt_options *opt,
6029d3aeb18SJerin Jacob 		int (*worker)(void *))
6039d3aeb18SJerin Jacob {
6049d3aeb18SJerin Jacob 	int ret, lcore_id;
6059d3aeb18SJerin Jacob 	struct test_perf *t = evt_test_priv(test);
6069d3aeb18SJerin Jacob 
6079d3aeb18SJerin Jacob 	int port_idx = 0;
6089d3aeb18SJerin Jacob 	/* launch workers */
609cb056611SStephen Hemminger 	RTE_LCORE_FOREACH_WORKER(lcore_id) {
6109d3aeb18SJerin Jacob 		if (!(opt->wlcores[lcore_id]))
6119d3aeb18SJerin Jacob 			continue;
6129d3aeb18SJerin Jacob 
6139d3aeb18SJerin Jacob 		ret = rte_eal_remote_launch(worker,
6149d3aeb18SJerin Jacob 				 &t->worker[port_idx], lcore_id);
6159d3aeb18SJerin Jacob 		if (ret) {
6169d3aeb18SJerin Jacob 			evt_err("failed to launch worker %d", lcore_id);
6179d3aeb18SJerin Jacob 			return ret;
6189d3aeb18SJerin Jacob 		}
6199d3aeb18SJerin Jacob 		port_idx++;
6209d3aeb18SJerin Jacob 	}
6219d3aeb18SJerin Jacob 
6229d3aeb18SJerin Jacob 	/* launch producers */
623cb056611SStephen Hemminger 	RTE_LCORE_FOREACH_WORKER(lcore_id) {
6249d3aeb18SJerin Jacob 		if (!(opt->plcores[lcore_id]))
6259d3aeb18SJerin Jacob 			continue;
6269d3aeb18SJerin Jacob 
62759f697e3SPavan Nikhilesh 		ret = rte_eal_remote_launch(perf_producer_wrapper,
62859f697e3SPavan Nikhilesh 				&t->prod[port_idx], lcore_id);
6299d3aeb18SJerin Jacob 		if (ret) {
6309d3aeb18SJerin Jacob 			evt_err("failed to launch perf_producer %d", lcore_id);
6319d3aeb18SJerin Jacob 			return ret;
6329d3aeb18SJerin Jacob 		}
6339d3aeb18SJerin Jacob 		port_idx++;
6349d3aeb18SJerin Jacob 	}
6359d3aeb18SJerin Jacob 
636d008f20bSPavan Nikhilesh 	const uint64_t total_pkts = t->outstand_pkts;
6379d3aeb18SJerin Jacob 
6389d3aeb18SJerin Jacob 	uint64_t dead_lock_cycles = rte_get_timer_cycles();
6399d3aeb18SJerin Jacob 	int64_t dead_lock_remaining  =  total_pkts;
6409d3aeb18SJerin Jacob 	const uint64_t dead_lock_sample = rte_get_timer_hz() * 5;
6419d3aeb18SJerin Jacob 
6429d3aeb18SJerin Jacob 	uint64_t perf_cycles = rte_get_timer_cycles();
6439d3aeb18SJerin Jacob 	int64_t perf_remaining  = total_pkts;
6449d3aeb18SJerin Jacob 	const uint64_t perf_sample = rte_get_timer_hz();
6459d3aeb18SJerin Jacob 
6469d3aeb18SJerin Jacob 	static float total_mpps;
6479d3aeb18SJerin Jacob 	static uint64_t samples;
6489d3aeb18SJerin Jacob 
6499d3aeb18SJerin Jacob 	const uint64_t freq_mhz = rte_get_timer_hz() / 1000000;
6509d3aeb18SJerin Jacob 	int64_t remaining = t->outstand_pkts - processed_pkts(t);
6519d3aeb18SJerin Jacob 
6529d3aeb18SJerin Jacob 	while (t->done == false) {
6539d3aeb18SJerin Jacob 		const uint64_t new_cycles = rte_get_timer_cycles();
6549d3aeb18SJerin Jacob 
6559d3aeb18SJerin Jacob 		if ((new_cycles - perf_cycles) > perf_sample) {
6569d3aeb18SJerin Jacob 			const uint64_t latency = total_latency(t);
6579d3aeb18SJerin Jacob 			const uint64_t pkts = processed_pkts(t);
6589d3aeb18SJerin Jacob 
6599d3aeb18SJerin Jacob 			remaining = t->outstand_pkts - pkts;
6609d3aeb18SJerin Jacob 			float mpps = (float)(perf_remaining-remaining)/1000000;
6619d3aeb18SJerin Jacob 
6629d3aeb18SJerin Jacob 			perf_remaining = remaining;
6639d3aeb18SJerin Jacob 			perf_cycles = new_cycles;
6649d3aeb18SJerin Jacob 			total_mpps += mpps;
6659d3aeb18SJerin Jacob 			++samples;
66604716352SJerin Jacob 			if (opt->fwd_latency && pkts > 0) {
6679d3aeb18SJerin Jacob 				printf(CLGRN"\r%.3f mpps avg %.3f mpps [avg fwd latency %.3f us] "CLNRM,
6689d3aeb18SJerin Jacob 					mpps, total_mpps/samples,
6699d3aeb18SJerin Jacob 					(float)(latency/pkts)/freq_mhz);
6709d3aeb18SJerin Jacob 			} else {
6719d3aeb18SJerin Jacob 				printf(CLGRN"\r%.3f mpps avg %.3f mpps"CLNRM,
6729d3aeb18SJerin Jacob 					mpps, total_mpps/samples);
6739d3aeb18SJerin Jacob 			}
6749d3aeb18SJerin Jacob 			fflush(stdout);
6759d3aeb18SJerin Jacob 
6769d3aeb18SJerin Jacob 			if (remaining <= 0) {
6779d3aeb18SJerin Jacob 				t->result = EVT_TEST_SUCCESS;
678d008f20bSPavan Nikhilesh 				if (opt->prod_type == EVT_PROD_TYPE_SYNT ||
679d008f20bSPavan Nikhilesh 				    opt->prod_type ==
680de2bc16eSShijith Thotton 					    EVT_PROD_TYPE_EVENT_TIMER_ADPTR ||
681de2bc16eSShijith Thotton 				    opt->prod_type ==
682de2bc16eSShijith Thotton 					    EVT_PROD_TYPE_EVENT_CRYPTO_ADPTR) {
68359f697e3SPavan Nikhilesh 					t->done = true;
6849d3aeb18SJerin Jacob 					break;
6859d3aeb18SJerin Jacob 				}
6869d3aeb18SJerin Jacob 			}
68759f697e3SPavan Nikhilesh 		}
6889d3aeb18SJerin Jacob 
68959f697e3SPavan Nikhilesh 		if (new_cycles - dead_lock_cycles > dead_lock_sample &&
69047303784SErik Gabriel Carrillo 		    (opt->prod_type == EVT_PROD_TYPE_SYNT ||
691de2bc16eSShijith Thotton 		     opt->prod_type == EVT_PROD_TYPE_EVENT_TIMER_ADPTR ||
692de2bc16eSShijith Thotton 		     opt->prod_type == EVT_PROD_TYPE_EVENT_CRYPTO_ADPTR)) {
6939d3aeb18SJerin Jacob 			remaining = t->outstand_pkts - processed_pkts(t);
6949d3aeb18SJerin Jacob 			if (dead_lock_remaining == remaining) {
6959d3aeb18SJerin Jacob 				rte_event_dev_dump(opt->dev_id, stdout);
6969d3aeb18SJerin Jacob 				evt_err("No schedules for seconds, deadlock");
6979d3aeb18SJerin Jacob 				t->done = true;
6989d3aeb18SJerin Jacob 				break;
6999d3aeb18SJerin Jacob 			}
7009d3aeb18SJerin Jacob 			dead_lock_remaining = remaining;
7019d3aeb18SJerin Jacob 			dead_lock_cycles = new_cycles;
7029d3aeb18SJerin Jacob 		}
7039d3aeb18SJerin Jacob 	}
7049d3aeb18SJerin Jacob 	printf("\n");
7059d3aeb18SJerin Jacob 	return 0;
7069d3aeb18SJerin Jacob }
7079d3aeb18SJerin Jacob 
7083617aae5SPavan Nikhilesh static int
7093617aae5SPavan Nikhilesh perf_event_rx_adapter_setup(struct evt_options *opt, uint8_t stride,
7103617aae5SPavan Nikhilesh 		struct rte_event_port_conf prod_conf)
7113617aae5SPavan Nikhilesh {
7123617aae5SPavan Nikhilesh 	int ret = 0;
7133617aae5SPavan Nikhilesh 	uint16_t prod;
7143617aae5SPavan Nikhilesh 	struct rte_event_eth_rx_adapter_queue_conf queue_conf;
7153617aae5SPavan Nikhilesh 
7163617aae5SPavan Nikhilesh 	memset(&queue_conf, 0,
7173617aae5SPavan Nikhilesh 			sizeof(struct rte_event_eth_rx_adapter_queue_conf));
7183617aae5SPavan Nikhilesh 	queue_conf.ev.sched_type = opt->sched_type_list[0];
7198728ccf3SThomas Monjalon 	RTE_ETH_FOREACH_DEV(prod) {
7203617aae5SPavan Nikhilesh 		uint32_t cap;
7213617aae5SPavan Nikhilesh 
7223617aae5SPavan Nikhilesh 		ret = rte_event_eth_rx_adapter_caps_get(opt->dev_id,
7233617aae5SPavan Nikhilesh 				prod, &cap);
7243617aae5SPavan Nikhilesh 		if (ret) {
7253617aae5SPavan Nikhilesh 			evt_err("failed to get event rx adapter[%d]"
7263617aae5SPavan Nikhilesh 					" capabilities",
7273617aae5SPavan Nikhilesh 					opt->dev_id);
7283617aae5SPavan Nikhilesh 			return ret;
7293617aae5SPavan Nikhilesh 		}
7303617aae5SPavan Nikhilesh 		queue_conf.ev.queue_id = prod * stride;
7313617aae5SPavan Nikhilesh 		ret = rte_event_eth_rx_adapter_create(prod, opt->dev_id,
7323617aae5SPavan Nikhilesh 				&prod_conf);
7333617aae5SPavan Nikhilesh 		if (ret) {
7343617aae5SPavan Nikhilesh 			evt_err("failed to create rx adapter[%d]", prod);
7353617aae5SPavan Nikhilesh 			return ret;
7363617aae5SPavan Nikhilesh 		}
7373617aae5SPavan Nikhilesh 		ret = rte_event_eth_rx_adapter_queue_add(prod, prod, -1,
7383617aae5SPavan Nikhilesh 				&queue_conf);
7393617aae5SPavan Nikhilesh 		if (ret) {
7403617aae5SPavan Nikhilesh 			evt_err("failed to add rx queues to adapter[%d]", prod);
7413617aae5SPavan Nikhilesh 			return ret;
7423617aae5SPavan Nikhilesh 		}
7433617aae5SPavan Nikhilesh 
744b0333c55SPavan Nikhilesh 		if (!(cap & RTE_EVENT_ETH_RX_ADAPTER_CAP_INTERNAL_PORT)) {
745b0333c55SPavan Nikhilesh 			uint32_t service_id;
746b0333c55SPavan Nikhilesh 
747b0333c55SPavan Nikhilesh 			rte_event_eth_rx_adapter_service_id_get(prod,
748b0333c55SPavan Nikhilesh 					&service_id);
749b0333c55SPavan Nikhilesh 			ret = evt_service_setup(service_id);
750b0333c55SPavan Nikhilesh 			if (ret) {
751b0333c55SPavan Nikhilesh 				evt_err("Failed to setup service core"
752b0333c55SPavan Nikhilesh 						" for Rx adapter\n");
753b0333c55SPavan Nikhilesh 				return ret;
754b0333c55SPavan Nikhilesh 			}
755b0333c55SPavan Nikhilesh 		}
7563617aae5SPavan Nikhilesh 	}
7573617aae5SPavan Nikhilesh 
7583617aae5SPavan Nikhilesh 	return ret;
7593617aae5SPavan Nikhilesh }
7603617aae5SPavan Nikhilesh 
761d008f20bSPavan Nikhilesh static int
762d008f20bSPavan Nikhilesh perf_event_timer_adapter_setup(struct test_perf *t)
763d008f20bSPavan Nikhilesh {
764d008f20bSPavan Nikhilesh 	int i;
765d008f20bSPavan Nikhilesh 	int ret;
766d008f20bSPavan Nikhilesh 	struct rte_event_timer_adapter_info adapter_info;
767d008f20bSPavan Nikhilesh 	struct rte_event_timer_adapter *wl;
768d008f20bSPavan Nikhilesh 	uint8_t nb_producers = evt_nr_active_lcores(t->opt->plcores);
769d008f20bSPavan Nikhilesh 	uint8_t flags = RTE_EVENT_TIMER_ADAPTER_F_ADJUST_RES;
770d008f20bSPavan Nikhilesh 
771d008f20bSPavan Nikhilesh 	if (nb_producers == 1)
772d008f20bSPavan Nikhilesh 		flags |= RTE_EVENT_TIMER_ADAPTER_F_SP_PUT;
773d008f20bSPavan Nikhilesh 
774d008f20bSPavan Nikhilesh 	for (i = 0; i < t->opt->nb_timer_adptrs; i++) {
775d008f20bSPavan Nikhilesh 		struct rte_event_timer_adapter_conf config = {
776d008f20bSPavan Nikhilesh 			.event_dev_id = t->opt->dev_id,
777d008f20bSPavan Nikhilesh 			.timer_adapter_id = i,
778d008f20bSPavan Nikhilesh 			.timer_tick_ns = t->opt->timer_tick_nsec,
779d008f20bSPavan Nikhilesh 			.max_tmo_ns = t->opt->max_tmo_nsec,
780c13b1ad7SPavan Nikhilesh 			.nb_timers = t->opt->pool_sz,
781d008f20bSPavan Nikhilesh 			.flags = flags,
782d008f20bSPavan Nikhilesh 		};
783d008f20bSPavan Nikhilesh 
784d008f20bSPavan Nikhilesh 		wl = rte_event_timer_adapter_create(&config);
785d008f20bSPavan Nikhilesh 		if (wl == NULL) {
786d008f20bSPavan Nikhilesh 			evt_err("failed to create event timer ring %d", i);
787d008f20bSPavan Nikhilesh 			return rte_errno;
788d008f20bSPavan Nikhilesh 		}
789d008f20bSPavan Nikhilesh 
790d008f20bSPavan Nikhilesh 		memset(&adapter_info, 0,
791d008f20bSPavan Nikhilesh 				sizeof(struct rte_event_timer_adapter_info));
792d008f20bSPavan Nikhilesh 		rte_event_timer_adapter_get_info(wl, &adapter_info);
793d008f20bSPavan Nikhilesh 		t->opt->optm_timer_tick_nsec = adapter_info.min_resolution_ns;
794d008f20bSPavan Nikhilesh 
795d008f20bSPavan Nikhilesh 		if (!(adapter_info.caps &
796d008f20bSPavan Nikhilesh 				RTE_EVENT_TIMER_ADAPTER_CAP_INTERNAL_PORT)) {
79799c25664SAndrzej Ostruszka 			uint32_t service_id = -1U;
798d008f20bSPavan Nikhilesh 
799d008f20bSPavan Nikhilesh 			rte_event_timer_adapter_service_id_get(wl,
800d008f20bSPavan Nikhilesh 					&service_id);
801d008f20bSPavan Nikhilesh 			ret = evt_service_setup(service_id);
802d008f20bSPavan Nikhilesh 			if (ret) {
803d008f20bSPavan Nikhilesh 				evt_err("Failed to setup service core"
804d008f20bSPavan Nikhilesh 						" for timer adapter\n");
805d008f20bSPavan Nikhilesh 				return ret;
806d008f20bSPavan Nikhilesh 			}
807d008f20bSPavan Nikhilesh 			rte_service_runstate_set(service_id, 1);
808d008f20bSPavan Nikhilesh 		}
809d008f20bSPavan Nikhilesh 		t->timer_adptr[i] = wl;
810d008f20bSPavan Nikhilesh 	}
811d008f20bSPavan Nikhilesh 	return 0;
812d008f20bSPavan Nikhilesh }
813d008f20bSPavan Nikhilesh 
814de2bc16eSShijith Thotton static int
815de2bc16eSShijith Thotton perf_event_crypto_adapter_setup(struct test_perf *t, struct prod_data *p)
816de2bc16eSShijith Thotton {
817de2bc16eSShijith Thotton 	struct evt_options *opt = t->opt;
818de2bc16eSShijith Thotton 	uint32_t cap;
819de2bc16eSShijith Thotton 	int ret;
820de2bc16eSShijith Thotton 
821de2bc16eSShijith Thotton 	ret = rte_event_crypto_adapter_caps_get(p->dev_id, p->ca.cdev_id, &cap);
822de2bc16eSShijith Thotton 	if (ret) {
823de2bc16eSShijith Thotton 		evt_err("Failed to get crypto adapter capabilities");
824de2bc16eSShijith Thotton 		return ret;
825de2bc16eSShijith Thotton 	}
826de2bc16eSShijith Thotton 
827de2bc16eSShijith Thotton 	if (((opt->crypto_adptr_mode == RTE_EVENT_CRYPTO_ADAPTER_OP_NEW) &&
828de2bc16eSShijith Thotton 	     !(cap & RTE_EVENT_CRYPTO_ADAPTER_CAP_INTERNAL_PORT_OP_NEW)) ||
829de2bc16eSShijith Thotton 	    ((opt->crypto_adptr_mode == RTE_EVENT_CRYPTO_ADAPTER_OP_FORWARD) &&
830de2bc16eSShijith Thotton 	     !(cap & RTE_EVENT_CRYPTO_ADAPTER_CAP_INTERNAL_PORT_OP_FWD))) {
831de2bc16eSShijith Thotton 		evt_err("crypto adapter %s mode unsupported\n",
832de2bc16eSShijith Thotton 			opt->crypto_adptr_mode ? "OP_FORWARD" : "OP_NEW");
833de2bc16eSShijith Thotton 		return -ENOTSUP;
834de2bc16eSShijith Thotton 	} else if (!(cap & RTE_EVENT_CRYPTO_ADAPTER_CAP_SESSION_PRIVATE_DATA)) {
835de2bc16eSShijith Thotton 		evt_err("Storing crypto session not supported");
836de2bc16eSShijith Thotton 		return -ENOTSUP;
837de2bc16eSShijith Thotton 	}
838de2bc16eSShijith Thotton 
839de2bc16eSShijith Thotton 	if (cap & RTE_EVENT_CRYPTO_ADAPTER_CAP_INTERNAL_PORT_QP_EV_BIND) {
840c1749bc5SVolodymyr Fialko 		struct rte_event_crypto_adapter_queue_conf conf;
841de2bc16eSShijith Thotton 
842c1749bc5SVolodymyr Fialko 		memset(&conf, 0, sizeof(conf));
843c1749bc5SVolodymyr Fialko 		conf.ev.sched_type = RTE_SCHED_TYPE_ATOMIC;
844c1749bc5SVolodymyr Fialko 		conf.ev.queue_id = p->queue_id;
845de2bc16eSShijith Thotton 		ret = rte_event_crypto_adapter_queue_pair_add(
846c1749bc5SVolodymyr Fialko 			TEST_PERF_CA_ID, p->ca.cdev_id, p->ca.cdev_qp_id, &conf);
847de2bc16eSShijith Thotton 	} else {
848de2bc16eSShijith Thotton 		ret = rte_event_crypto_adapter_queue_pair_add(
849de2bc16eSShijith Thotton 			TEST_PERF_CA_ID, p->ca.cdev_id, p->ca.cdev_qp_id, NULL);
850de2bc16eSShijith Thotton 	}
851de2bc16eSShijith Thotton 
852de2bc16eSShijith Thotton 	return ret;
853de2bc16eSShijith Thotton }
854de2bc16eSShijith Thotton 
855de2bc16eSShijith Thotton static struct rte_cryptodev_sym_session *
856de2bc16eSShijith Thotton cryptodev_sym_sess_create(struct prod_data *p, struct test_perf *t)
857de2bc16eSShijith Thotton {
858de2bc16eSShijith Thotton 	struct rte_crypto_sym_xform cipher_xform;
859de2bc16eSShijith Thotton 	struct rte_cryptodev_sym_session *sess;
860de2bc16eSShijith Thotton 
861de2bc16eSShijith Thotton 	cipher_xform.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
862de2bc16eSShijith Thotton 	cipher_xform.cipher.algo = RTE_CRYPTO_CIPHER_NULL;
863de2bc16eSShijith Thotton 	cipher_xform.cipher.op = RTE_CRYPTO_CIPHER_OP_ENCRYPT;
864de2bc16eSShijith Thotton 	cipher_xform.next = NULL;
865de2bc16eSShijith Thotton 
866*bdce2564SAkhil Goyal 	sess = rte_cryptodev_sym_session_create(p->ca.cdev_id, &cipher_xform,
867*bdce2564SAkhil Goyal 			t->ca_sess_pool);
868de2bc16eSShijith Thotton 	if (sess == NULL) {
869de2bc16eSShijith Thotton 		evt_err("Failed to create sym session");
870de2bc16eSShijith Thotton 		return NULL;
871de2bc16eSShijith Thotton 	}
872de2bc16eSShijith Thotton 
873de2bc16eSShijith Thotton 	return sess;
874de2bc16eSShijith Thotton }
875de2bc16eSShijith Thotton 
8768f5b5495SAkhil Goyal static void *
8778f5b5495SAkhil Goyal cryptodev_asym_sess_create(struct prod_data *p, struct test_perf *t)
8788f5b5495SAkhil Goyal {
8798f5b5495SAkhil Goyal 	const struct rte_cryptodev_asymmetric_xform_capability *capability;
8808f5b5495SAkhil Goyal 	struct rte_cryptodev_asym_capability_idx cap_idx;
8818f5b5495SAkhil Goyal 	struct rte_crypto_asym_xform xform;
8828f5b5495SAkhil Goyal 	void *sess;
8838f5b5495SAkhil Goyal 
8848f5b5495SAkhil Goyal 	xform.next = NULL;
8858f5b5495SAkhil Goyal 	xform.xform_type = RTE_CRYPTO_ASYM_XFORM_MODEX;
8868f5b5495SAkhil Goyal 	cap_idx.type = xform.xform_type;
8878f5b5495SAkhil Goyal 	capability = rte_cryptodev_asym_capability_get(p->ca.cdev_id, &cap_idx);
8888f5b5495SAkhil Goyal 	if (capability == NULL) {
8898f5b5495SAkhil Goyal 		evt_err("Device doesn't support MODEX. Test Skipped\n");
8908f5b5495SAkhil Goyal 		return NULL;
8918f5b5495SAkhil Goyal 	}
8928f5b5495SAkhil Goyal 
8938f5b5495SAkhil Goyal 	xform.modex.modulus.data = modex_test_case.modulus.data;
8948f5b5495SAkhil Goyal 	xform.modex.modulus.length = modex_test_case.modulus.len;
8958f5b5495SAkhil Goyal 	xform.modex.exponent.data = modex_test_case.exponent.data;
8968f5b5495SAkhil Goyal 	xform.modex.exponent.length = modex_test_case.exponent.len;
8978f5b5495SAkhil Goyal 
8988f5b5495SAkhil Goyal 	if (rte_cryptodev_asym_session_create(p->ca.cdev_id, &xform,
8998f5b5495SAkhil Goyal 			t->ca_asym_sess_pool, &sess)) {
9008f5b5495SAkhil Goyal 		evt_err("Failed to create asym session");
9018f5b5495SAkhil Goyal 		return NULL;
9028f5b5495SAkhil Goyal 	}
9038f5b5495SAkhil Goyal 
9048f5b5495SAkhil Goyal 	return sess;
9058f5b5495SAkhil Goyal }
9068f5b5495SAkhil Goyal 
907272de067SJerin Jacob int
90884a7513dSJerin Jacob perf_event_dev_port_setup(struct evt_test *test, struct evt_options *opt,
909535c630cSPavan Nikhilesh 				uint8_t stride, uint8_t nb_queues,
910535c630cSPavan Nikhilesh 				const struct rte_event_port_conf *port_conf)
91184a7513dSJerin Jacob {
91284a7513dSJerin Jacob 	struct test_perf *t = evt_test_priv(test);
9133617aae5SPavan Nikhilesh 	uint16_t port, prod;
91484a7513dSJerin Jacob 	int ret = -1;
91584a7513dSJerin Jacob 
91684a7513dSJerin Jacob 	/* setup one port per worker, linking to all queues */
91784a7513dSJerin Jacob 	for (port = 0; port < evt_nr_active_lcores(opt->wlcores);
91884a7513dSJerin Jacob 				port++) {
91984a7513dSJerin Jacob 		struct worker_data *w = &t->worker[port];
92084a7513dSJerin Jacob 
92184a7513dSJerin Jacob 		w->dev_id = opt->dev_id;
92284a7513dSJerin Jacob 		w->port_id = port;
92384a7513dSJerin Jacob 		w->t = t;
92484a7513dSJerin Jacob 		w->processed_pkts = 0;
92584a7513dSJerin Jacob 		w->latency = 0;
92684a7513dSJerin Jacob 
9275f94d108SHarry van Haaren 		struct rte_event_port_conf conf = *port_conf;
9285f94d108SHarry van Haaren 		conf.event_port_cfg |= RTE_EVENT_PORT_CFG_HINT_WORKER;
9295f94d108SHarry van Haaren 
9305f94d108SHarry van Haaren 		ret = rte_event_port_setup(opt->dev_id, port, &conf);
93184a7513dSJerin Jacob 		if (ret) {
93284a7513dSJerin Jacob 			evt_err("failed to setup port %d", port);
93384a7513dSJerin Jacob 			return ret;
93484a7513dSJerin Jacob 		}
93584a7513dSJerin Jacob 
93684a7513dSJerin Jacob 		ret = rte_event_port_link(opt->dev_id, port, NULL, NULL, 0);
93784a7513dSJerin Jacob 		if (ret != nb_queues) {
93884a7513dSJerin Jacob 			evt_err("failed to link all queues to port %d", port);
93984a7513dSJerin Jacob 			return -EINVAL;
94084a7513dSJerin Jacob 		}
94184a7513dSJerin Jacob 	}
94284a7513dSJerin Jacob 
94384a7513dSJerin Jacob 	/* port for producers, no links */
9443617aae5SPavan Nikhilesh 	if (opt->prod_type == EVT_PROD_TYPE_ETH_RX_ADPTR) {
9453617aae5SPavan Nikhilesh 		for ( ; port < perf_nb_event_ports(opt); port++) {
9463617aae5SPavan Nikhilesh 			struct prod_data *p = &t->prod[port];
9473617aae5SPavan Nikhilesh 			p->t = t;
9483617aae5SPavan Nikhilesh 		}
9493617aae5SPavan Nikhilesh 
9505f94d108SHarry van Haaren 		struct rte_event_port_conf conf = *port_conf;
9515f94d108SHarry van Haaren 		conf.event_port_cfg |= RTE_EVENT_PORT_CFG_HINT_PRODUCER;
9525f94d108SHarry van Haaren 
9535f94d108SHarry van Haaren 		ret = perf_event_rx_adapter_setup(opt, stride, conf);
9543617aae5SPavan Nikhilesh 		if (ret)
9553617aae5SPavan Nikhilesh 			return ret;
956d008f20bSPavan Nikhilesh 	} else if (opt->prod_type == EVT_PROD_TYPE_EVENT_TIMER_ADPTR) {
957d008f20bSPavan Nikhilesh 		prod = 0;
958d008f20bSPavan Nikhilesh 		for ( ; port < perf_nb_event_ports(opt); port++) {
959d008f20bSPavan Nikhilesh 			struct prod_data *p = &t->prod[port];
960d008f20bSPavan Nikhilesh 			p->queue_id = prod * stride;
961d008f20bSPavan Nikhilesh 			p->t = t;
962d008f20bSPavan Nikhilesh 			prod++;
963d008f20bSPavan Nikhilesh 		}
964d008f20bSPavan Nikhilesh 
965d008f20bSPavan Nikhilesh 		ret = perf_event_timer_adapter_setup(t);
966d008f20bSPavan Nikhilesh 		if (ret)
967d008f20bSPavan Nikhilesh 			return ret;
968de2bc16eSShijith Thotton 	} else if (opt->prod_type == EVT_PROD_TYPE_EVENT_CRYPTO_ADPTR) {
969de2bc16eSShijith Thotton 		struct rte_event_port_conf conf = *port_conf;
970de2bc16eSShijith Thotton 		uint8_t cdev_id = 0;
971de2bc16eSShijith Thotton 		uint16_t qp_id = 0;
972de2bc16eSShijith Thotton 
973de2bc16eSShijith Thotton 		ret = rte_event_crypto_adapter_create(TEST_PERF_CA_ID,
974de2bc16eSShijith Thotton 						      opt->dev_id, &conf, 0);
975de2bc16eSShijith Thotton 		if (ret) {
976de2bc16eSShijith Thotton 			evt_err("Failed to create crypto adapter");
977de2bc16eSShijith Thotton 			return ret;
978de2bc16eSShijith Thotton 		}
979de2bc16eSShijith Thotton 
980de2bc16eSShijith Thotton 		prod = 0;
981de2bc16eSShijith Thotton 		for (; port < perf_nb_event_ports(opt); port++) {
982de2bc16eSShijith Thotton 			union rte_event_crypto_metadata m_data;
983de2bc16eSShijith Thotton 			struct prod_data *p = &t->prod[port];
984de2bc16eSShijith Thotton 			uint32_t flow_id;
985de2bc16eSShijith Thotton 
986de2bc16eSShijith Thotton 			if (qp_id == rte_cryptodev_queue_pair_count(cdev_id)) {
987de2bc16eSShijith Thotton 				cdev_id++;
988de2bc16eSShijith Thotton 				qp_id = 0;
989de2bc16eSShijith Thotton 			}
990de2bc16eSShijith Thotton 
991de2bc16eSShijith Thotton 			p->dev_id = opt->dev_id;
992de2bc16eSShijith Thotton 			p->port_id = port;
993de2bc16eSShijith Thotton 			p->queue_id = prod * stride;
994de2bc16eSShijith Thotton 			p->ca.cdev_id = cdev_id;
995de2bc16eSShijith Thotton 			p->ca.cdev_qp_id = qp_id;
996de2bc16eSShijith Thotton 			p->ca.crypto_sess = rte_zmalloc_socket(
9978f5b5495SAkhil Goyal 				NULL, sizeof(void *) * t->nb_flows,
998de2bc16eSShijith Thotton 				RTE_CACHE_LINE_SIZE, opt->socket_id);
999de2bc16eSShijith Thotton 			p->t = t;
1000de2bc16eSShijith Thotton 
1001de2bc16eSShijith Thotton 			m_data.request_info.cdev_id = p->ca.cdev_id;
1002de2bc16eSShijith Thotton 			m_data.request_info.queue_pair_id = p->ca.cdev_qp_id;
1003de2bc16eSShijith Thotton 			m_data.response_info.sched_type = RTE_SCHED_TYPE_ATOMIC;
1004de2bc16eSShijith Thotton 			m_data.response_info.queue_id = p->queue_id;
1005de2bc16eSShijith Thotton 
1006de2bc16eSShijith Thotton 			for (flow_id = 0; flow_id < t->nb_flows; flow_id++) {
10078f5b5495SAkhil Goyal 				m_data.response_info.flow_id = flow_id;
10088f5b5495SAkhil Goyal 				if (opt->crypto_op_type ==
10098f5b5495SAkhil Goyal 						RTE_CRYPTO_OP_TYPE_SYMMETRIC) {
10108f5b5495SAkhil Goyal 					struct rte_cryptodev_sym_session *sess;
10118f5b5495SAkhil Goyal 
10128f5b5495SAkhil Goyal 					sess = cryptodev_sym_sess_create(p, t);
10138f5b5495SAkhil Goyal 					if (sess == NULL)
1014de2bc16eSShijith Thotton 						return -ENOMEM;
1015de2bc16eSShijith Thotton 
10168f5b5495SAkhil Goyal 					rte_cryptodev_session_event_mdata_set(
10178f5b5495SAkhil Goyal 						cdev_id,
10188f5b5495SAkhil Goyal 						sess,
10194c43055cSAkhil Goyal 						RTE_CRYPTO_OP_TYPE_SYMMETRIC,
10204c43055cSAkhil Goyal 						RTE_CRYPTO_OP_WITH_SESSION,
10214c43055cSAkhil Goyal 						&m_data, sizeof(m_data));
10228f5b5495SAkhil Goyal 					p->ca.crypto_sess[flow_id] = sess;
10238f5b5495SAkhil Goyal 				} else {
10248f5b5495SAkhil Goyal 					void *sess;
10254c43055cSAkhil Goyal 
10268f5b5495SAkhil Goyal 					sess = cryptodev_asym_sess_create(p, t);
10278f5b5495SAkhil Goyal 					if (sess == NULL)
10288f5b5495SAkhil Goyal 						return -ENOMEM;
10298f5b5495SAkhil Goyal 					rte_cryptodev_session_event_mdata_set(
10308f5b5495SAkhil Goyal 						cdev_id,
10318f5b5495SAkhil Goyal 						sess,
10328f5b5495SAkhil Goyal 						RTE_CRYPTO_OP_TYPE_ASYMMETRIC,
10338f5b5495SAkhil Goyal 						RTE_CRYPTO_OP_WITH_SESSION,
10348f5b5495SAkhil Goyal 						&m_data, sizeof(m_data));
10358f5b5495SAkhil Goyal 					p->ca.crypto_sess[flow_id] = sess;
10368f5b5495SAkhil Goyal 				}
1037de2bc16eSShijith Thotton 			}
1038de2bc16eSShijith Thotton 
1039de2bc16eSShijith Thotton 			conf.event_port_cfg |=
1040de2bc16eSShijith Thotton 				RTE_EVENT_PORT_CFG_HINT_PRODUCER |
1041de2bc16eSShijith Thotton 				RTE_EVENT_PORT_CFG_HINT_CONSUMER;
1042de2bc16eSShijith Thotton 
1043de2bc16eSShijith Thotton 			ret = rte_event_port_setup(opt->dev_id, port, &conf);
1044de2bc16eSShijith Thotton 			if (ret) {
1045de2bc16eSShijith Thotton 				evt_err("failed to setup port %d", port);
1046de2bc16eSShijith Thotton 				return ret;
1047de2bc16eSShijith Thotton 			}
1048de2bc16eSShijith Thotton 
1049de2bc16eSShijith Thotton 			ret = perf_event_crypto_adapter_setup(t, p);
1050de2bc16eSShijith Thotton 			if (ret)
1051de2bc16eSShijith Thotton 				return ret;
1052de2bc16eSShijith Thotton 
1053de2bc16eSShijith Thotton 			qp_id++;
1054de2bc16eSShijith Thotton 			prod++;
1055de2bc16eSShijith Thotton 		}
10563617aae5SPavan Nikhilesh 	} else {
105784a7513dSJerin Jacob 		prod = 0;
105884a7513dSJerin Jacob 		for ( ; port < perf_nb_event_ports(opt); port++) {
105984a7513dSJerin Jacob 			struct prod_data *p = &t->prod[port];
106084a7513dSJerin Jacob 
106184a7513dSJerin Jacob 			p->dev_id = opt->dev_id;
106284a7513dSJerin Jacob 			p->port_id = port;
106384a7513dSJerin Jacob 			p->queue_id = prod * stride;
106484a7513dSJerin Jacob 			p->t = t;
106584a7513dSJerin Jacob 
10665f94d108SHarry van Haaren 			struct rte_event_port_conf conf = *port_conf;
10675f94d108SHarry van Haaren 			conf.event_port_cfg |=
10685f94d108SHarry van Haaren 				RTE_EVENT_PORT_CFG_HINT_PRODUCER |
10695f94d108SHarry van Haaren 				RTE_EVENT_PORT_CFG_HINT_CONSUMER;
10705f94d108SHarry van Haaren 
10715f94d108SHarry van Haaren 			ret = rte_event_port_setup(opt->dev_id, port, &conf);
107284a7513dSJerin Jacob 			if (ret) {
107384a7513dSJerin Jacob 				evt_err("failed to setup port %d", port);
107484a7513dSJerin Jacob 				return ret;
107584a7513dSJerin Jacob 			}
107684a7513dSJerin Jacob 			prod++;
107784a7513dSJerin Jacob 		}
10783617aae5SPavan Nikhilesh 	}
107984a7513dSJerin Jacob 
108084a7513dSJerin Jacob 	return ret;
108184a7513dSJerin Jacob }
108284a7513dSJerin Jacob 
108384a7513dSJerin Jacob int
1084272de067SJerin Jacob perf_opt_check(struct evt_options *opt, uint64_t nb_queues)
1085272de067SJerin Jacob {
1086272de067SJerin Jacob 	unsigned int lcores;
1087272de067SJerin Jacob 
1088cb056611SStephen Hemminger 	/* N producer + N worker + main when producer cores are used
1089cb056611SStephen Hemminger 	 * Else N worker + main when Rx adapter is used
1090b01974daSPavan Nikhilesh 	 */
1091b01974daSPavan Nikhilesh 	lcores = opt->prod_type == EVT_PROD_TYPE_SYNT ? 3 : 2;
1092272de067SJerin Jacob 
1093272de067SJerin Jacob 	if (rte_lcore_count() < lcores) {
1094272de067SJerin Jacob 		evt_err("test need minimum %d lcores", lcores);
1095272de067SJerin Jacob 		return -1;
1096272de067SJerin Jacob 	}
1097272de067SJerin Jacob 
1098272de067SJerin Jacob 	/* Validate worker lcores */
1099cb056611SStephen Hemminger 	if (evt_lcores_has_overlap(opt->wlcores, rte_get_main_lcore())) {
1100cb056611SStephen Hemminger 		evt_err("worker lcores overlaps with main lcore");
1101272de067SJerin Jacob 		return -1;
1102272de067SJerin Jacob 	}
1103272de067SJerin Jacob 	if (evt_lcores_has_overlap_multi(opt->wlcores, opt->plcores)) {
1104272de067SJerin Jacob 		evt_err("worker lcores overlaps producer lcores");
1105272de067SJerin Jacob 		return -1;
1106272de067SJerin Jacob 	}
1107272de067SJerin Jacob 	if (evt_has_disabled_lcore(opt->wlcores)) {
1108272de067SJerin Jacob 		evt_err("one or more workers lcores are not enabled");
1109272de067SJerin Jacob 		return -1;
1110272de067SJerin Jacob 	}
1111272de067SJerin Jacob 	if (!evt_has_active_lcore(opt->wlcores)) {
1112272de067SJerin Jacob 		evt_err("minimum one worker is required");
1113272de067SJerin Jacob 		return -1;
1114272de067SJerin Jacob 	}
1115272de067SJerin Jacob 
1116902387eaSPavan Nikhilesh 	if (opt->prod_type == EVT_PROD_TYPE_SYNT ||
1117de2bc16eSShijith Thotton 	    opt->prod_type == EVT_PROD_TYPE_EVENT_TIMER_ADPTR ||
1118de2bc16eSShijith Thotton 	    opt->prod_type == EVT_PROD_TYPE_EVENT_CRYPTO_ADPTR) {
1119272de067SJerin Jacob 		/* Validate producer lcores */
1120b01974daSPavan Nikhilesh 		if (evt_lcores_has_overlap(opt->plcores,
1121cb056611SStephen Hemminger 					rte_get_main_lcore())) {
1122cb056611SStephen Hemminger 			evt_err("producer lcores overlaps with main lcore");
1123272de067SJerin Jacob 			return -1;
1124272de067SJerin Jacob 		}
1125272de067SJerin Jacob 		if (evt_has_disabled_lcore(opt->plcores)) {
1126272de067SJerin Jacob 			evt_err("one or more producer lcores are not enabled");
1127272de067SJerin Jacob 			return -1;
1128272de067SJerin Jacob 		}
1129272de067SJerin Jacob 		if (!evt_has_active_lcore(opt->plcores)) {
1130272de067SJerin Jacob 			evt_err("minimum one producer is required");
1131272de067SJerin Jacob 			return -1;
1132272de067SJerin Jacob 		}
1133b01974daSPavan Nikhilesh 	}
1134272de067SJerin Jacob 
1135272de067SJerin Jacob 	if (evt_has_invalid_stage(opt))
1136272de067SJerin Jacob 		return -1;
1137272de067SJerin Jacob 
1138272de067SJerin Jacob 	if (evt_has_invalid_sched_type(opt))
1139272de067SJerin Jacob 		return -1;
1140272de067SJerin Jacob 
1141272de067SJerin Jacob 	if (nb_queues > EVT_MAX_QUEUES) {
1142272de067SJerin Jacob 		evt_err("number of queues exceeds %d", EVT_MAX_QUEUES);
1143272de067SJerin Jacob 		return -1;
1144272de067SJerin Jacob 	}
1145272de067SJerin Jacob 	if (perf_nb_event_ports(opt) > EVT_MAX_PORTS) {
1146272de067SJerin Jacob 		evt_err("number of ports exceeds %d", EVT_MAX_PORTS);
1147272de067SJerin Jacob 		return -1;
1148272de067SJerin Jacob 	}
1149272de067SJerin Jacob 
1150272de067SJerin Jacob 	/* Fixups */
1151d008f20bSPavan Nikhilesh 	if ((opt->nb_stages == 1 &&
1152d008f20bSPavan Nikhilesh 			opt->prod_type != EVT_PROD_TYPE_EVENT_TIMER_ADPTR) &&
1153d008f20bSPavan Nikhilesh 			opt->fwd_latency) {
1154272de067SJerin Jacob 		evt_info("fwd_latency is valid when nb_stages > 1, disabling");
1155272de067SJerin Jacob 		opt->fwd_latency = 0;
1156272de067SJerin Jacob 	}
1157d008f20bSPavan Nikhilesh 
1158272de067SJerin Jacob 	if (opt->fwd_latency && !opt->q_priority) {
1159272de067SJerin Jacob 		evt_info("enabled queue priority for latency measurement");
1160272de067SJerin Jacob 		opt->q_priority = 1;
1161272de067SJerin Jacob 	}
11629d3aeb18SJerin Jacob 	if (opt->nb_pkts == 0)
11639d3aeb18SJerin Jacob 		opt->nb_pkts = INT64_MAX/evt_nr_active_lcores(opt->plcores);
1164272de067SJerin Jacob 
1165272de067SJerin Jacob 	return 0;
1166272de067SJerin Jacob }
1167272de067SJerin Jacob 
1168272de067SJerin Jacob void
1169272de067SJerin Jacob perf_opt_dump(struct evt_options *opt, uint8_t nb_queues)
1170272de067SJerin Jacob {
1171272de067SJerin Jacob 	evt_dump("nb_prod_lcores", "%d", evt_nr_active_lcores(opt->plcores));
1172272de067SJerin Jacob 	evt_dump_producer_lcores(opt);
1173272de067SJerin Jacob 	evt_dump("nb_worker_lcores", "%d", evt_nr_active_lcores(opt->wlcores));
1174272de067SJerin Jacob 	evt_dump_worker_lcores(opt);
1175272de067SJerin Jacob 	evt_dump_nb_stages(opt);
1176272de067SJerin Jacob 	evt_dump("nb_evdev_ports", "%d", perf_nb_event_ports(opt));
1177272de067SJerin Jacob 	evt_dump("nb_evdev_queues", "%d", nb_queues);
1178272de067SJerin Jacob 	evt_dump_queue_priority(opt);
1179272de067SJerin Jacob 	evt_dump_sched_type_list(opt);
1180b01974daSPavan Nikhilesh 	evt_dump_producer_type(opt);
118120841a25SRashmi Shetty 	evt_dump("prod_enq_burst_sz", "%d", opt->prod_enq_burst_sz);
1182272de067SJerin Jacob }
1183272de067SJerin Jacob 
11847da008dfSPavan Nikhilesh static void
11857da008dfSPavan Nikhilesh perf_event_port_flush(uint8_t dev_id __rte_unused, struct rte_event ev,
11867da008dfSPavan Nikhilesh 		      void *args)
11877da008dfSPavan Nikhilesh {
11887da008dfSPavan Nikhilesh 	rte_mempool_put(args, ev.event_ptr);
11897da008dfSPavan Nikhilesh }
11907da008dfSPavan Nikhilesh 
119141c219e6SJerin Jacob void
1192f0b68c0bSPavan Nikhilesh perf_worker_cleanup(struct rte_mempool *const pool, uint8_t dev_id,
1193f0b68c0bSPavan Nikhilesh 		    uint8_t port_id, struct rte_event events[], uint16_t nb_enq,
1194f0b68c0bSPavan Nikhilesh 		    uint16_t nb_deq)
1195f0b68c0bSPavan Nikhilesh {
1196f0b68c0bSPavan Nikhilesh 	int i;
1197f0b68c0bSPavan Nikhilesh 
1198f0b68c0bSPavan Nikhilesh 	if (nb_deq) {
1199f0b68c0bSPavan Nikhilesh 		for (i = nb_enq; i < nb_deq; i++)
1200f0b68c0bSPavan Nikhilesh 			rte_mempool_put(pool, events[i].event_ptr);
1201f0b68c0bSPavan Nikhilesh 
1202f0b68c0bSPavan Nikhilesh 		for (i = 0; i < nb_deq; i++)
1203f0b68c0bSPavan Nikhilesh 			events[i].op = RTE_EVENT_OP_RELEASE;
1204f0b68c0bSPavan Nikhilesh 		rte_event_enqueue_burst(dev_id, port_id, events, nb_deq);
1205f0b68c0bSPavan Nikhilesh 	}
12067da008dfSPavan Nikhilesh 	rte_event_port_quiesce(dev_id, port_id, perf_event_port_flush, pool);
1207f0b68c0bSPavan Nikhilesh }
1208f0b68c0bSPavan Nikhilesh 
1209f0b68c0bSPavan Nikhilesh void
121041c219e6SJerin Jacob perf_eventdev_destroy(struct evt_test *test, struct evt_options *opt)
121141c219e6SJerin Jacob {
1212d008f20bSPavan Nikhilesh 	int i;
1213d008f20bSPavan Nikhilesh 	struct test_perf *t = evt_test_priv(test);
121441c219e6SJerin Jacob 
1215d008f20bSPavan Nikhilesh 	if (opt->prod_type == EVT_PROD_TYPE_EVENT_TIMER_ADPTR) {
1216d008f20bSPavan Nikhilesh 		for (i = 0; i < opt->nb_timer_adptrs; i++)
1217d008f20bSPavan Nikhilesh 			rte_event_timer_adapter_stop(t->timer_adptr[i]);
1218d008f20bSPavan Nikhilesh 	}
121941c219e6SJerin Jacob 	rte_event_dev_stop(opt->dev_id);
122041c219e6SJerin Jacob 	rte_event_dev_close(opt->dev_id);
122141c219e6SJerin Jacob }
122241c219e6SJerin Jacob 
122341c219e6SJerin Jacob static inline void
122441c219e6SJerin Jacob perf_elt_init(struct rte_mempool *mp, void *arg __rte_unused,
122541c219e6SJerin Jacob 	    void *obj, unsigned i __rte_unused)
122641c219e6SJerin Jacob {
122741c219e6SJerin Jacob 	memset(obj, 0, mp->elt_size);
122841c219e6SJerin Jacob }
122941c219e6SJerin Jacob 
12303fc8de4fSPavan Nikhilesh #define NB_RX_DESC			128
12313fc8de4fSPavan Nikhilesh #define NB_TX_DESC			512
12323fc8de4fSPavan Nikhilesh int
12333fc8de4fSPavan Nikhilesh perf_ethdev_setup(struct evt_test *test, struct evt_options *opt)
12343fc8de4fSPavan Nikhilesh {
12358728ccf3SThomas Monjalon 	uint16_t i;
123677339255SIvan Ilchenko 	int ret;
12373fc8de4fSPavan Nikhilesh 	struct test_perf *t = evt_test_priv(test);
12383fc8de4fSPavan Nikhilesh 	struct rte_eth_conf port_conf = {
12393fc8de4fSPavan Nikhilesh 		.rxmode = {
1240295968d1SFerruh Yigit 			.mq_mode = RTE_ETH_MQ_RX_RSS,
12413fc8de4fSPavan Nikhilesh 			.split_hdr_size = 0,
12423fc8de4fSPavan Nikhilesh 		},
12433fc8de4fSPavan Nikhilesh 		.rx_adv_conf = {
12443fc8de4fSPavan Nikhilesh 			.rss_conf = {
12453fc8de4fSPavan Nikhilesh 				.rss_key = NULL,
1246295968d1SFerruh Yigit 				.rss_hf = RTE_ETH_RSS_IP,
12473fc8de4fSPavan Nikhilesh 			},
12483fc8de4fSPavan Nikhilesh 		},
12493fc8de4fSPavan Nikhilesh 	};
12503fc8de4fSPavan Nikhilesh 
1251de2bc16eSShijith Thotton 	if (opt->prod_type != EVT_PROD_TYPE_ETH_RX_ADPTR)
12523fc8de4fSPavan Nikhilesh 		return 0;
12533fc8de4fSPavan Nikhilesh 
1254d9a42a69SThomas Monjalon 	if (!rte_eth_dev_count_avail()) {
12553fc8de4fSPavan Nikhilesh 		evt_err("No ethernet ports found.");
12563fc8de4fSPavan Nikhilesh 		return -ENODEV;
12573fc8de4fSPavan Nikhilesh 	}
12583fc8de4fSPavan Nikhilesh 
12598728ccf3SThomas Monjalon 	RTE_ETH_FOREACH_DEV(i) {
12604f5701f2SFerruh Yigit 		struct rte_eth_dev_info dev_info;
12614f5701f2SFerruh Yigit 		struct rte_eth_conf local_port_conf = port_conf;
12623fc8de4fSPavan Nikhilesh 
126377339255SIvan Ilchenko 		ret = rte_eth_dev_info_get(i, &dev_info);
126477339255SIvan Ilchenko 		if (ret != 0) {
126577339255SIvan Ilchenko 			evt_err("Error during getting device (port %u) info: %s\n",
126677339255SIvan Ilchenko 					i, strerror(-ret));
126777339255SIvan Ilchenko 			return ret;
126877339255SIvan Ilchenko 		}
12694f5701f2SFerruh Yigit 
12704f5701f2SFerruh Yigit 		local_port_conf.rx_adv_conf.rss_conf.rss_hf &=
12714f5701f2SFerruh Yigit 			dev_info.flow_type_rss_offloads;
12724f5701f2SFerruh Yigit 		if (local_port_conf.rx_adv_conf.rss_conf.rss_hf !=
12734f5701f2SFerruh Yigit 				port_conf.rx_adv_conf.rss_conf.rss_hf) {
12744f5701f2SFerruh Yigit 			evt_info("Port %u modified RSS hash function based on hardware support,"
12754f5701f2SFerruh Yigit 				"requested:%#"PRIx64" configured:%#"PRIx64"\n",
12764f5701f2SFerruh Yigit 				i,
12774f5701f2SFerruh Yigit 				port_conf.rx_adv_conf.rss_conf.rss_hf,
12784f5701f2SFerruh Yigit 				local_port_conf.rx_adv_conf.rss_conf.rss_hf);
12794f5701f2SFerruh Yigit 		}
12804f5701f2SFerruh Yigit 
12814f5701f2SFerruh Yigit 		if (rte_eth_dev_configure(i, 1, 1, &local_port_conf) < 0) {
12823fc8de4fSPavan Nikhilesh 			evt_err("Failed to configure eth port [%d]", i);
12833fc8de4fSPavan Nikhilesh 			return -EINVAL;
12843fc8de4fSPavan Nikhilesh 		}
12853fc8de4fSPavan Nikhilesh 
12863fc8de4fSPavan Nikhilesh 		if (rte_eth_rx_queue_setup(i, 0, NB_RX_DESC,
12873fc8de4fSPavan Nikhilesh 				rte_socket_id(), NULL, t->pool) < 0) {
12883fc8de4fSPavan Nikhilesh 			evt_err("Failed to setup eth port [%d] rx_queue: %d.",
12893fc8de4fSPavan Nikhilesh 					i, 0);
12903fc8de4fSPavan Nikhilesh 			return -EINVAL;
12913fc8de4fSPavan Nikhilesh 		}
12923fc8de4fSPavan Nikhilesh 
12933fc8de4fSPavan Nikhilesh 		if (rte_eth_tx_queue_setup(i, 0, NB_TX_DESC,
12943fc8de4fSPavan Nikhilesh 					rte_socket_id(), NULL) < 0) {
12953fc8de4fSPavan Nikhilesh 			evt_err("Failed to setup eth port [%d] tx_queue: %d.",
12963fc8de4fSPavan Nikhilesh 					i, 0);
12973fc8de4fSPavan Nikhilesh 			return -EINVAL;
12983fc8de4fSPavan Nikhilesh 		}
12993fc8de4fSPavan Nikhilesh 
130070e51a0eSIvan Ilchenko 		ret = rte_eth_promiscuous_enable(i);
130170e51a0eSIvan Ilchenko 		if (ret != 0) {
130270e51a0eSIvan Ilchenko 			evt_err("Failed to enable promiscuous mode for eth port [%d]: %s",
130370e51a0eSIvan Ilchenko 				i, rte_strerror(-ret));
130470e51a0eSIvan Ilchenko 			return ret;
130570e51a0eSIvan Ilchenko 		}
13063fc8de4fSPavan Nikhilesh 	}
13073fc8de4fSPavan Nikhilesh 
13083fc8de4fSPavan Nikhilesh 	return 0;
13093fc8de4fSPavan Nikhilesh }
13103fc8de4fSPavan Nikhilesh 
1311a734e738SPavan Nikhilesh void
1312a734e738SPavan Nikhilesh perf_ethdev_rx_stop(struct evt_test *test, struct evt_options *opt)
13137f3daf34SPavan Nikhilesh {
13148728ccf3SThomas Monjalon 	uint16_t i;
13157f3daf34SPavan Nikhilesh 	RTE_SET_USED(test);
13167f3daf34SPavan Nikhilesh 
13177f3daf34SPavan Nikhilesh 	if (opt->prod_type == EVT_PROD_TYPE_ETH_RX_ADPTR) {
13188728ccf3SThomas Monjalon 		RTE_ETH_FOREACH_DEV(i) {
13193617aae5SPavan Nikhilesh 			rte_event_eth_rx_adapter_stop(i);
1320a734e738SPavan Nikhilesh 			rte_event_eth_rx_adapter_queue_del(i, i, -1);
1321a734e738SPavan Nikhilesh 			rte_eth_dev_rx_queue_stop(i, 0);
1322a734e738SPavan Nikhilesh 		}
1323a734e738SPavan Nikhilesh 	}
1324a734e738SPavan Nikhilesh }
1325a734e738SPavan Nikhilesh 
1326a734e738SPavan Nikhilesh void
1327a734e738SPavan Nikhilesh perf_ethdev_destroy(struct evt_test *test, struct evt_options *opt)
1328a734e738SPavan Nikhilesh {
1329a734e738SPavan Nikhilesh 	uint16_t i;
1330a734e738SPavan Nikhilesh 	RTE_SET_USED(test);
1331a734e738SPavan Nikhilesh 
1332a734e738SPavan Nikhilesh 	if (opt->prod_type == EVT_PROD_TYPE_ETH_RX_ADPTR) {
1333a734e738SPavan Nikhilesh 		RTE_ETH_FOREACH_DEV(i) {
1334a734e738SPavan Nikhilesh 			rte_event_eth_tx_adapter_stop(i);
1335a734e738SPavan Nikhilesh 			rte_event_eth_tx_adapter_queue_del(i, i, -1);
1336a734e738SPavan Nikhilesh 			rte_eth_dev_tx_queue_stop(i, 0);
13377f3daf34SPavan Nikhilesh 			rte_eth_dev_stop(i);
13387f3daf34SPavan Nikhilesh 		}
13397f3daf34SPavan Nikhilesh 	}
13407f3daf34SPavan Nikhilesh }
13417f3daf34SPavan Nikhilesh 
134241c219e6SJerin Jacob int
1343de2bc16eSShijith Thotton perf_cryptodev_setup(struct evt_test *test, struct evt_options *opt)
1344de2bc16eSShijith Thotton {
1345de2bc16eSShijith Thotton 	uint8_t cdev_count, cdev_id, nb_plcores, nb_qps;
1346de2bc16eSShijith Thotton 	struct test_perf *t = evt_test_priv(test);
1347de2bc16eSShijith Thotton 	unsigned int max_session_size;
1348de2bc16eSShijith Thotton 	uint32_t nb_sessions;
1349de2bc16eSShijith Thotton 	int ret;
1350de2bc16eSShijith Thotton 
1351de2bc16eSShijith Thotton 	if (opt->prod_type != EVT_PROD_TYPE_EVENT_CRYPTO_ADPTR)
1352de2bc16eSShijith Thotton 		return 0;
1353de2bc16eSShijith Thotton 
1354de2bc16eSShijith Thotton 	cdev_count = rte_cryptodev_count();
1355de2bc16eSShijith Thotton 	if (cdev_count == 0) {
1356de2bc16eSShijith Thotton 		evt_err("No crypto devices available\n");
1357de2bc16eSShijith Thotton 		return -ENODEV;
1358de2bc16eSShijith Thotton 	}
1359de2bc16eSShijith Thotton 
1360de2bc16eSShijith Thotton 	t->ca_op_pool = rte_crypto_op_pool_create(
13618f5b5495SAkhil Goyal 		"crypto_op_pool", opt->crypto_op_type, opt->pool_sz,
13628f5b5495SAkhil Goyal 		128, sizeof(union rte_event_crypto_metadata),
13638f5b5495SAkhil Goyal 		rte_socket_id());
1364de2bc16eSShijith Thotton 	if (t->ca_op_pool == NULL) {
1365de2bc16eSShijith Thotton 		evt_err("Failed to create crypto op pool");
1366de2bc16eSShijith Thotton 		return -ENOMEM;
1367de2bc16eSShijith Thotton 	}
1368de2bc16eSShijith Thotton 
1369de2bc16eSShijith Thotton 	nb_sessions = evt_nr_active_lcores(opt->plcores) * t->nb_flows;
13708f5b5495SAkhil Goyal 	t->ca_asym_sess_pool = rte_cryptodev_asym_session_pool_create(
13718f5b5495SAkhil Goyal 		"ca_asym_sess_pool", nb_sessions, 0,
13728f5b5495SAkhil Goyal 		sizeof(union rte_event_crypto_metadata), SOCKET_ID_ANY);
13738f5b5495SAkhil Goyal 	if (t->ca_asym_sess_pool == NULL) {
13748f5b5495SAkhil Goyal 		evt_err("Failed to create sym session pool");
13758f5b5495SAkhil Goyal 		ret = -ENOMEM;
13768f5b5495SAkhil Goyal 		goto err;
13778f5b5495SAkhil Goyal 	}
13788f5b5495SAkhil Goyal 
1379de2bc16eSShijith Thotton 	max_session_size = 0;
1380de2bc16eSShijith Thotton 	for (cdev_id = 0; cdev_id < cdev_count; cdev_id++) {
1381de2bc16eSShijith Thotton 		unsigned int session_size;
1382de2bc16eSShijith Thotton 
1383de2bc16eSShijith Thotton 		session_size =
1384de2bc16eSShijith Thotton 			rte_cryptodev_sym_get_private_session_size(cdev_id);
1385de2bc16eSShijith Thotton 		if (session_size > max_session_size)
1386de2bc16eSShijith Thotton 			max_session_size = session_size;
1387de2bc16eSShijith Thotton 	}
1388de2bc16eSShijith Thotton 
1389*bdce2564SAkhil Goyal 	t->ca_sess_pool = rte_cryptodev_sym_session_pool_create(
1390*bdce2564SAkhil Goyal 		"ca_sess_pool", nb_sessions, max_session_size, 0,
1391*bdce2564SAkhil Goyal 		sizeof(union rte_event_crypto_metadata), SOCKET_ID_ANY);
1392*bdce2564SAkhil Goyal 	if (t->ca_sess_pool == NULL) {
1393*bdce2564SAkhil Goyal 		evt_err("Failed to create sym session pool");
1394de2bc16eSShijith Thotton 		ret = -ENOMEM;
1395de2bc16eSShijith Thotton 		goto err;
1396de2bc16eSShijith Thotton 	}
1397de2bc16eSShijith Thotton 
1398de2bc16eSShijith Thotton 	/*
1399de2bc16eSShijith Thotton 	 * Calculate number of needed queue pairs, based on the amount of
1400de2bc16eSShijith Thotton 	 * available number of logical cores and crypto devices. For instance,
1401de2bc16eSShijith Thotton 	 * if there are 4 cores and 2 crypto devices, 2 queue pairs will be set
1402de2bc16eSShijith Thotton 	 * up per device.
1403de2bc16eSShijith Thotton 	 */
1404de2bc16eSShijith Thotton 	nb_plcores = evt_nr_active_lcores(opt->plcores);
1405de2bc16eSShijith Thotton 	nb_qps = (nb_plcores % cdev_count) ? (nb_plcores / cdev_count) + 1 :
1406de2bc16eSShijith Thotton 					     nb_plcores / cdev_count;
1407de2bc16eSShijith Thotton 	for (cdev_id = 0; cdev_id < cdev_count; cdev_id++) {
1408de2bc16eSShijith Thotton 		struct rte_cryptodev_qp_conf qp_conf;
1409de2bc16eSShijith Thotton 		struct rte_cryptodev_config conf;
1410de2bc16eSShijith Thotton 		struct rte_cryptodev_info info;
1411de2bc16eSShijith Thotton 		int qp_id;
1412de2bc16eSShijith Thotton 
1413de2bc16eSShijith Thotton 		rte_cryptodev_info_get(cdev_id, &info);
1414de2bc16eSShijith Thotton 		if (nb_qps > info.max_nb_queue_pairs) {
1415de2bc16eSShijith Thotton 			evt_err("Not enough queue pairs per cryptodev (%u)",
1416de2bc16eSShijith Thotton 				nb_qps);
1417de2bc16eSShijith Thotton 			ret = -EINVAL;
1418de2bc16eSShijith Thotton 			goto err;
1419de2bc16eSShijith Thotton 		}
1420de2bc16eSShijith Thotton 
1421de2bc16eSShijith Thotton 		conf.nb_queue_pairs = nb_qps;
1422de2bc16eSShijith Thotton 		conf.socket_id = SOCKET_ID_ANY;
1423de2bc16eSShijith Thotton 		conf.ff_disable = RTE_CRYPTODEV_FF_SECURITY;
1424de2bc16eSShijith Thotton 
1425de2bc16eSShijith Thotton 		ret = rte_cryptodev_configure(cdev_id, &conf);
1426de2bc16eSShijith Thotton 		if (ret) {
1427de2bc16eSShijith Thotton 			evt_err("Failed to configure cryptodev (%u)", cdev_id);
1428de2bc16eSShijith Thotton 			goto err;
1429de2bc16eSShijith Thotton 		}
1430de2bc16eSShijith Thotton 
1431de2bc16eSShijith Thotton 		qp_conf.nb_descriptors = NB_CRYPTODEV_DESCRIPTORS;
1432de2bc16eSShijith Thotton 		qp_conf.mp_session = t->ca_sess_pool;
1433de2bc16eSShijith Thotton 
1434de2bc16eSShijith Thotton 		for (qp_id = 0; qp_id < conf.nb_queue_pairs; qp_id++) {
1435de2bc16eSShijith Thotton 			ret = rte_cryptodev_queue_pair_setup(
1436de2bc16eSShijith Thotton 				cdev_id, qp_id, &qp_conf,
1437de2bc16eSShijith Thotton 				rte_cryptodev_socket_id(cdev_id));
1438de2bc16eSShijith Thotton 			if (ret) {
1439de2bc16eSShijith Thotton 				evt_err("Failed to setup queue pairs on cryptodev %u\n",
1440de2bc16eSShijith Thotton 					cdev_id);
1441de2bc16eSShijith Thotton 				goto err;
1442de2bc16eSShijith Thotton 			}
1443de2bc16eSShijith Thotton 		}
1444de2bc16eSShijith Thotton 	}
1445de2bc16eSShijith Thotton 
1446de2bc16eSShijith Thotton 	return 0;
1447de2bc16eSShijith Thotton err:
1448de2bc16eSShijith Thotton 	for (cdev_id = 0; cdev_id < cdev_count; cdev_id++)
1449de2bc16eSShijith Thotton 		rte_cryptodev_close(cdev_id);
1450de2bc16eSShijith Thotton 
1451de2bc16eSShijith Thotton 	rte_mempool_free(t->ca_op_pool);
1452de2bc16eSShijith Thotton 	rte_mempool_free(t->ca_sess_pool);
14538f5b5495SAkhil Goyal 	rte_mempool_free(t->ca_asym_sess_pool);
1454de2bc16eSShijith Thotton 
1455de2bc16eSShijith Thotton 	return ret;
1456de2bc16eSShijith Thotton }
1457de2bc16eSShijith Thotton 
1458de2bc16eSShijith Thotton void
1459de2bc16eSShijith Thotton perf_cryptodev_destroy(struct evt_test *test, struct evt_options *opt)
1460de2bc16eSShijith Thotton {
1461de2bc16eSShijith Thotton 	uint8_t cdev_id, cdev_count = rte_cryptodev_count();
1462de2bc16eSShijith Thotton 	struct test_perf *t = evt_test_priv(test);
1463de2bc16eSShijith Thotton 	uint16_t port;
1464de2bc16eSShijith Thotton 
1465de2bc16eSShijith Thotton 	if (opt->prod_type != EVT_PROD_TYPE_EVENT_CRYPTO_ADPTR)
1466de2bc16eSShijith Thotton 		return;
1467de2bc16eSShijith Thotton 
1468de2bc16eSShijith Thotton 	for (port = t->nb_workers; port < perf_nb_event_ports(opt); port++) {
1469de2bc16eSShijith Thotton 		struct rte_cryptodev_sym_session *sess;
1470de2bc16eSShijith Thotton 		struct prod_data *p = &t->prod[port];
1471de2bc16eSShijith Thotton 		uint32_t flow_id;
1472de2bc16eSShijith Thotton 		uint8_t cdev_id;
1473de2bc16eSShijith Thotton 
1474de2bc16eSShijith Thotton 		for (flow_id = 0; flow_id < t->nb_flows; flow_id++) {
1475de2bc16eSShijith Thotton 			sess = p->ca.crypto_sess[flow_id];
1476de2bc16eSShijith Thotton 			cdev_id = p->ca.cdev_id;
1477*bdce2564SAkhil Goyal 			rte_cryptodev_sym_session_free(cdev_id, sess);
1478de2bc16eSShijith Thotton 		}
1479de2bc16eSShijith Thotton 
1480de2bc16eSShijith Thotton 		rte_event_crypto_adapter_queue_pair_del(
1481de2bc16eSShijith Thotton 			TEST_PERF_CA_ID, p->ca.cdev_id, p->ca.cdev_qp_id);
1482de2bc16eSShijith Thotton 	}
1483de2bc16eSShijith Thotton 
1484de2bc16eSShijith Thotton 	rte_event_crypto_adapter_free(TEST_PERF_CA_ID);
1485de2bc16eSShijith Thotton 
1486de2bc16eSShijith Thotton 	for (cdev_id = 0; cdev_id < cdev_count; cdev_id++) {
1487de2bc16eSShijith Thotton 		rte_cryptodev_stop(cdev_id);
1488de2bc16eSShijith Thotton 		rte_cryptodev_close(cdev_id);
1489de2bc16eSShijith Thotton 	}
1490de2bc16eSShijith Thotton 
1491de2bc16eSShijith Thotton 	rte_mempool_free(t->ca_op_pool);
1492de2bc16eSShijith Thotton 	rte_mempool_free(t->ca_sess_pool);
14938f5b5495SAkhil Goyal 	rte_mempool_free(t->ca_asym_sess_pool);
1494de2bc16eSShijith Thotton }
1495de2bc16eSShijith Thotton 
1496de2bc16eSShijith Thotton int
149741c219e6SJerin Jacob perf_mempool_setup(struct evt_test *test, struct evt_options *opt)
149841c219e6SJerin Jacob {
149941c219e6SJerin Jacob 	struct test_perf *t = evt_test_priv(test);
150041c219e6SJerin Jacob 
1501d008f20bSPavan Nikhilesh 	if (opt->prod_type == EVT_PROD_TYPE_SYNT ||
1502d008f20bSPavan Nikhilesh 			opt->prod_type == EVT_PROD_TYPE_EVENT_TIMER_ADPTR) {
150341c219e6SJerin Jacob 		t->pool = rte_mempool_create(test->name, /* mempool name */
150441c219e6SJerin Jacob 				opt->pool_sz, /* number of elements*/
150541c219e6SJerin Jacob 				sizeof(struct perf_elt), /* element size*/
150641c219e6SJerin Jacob 				512, /* cache size*/
150741c219e6SJerin Jacob 				0, NULL, NULL,
150841c219e6SJerin Jacob 				perf_elt_init, /* obj constructor */
150941c219e6SJerin Jacob 				NULL, opt->socket_id, 0); /* flags */
15108577cc1aSPavan Nikhilesh 	} else {
15118577cc1aSPavan Nikhilesh 		t->pool = rte_pktmbuf_pool_create(test->name, /* mempool name */
15128577cc1aSPavan Nikhilesh 				opt->pool_sz, /* number of elements*/
15138577cc1aSPavan Nikhilesh 				512, /* cache size*/
15148577cc1aSPavan Nikhilesh 				0,
15158577cc1aSPavan Nikhilesh 				RTE_MBUF_DEFAULT_BUF_SIZE,
15168577cc1aSPavan Nikhilesh 				opt->socket_id); /* flags */
15178577cc1aSPavan Nikhilesh 
15188577cc1aSPavan Nikhilesh 	}
15198577cc1aSPavan Nikhilesh 
152041c219e6SJerin Jacob 	if (t->pool == NULL) {
152141c219e6SJerin Jacob 		evt_err("failed to create mempool");
152241c219e6SJerin Jacob 		return -ENOMEM;
152341c219e6SJerin Jacob 	}
152441c219e6SJerin Jacob 
152541c219e6SJerin Jacob 	return 0;
152641c219e6SJerin Jacob }
152741c219e6SJerin Jacob 
152841c219e6SJerin Jacob void
152941c219e6SJerin Jacob perf_mempool_destroy(struct evt_test *test, struct evt_options *opt)
153041c219e6SJerin Jacob {
153141c219e6SJerin Jacob 	RTE_SET_USED(opt);
153241c219e6SJerin Jacob 	struct test_perf *t = evt_test_priv(test);
153341c219e6SJerin Jacob 
153441c219e6SJerin Jacob 	rte_mempool_free(t->pool);
153541c219e6SJerin Jacob }
1536ffbae86fSJerin Jacob 
1537ffbae86fSJerin Jacob int
1538ffbae86fSJerin Jacob perf_test_setup(struct evt_test *test, struct evt_options *opt)
1539ffbae86fSJerin Jacob {
1540ffbae86fSJerin Jacob 	void *test_perf;
1541ffbae86fSJerin Jacob 
1542ffbae86fSJerin Jacob 	test_perf = rte_zmalloc_socket(test->name, sizeof(struct test_perf),
1543ffbae86fSJerin Jacob 				RTE_CACHE_LINE_SIZE, opt->socket_id);
1544ffbae86fSJerin Jacob 	if (test_perf  == NULL) {
1545ffbae86fSJerin Jacob 		evt_err("failed to allocate test_perf memory");
1546ffbae86fSJerin Jacob 		goto nomem;
1547ffbae86fSJerin Jacob 	}
1548ffbae86fSJerin Jacob 	test->test_priv = test_perf;
1549ffbae86fSJerin Jacob 
1550ffbae86fSJerin Jacob 	struct test_perf *t = evt_test_priv(test);
1551ffbae86fSJerin Jacob 
1552d008f20bSPavan Nikhilesh 	if (opt->prod_type == EVT_PROD_TYPE_EVENT_TIMER_ADPTR) {
1553d008f20bSPavan Nikhilesh 		t->outstand_pkts = opt->nb_timers *
1554d008f20bSPavan Nikhilesh 			evt_nr_active_lcores(opt->plcores);
1555d008f20bSPavan Nikhilesh 		t->nb_pkts = opt->nb_timers;
1556d008f20bSPavan Nikhilesh 	} else {
1557d008f20bSPavan Nikhilesh 		t->outstand_pkts = opt->nb_pkts *
1558d008f20bSPavan Nikhilesh 			evt_nr_active_lcores(opt->plcores);
1559d008f20bSPavan Nikhilesh 		t->nb_pkts = opt->nb_pkts;
1560d008f20bSPavan Nikhilesh 	}
1561d008f20bSPavan Nikhilesh 
1562ffbae86fSJerin Jacob 	t->nb_workers = evt_nr_active_lcores(opt->wlcores);
1563ffbae86fSJerin Jacob 	t->done = false;
1564ffbae86fSJerin Jacob 	t->nb_flows = opt->nb_flows;
1565ffbae86fSJerin Jacob 	t->result = EVT_TEST_FAILED;
1566ffbae86fSJerin Jacob 	t->opt = opt;
1567ffbae86fSJerin Jacob 	memcpy(t->sched_type_list, opt->sched_type_list,
1568ffbae86fSJerin Jacob 			sizeof(opt->sched_type_list));
1569ffbae86fSJerin Jacob 	return 0;
1570ffbae86fSJerin Jacob nomem:
1571ffbae86fSJerin Jacob 	return -ENOMEM;
1572ffbae86fSJerin Jacob }
1573ffbae86fSJerin Jacob 
1574ffbae86fSJerin Jacob void
1575ffbae86fSJerin Jacob perf_test_destroy(struct evt_test *test, struct evt_options *opt)
1576ffbae86fSJerin Jacob {
1577ffbae86fSJerin Jacob 	RTE_SET_USED(opt);
1578ffbae86fSJerin Jacob 
1579ffbae86fSJerin Jacob 	rte_free(test->test_priv);
1580ffbae86fSJerin Jacob }
1581