xref: /dpdk/app/test-eventdev/test_pipeline_queue.c (revision f0b68c0b2af72465559445ac7548bfe0f1c005e3)
1d60b4185SPavan Nikhilesh /*
2d60b4185SPavan Nikhilesh  * SPDX-License-Identifier: BSD-3-Clause
3d60b4185SPavan Nikhilesh  * Copyright 2017 Cavium, Inc.
4d60b4185SPavan Nikhilesh  */
5d60b4185SPavan Nikhilesh 
6d60b4185SPavan Nikhilesh #include "test_pipeline_common.h"
7d60b4185SPavan Nikhilesh 
843d162bcSThomas Monjalon /* See http://doc.dpdk.org/guides/tools/testeventdev.html for test details */
9d60b4185SPavan Nikhilesh 
10d60b4185SPavan Nikhilesh static __rte_always_inline int
pipeline_queue_nb_event_queues(struct evt_options * opt)11d60b4185SPavan Nikhilesh pipeline_queue_nb_event_queues(struct evt_options *opt)
12d60b4185SPavan Nikhilesh {
13d9a42a69SThomas Monjalon 	uint16_t eth_count = rte_eth_dev_count_avail();
14d60b4185SPavan Nikhilesh 
15d60b4185SPavan Nikhilesh 	return (eth_count * opt->nb_stages) + eth_count;
16d60b4185SPavan Nikhilesh }
17d60b4185SPavan Nikhilesh 
182eaa37b8SPavan Nikhilesh typedef int (*pipeline_queue_worker_t)(void *arg);
192eaa37b8SPavan Nikhilesh 
20032a965aSPavan Nikhilesh static __rte_noinline int
pipeline_queue_worker_single_stage_tx(void * arg)21314bcf58SPavan Nikhilesh pipeline_queue_worker_single_stage_tx(void *arg)
22314bcf58SPavan Nikhilesh {
23f26320a6SPavan Nikhilesh 	PIPELINE_WORKER_SINGLE_STAGE_INIT;
24*f0b68c0bSPavan Nikhilesh 	uint8_t enq = 0, deq = 0;
25314bcf58SPavan Nikhilesh 
26314bcf58SPavan Nikhilesh 	while (t->done == false) {
27*f0b68c0bSPavan Nikhilesh 		deq = rte_event_dequeue_burst(dev, port, &ev, 1, 0);
28314bcf58SPavan Nikhilesh 
29*f0b68c0bSPavan Nikhilesh 		if (!deq) {
30314bcf58SPavan Nikhilesh 			rte_pause();
31314bcf58SPavan Nikhilesh 			continue;
32314bcf58SPavan Nikhilesh 		}
33314bcf58SPavan Nikhilesh 
34314bcf58SPavan Nikhilesh 		if (ev.sched_type == RTE_SCHED_TYPE_ATOMIC) {
35*f0b68c0bSPavan Nikhilesh 			enq = pipeline_event_tx(dev, port, &ev, t);
36*f0b68c0bSPavan Nikhilesh 			ev.op = RTE_EVENT_OP_RELEASE;
37314bcf58SPavan Nikhilesh 			w->processed_pkts++;
38314bcf58SPavan Nikhilesh 		} else {
39314bcf58SPavan Nikhilesh 			ev.queue_id++;
40314bcf58SPavan Nikhilesh 			pipeline_fwd_event(&ev, RTE_SCHED_TYPE_ATOMIC);
41*f0b68c0bSPavan Nikhilesh 			enq = pipeline_event_enqueue(dev, port, &ev, t);
42314bcf58SPavan Nikhilesh 		}
43314bcf58SPavan Nikhilesh 	}
44*f0b68c0bSPavan Nikhilesh 	pipeline_worker_cleanup(dev, port, &ev, enq, deq);
45314bcf58SPavan Nikhilesh 
46314bcf58SPavan Nikhilesh 	return 0;
47314bcf58SPavan Nikhilesh }
48314bcf58SPavan Nikhilesh 
49032a965aSPavan Nikhilesh static __rte_noinline int
pipeline_queue_worker_single_stage_fwd(void * arg)50314bcf58SPavan Nikhilesh pipeline_queue_worker_single_stage_fwd(void *arg)
51314bcf58SPavan Nikhilesh {
52f26320a6SPavan Nikhilesh 	PIPELINE_WORKER_SINGLE_STAGE_INIT;
53032a965aSPavan Nikhilesh 	const uint8_t *tx_queue = t->tx_evqueue_id;
54*f0b68c0bSPavan Nikhilesh 	uint8_t enq = 0, deq = 0;
55314bcf58SPavan Nikhilesh 
56314bcf58SPavan Nikhilesh 	while (t->done == false) {
57*f0b68c0bSPavan Nikhilesh 		deq = rte_event_dequeue_burst(dev, port, &ev, 1, 0);
58314bcf58SPavan Nikhilesh 
59*f0b68c0bSPavan Nikhilesh 		if (!deq) {
60314bcf58SPavan Nikhilesh 			rte_pause();
61314bcf58SPavan Nikhilesh 			continue;
62314bcf58SPavan Nikhilesh 		}
63314bcf58SPavan Nikhilesh 
64032a965aSPavan Nikhilesh 		ev.queue_id = tx_queue[ev.mbuf->port];
65032a965aSPavan Nikhilesh 		rte_event_eth_tx_adapter_txq_set(ev.mbuf, 0);
66314bcf58SPavan Nikhilesh 		pipeline_fwd_event(&ev, RTE_SCHED_TYPE_ATOMIC);
67*f0b68c0bSPavan Nikhilesh 		enq = pipeline_event_enqueue(dev, port, &ev, t);
68314bcf58SPavan Nikhilesh 		w->processed_pkts++;
69314bcf58SPavan Nikhilesh 	}
70*f0b68c0bSPavan Nikhilesh 	pipeline_worker_cleanup(dev, port, &ev, enq, deq);
71314bcf58SPavan Nikhilesh 
72314bcf58SPavan Nikhilesh 	return 0;
73314bcf58SPavan Nikhilesh }
74314bcf58SPavan Nikhilesh 
75032a965aSPavan Nikhilesh static __rte_noinline int
pipeline_queue_worker_single_stage_burst_tx(void * arg)76314bcf58SPavan Nikhilesh pipeline_queue_worker_single_stage_burst_tx(void *arg)
77314bcf58SPavan Nikhilesh {
78f26320a6SPavan Nikhilesh 	PIPELINE_WORKER_SINGLE_STAGE_BURST_INIT;
79*f0b68c0bSPavan Nikhilesh 	uint16_t nb_rx = 0, nb_tx = 0;
80314bcf58SPavan Nikhilesh 
81314bcf58SPavan Nikhilesh 	while (t->done == false) {
82*f0b68c0bSPavan Nikhilesh 		nb_rx = rte_event_dequeue_burst(dev, port, ev, BURST_SIZE, 0);
83314bcf58SPavan Nikhilesh 
84314bcf58SPavan Nikhilesh 		if (!nb_rx) {
85314bcf58SPavan Nikhilesh 			rte_pause();
86314bcf58SPavan Nikhilesh 			continue;
87314bcf58SPavan Nikhilesh 		}
88314bcf58SPavan Nikhilesh 
89314bcf58SPavan Nikhilesh 		for (i = 0; i < nb_rx; i++) {
90314bcf58SPavan Nikhilesh 			rte_prefetch0(ev[i + 1].mbuf);
91314bcf58SPavan Nikhilesh 			if (ev[i].sched_type == RTE_SCHED_TYPE_ATOMIC) {
92*f0b68c0bSPavan Nikhilesh 				pipeline_event_tx(dev, port, &ev[i], t);
93*f0b68c0bSPavan Nikhilesh 				ev[i].op = RTE_EVENT_OP_RELEASE;
94314bcf58SPavan Nikhilesh 				w->processed_pkts++;
95314bcf58SPavan Nikhilesh 			} else {
96314bcf58SPavan Nikhilesh 				ev[i].queue_id++;
97314bcf58SPavan Nikhilesh 				pipeline_fwd_event(&ev[i],
98314bcf58SPavan Nikhilesh 						RTE_SCHED_TYPE_ATOMIC);
99314bcf58SPavan Nikhilesh 			}
100314bcf58SPavan Nikhilesh 		}
101*f0b68c0bSPavan Nikhilesh 		nb_tx = pipeline_event_enqueue_burst(dev, port, ev, nb_rx, t);
102314bcf58SPavan Nikhilesh 	}
103*f0b68c0bSPavan Nikhilesh 	pipeline_worker_cleanup(dev, port, ev, nb_tx, nb_rx);
104314bcf58SPavan Nikhilesh 
105314bcf58SPavan Nikhilesh 	return 0;
106314bcf58SPavan Nikhilesh }
107314bcf58SPavan Nikhilesh 
108032a965aSPavan Nikhilesh static __rte_noinline int
pipeline_queue_worker_single_stage_burst_fwd(void * arg)109314bcf58SPavan Nikhilesh pipeline_queue_worker_single_stage_burst_fwd(void *arg)
110314bcf58SPavan Nikhilesh {
111f26320a6SPavan Nikhilesh 	PIPELINE_WORKER_SINGLE_STAGE_BURST_INIT;
112032a965aSPavan Nikhilesh 	const uint8_t *tx_queue = t->tx_evqueue_id;
113*f0b68c0bSPavan Nikhilesh 	uint16_t nb_rx = 0, nb_tx = 0;
114314bcf58SPavan Nikhilesh 
115314bcf58SPavan Nikhilesh 	while (t->done == false) {
116*f0b68c0bSPavan Nikhilesh 		nb_rx = rte_event_dequeue_burst(dev, port, ev, BURST_SIZE, 0);
117314bcf58SPavan Nikhilesh 
118314bcf58SPavan Nikhilesh 		if (!nb_rx) {
119314bcf58SPavan Nikhilesh 			rte_pause();
120314bcf58SPavan Nikhilesh 			continue;
121314bcf58SPavan Nikhilesh 		}
122314bcf58SPavan Nikhilesh 
123314bcf58SPavan Nikhilesh 		for (i = 0; i < nb_rx; i++) {
124314bcf58SPavan Nikhilesh 			rte_prefetch0(ev[i + 1].mbuf);
125032a965aSPavan Nikhilesh 			ev[i].queue_id = tx_queue[ev[i].mbuf->port];
126032a965aSPavan Nikhilesh 			rte_event_eth_tx_adapter_txq_set(ev[i].mbuf, 0);
127314bcf58SPavan Nikhilesh 			pipeline_fwd_event(&ev[i], RTE_SCHED_TYPE_ATOMIC);
128314bcf58SPavan Nikhilesh 		}
129314bcf58SPavan Nikhilesh 
130*f0b68c0bSPavan Nikhilesh 		nb_tx = pipeline_event_enqueue_burst(dev, port, ev, nb_rx, t);
131032a965aSPavan Nikhilesh 		w->processed_pkts += nb_rx;
132314bcf58SPavan Nikhilesh 	}
133*f0b68c0bSPavan Nikhilesh 	pipeline_worker_cleanup(dev, port, ev, nb_tx, nb_rx);
134314bcf58SPavan Nikhilesh 
135314bcf58SPavan Nikhilesh 	return 0;
136314bcf58SPavan Nikhilesh }
137314bcf58SPavan Nikhilesh 
1382eaa37b8SPavan Nikhilesh static __rte_noinline int
pipeline_queue_worker_single_stage_tx_vector(void * arg)1392eaa37b8SPavan Nikhilesh pipeline_queue_worker_single_stage_tx_vector(void *arg)
1402eaa37b8SPavan Nikhilesh {
1412eaa37b8SPavan Nikhilesh 	PIPELINE_WORKER_SINGLE_STAGE_INIT;
142*f0b68c0bSPavan Nikhilesh 	uint8_t enq = 0, deq = 0;
1432eaa37b8SPavan Nikhilesh 	uint16_t vector_sz;
1442eaa37b8SPavan Nikhilesh 
1452eaa37b8SPavan Nikhilesh 	while (!t->done) {
146*f0b68c0bSPavan Nikhilesh 		deq = rte_event_dequeue_burst(dev, port, &ev, 1, 0);
1472eaa37b8SPavan Nikhilesh 
148*f0b68c0bSPavan Nikhilesh 		if (!deq) {
1492eaa37b8SPavan Nikhilesh 			rte_pause();
1502eaa37b8SPavan Nikhilesh 			continue;
1512eaa37b8SPavan Nikhilesh 		}
1522eaa37b8SPavan Nikhilesh 
1532eaa37b8SPavan Nikhilesh 		if (ev.sched_type == RTE_SCHED_TYPE_ATOMIC) {
1542eaa37b8SPavan Nikhilesh 			vector_sz = ev.vec->nb_elem;
155*f0b68c0bSPavan Nikhilesh 			enq = pipeline_event_tx_vector(dev, port, &ev, t);
156*f0b68c0bSPavan Nikhilesh 			ev.op = RTE_EVENT_OP_RELEASE;
1572eaa37b8SPavan Nikhilesh 			w->processed_pkts += vector_sz;
1582eaa37b8SPavan Nikhilesh 		} else {
1592eaa37b8SPavan Nikhilesh 			ev.queue_id++;
1602eaa37b8SPavan Nikhilesh 			pipeline_fwd_event_vector(&ev, RTE_SCHED_TYPE_ATOMIC);
161*f0b68c0bSPavan Nikhilesh 			enq = pipeline_event_enqueue(dev, port, &ev, t);
1622eaa37b8SPavan Nikhilesh 		}
1632eaa37b8SPavan Nikhilesh 	}
164*f0b68c0bSPavan Nikhilesh 	pipeline_worker_cleanup(dev, port, &ev, enq, deq);
1652eaa37b8SPavan Nikhilesh 
1662eaa37b8SPavan Nikhilesh 	return 0;
1672eaa37b8SPavan Nikhilesh }
1682eaa37b8SPavan Nikhilesh 
1692eaa37b8SPavan Nikhilesh static __rte_noinline int
pipeline_queue_worker_single_stage_fwd_vector(void * arg)1702eaa37b8SPavan Nikhilesh pipeline_queue_worker_single_stage_fwd_vector(void *arg)
1712eaa37b8SPavan Nikhilesh {
1722eaa37b8SPavan Nikhilesh 	PIPELINE_WORKER_SINGLE_STAGE_INIT;
1732eaa37b8SPavan Nikhilesh 	const uint8_t *tx_queue = t->tx_evqueue_id;
174*f0b68c0bSPavan Nikhilesh 	uint8_t enq = 0, deq = 0;
1752eaa37b8SPavan Nikhilesh 	uint16_t vector_sz;
1762eaa37b8SPavan Nikhilesh 
1772eaa37b8SPavan Nikhilesh 	while (!t->done) {
178*f0b68c0bSPavan Nikhilesh 		deq = rte_event_dequeue_burst(dev, port, &ev, 1, 0);
1792eaa37b8SPavan Nikhilesh 
180*f0b68c0bSPavan Nikhilesh 		if (!deq) {
1812eaa37b8SPavan Nikhilesh 			rte_pause();
1822eaa37b8SPavan Nikhilesh 			continue;
1832eaa37b8SPavan Nikhilesh 		}
1842eaa37b8SPavan Nikhilesh 
1852eaa37b8SPavan Nikhilesh 		ev.queue_id = tx_queue[ev.vec->port];
1862eaa37b8SPavan Nikhilesh 		ev.vec->queue = 0;
1872eaa37b8SPavan Nikhilesh 		vector_sz = ev.vec->nb_elem;
1882eaa37b8SPavan Nikhilesh 		pipeline_fwd_event_vector(&ev, RTE_SCHED_TYPE_ATOMIC);
189*f0b68c0bSPavan Nikhilesh 		enq = pipeline_event_enqueue(dev, port, &ev, t);
1902eaa37b8SPavan Nikhilesh 		w->processed_pkts += vector_sz;
1912eaa37b8SPavan Nikhilesh 	}
192*f0b68c0bSPavan Nikhilesh 	pipeline_worker_cleanup(dev, port, &ev, enq, deq);
1932eaa37b8SPavan Nikhilesh 
1942eaa37b8SPavan Nikhilesh 	return 0;
1952eaa37b8SPavan Nikhilesh }
1962eaa37b8SPavan Nikhilesh 
1972eaa37b8SPavan Nikhilesh static __rte_noinline int
pipeline_queue_worker_single_stage_burst_tx_vector(void * arg)1982eaa37b8SPavan Nikhilesh pipeline_queue_worker_single_stage_burst_tx_vector(void *arg)
1992eaa37b8SPavan Nikhilesh {
2002eaa37b8SPavan Nikhilesh 	PIPELINE_WORKER_SINGLE_STAGE_BURST_INIT;
201*f0b68c0bSPavan Nikhilesh 	uint16_t nb_rx = 0, nb_tx = 0;
2022eaa37b8SPavan Nikhilesh 	uint16_t vector_sz;
2032eaa37b8SPavan Nikhilesh 
2042eaa37b8SPavan Nikhilesh 	while (!t->done) {
205*f0b68c0bSPavan Nikhilesh 		nb_rx = rte_event_dequeue_burst(dev, port, ev, BURST_SIZE, 0);
2062eaa37b8SPavan Nikhilesh 
2072eaa37b8SPavan Nikhilesh 		if (!nb_rx) {
2082eaa37b8SPavan Nikhilesh 			rte_pause();
2092eaa37b8SPavan Nikhilesh 			continue;
2102eaa37b8SPavan Nikhilesh 		}
2112eaa37b8SPavan Nikhilesh 
2122eaa37b8SPavan Nikhilesh 		for (i = 0; i < nb_rx; i++) {
2132eaa37b8SPavan Nikhilesh 			if (ev[i].sched_type == RTE_SCHED_TYPE_ATOMIC) {
2142eaa37b8SPavan Nikhilesh 				vector_sz = ev[i].vec->nb_elem;
215*f0b68c0bSPavan Nikhilesh 				pipeline_event_tx_vector(dev, port, &ev[i], t);
2162eaa37b8SPavan Nikhilesh 				ev[i].op = RTE_EVENT_OP_RELEASE;
2172eaa37b8SPavan Nikhilesh 				w->processed_pkts += vector_sz;
2182eaa37b8SPavan Nikhilesh 			} else {
2192eaa37b8SPavan Nikhilesh 				ev[i].queue_id++;
2202eaa37b8SPavan Nikhilesh 				pipeline_fwd_event_vector(
2212eaa37b8SPavan Nikhilesh 					&ev[i], RTE_SCHED_TYPE_ATOMIC);
2222eaa37b8SPavan Nikhilesh 			}
2232eaa37b8SPavan Nikhilesh 		}
2242eaa37b8SPavan Nikhilesh 
225*f0b68c0bSPavan Nikhilesh 		nb_tx = pipeline_event_enqueue_burst(dev, port, ev, nb_rx, t);
2262eaa37b8SPavan Nikhilesh 	}
227*f0b68c0bSPavan Nikhilesh 	pipeline_worker_cleanup(dev, port, ev, nb_tx, nb_rx);
2282eaa37b8SPavan Nikhilesh 
2292eaa37b8SPavan Nikhilesh 	return 0;
2302eaa37b8SPavan Nikhilesh }
2312eaa37b8SPavan Nikhilesh 
2322eaa37b8SPavan Nikhilesh static __rte_noinline int
pipeline_queue_worker_single_stage_burst_fwd_vector(void * arg)2332eaa37b8SPavan Nikhilesh pipeline_queue_worker_single_stage_burst_fwd_vector(void *arg)
2342eaa37b8SPavan Nikhilesh {
2352eaa37b8SPavan Nikhilesh 	PIPELINE_WORKER_SINGLE_STAGE_BURST_INIT;
2362eaa37b8SPavan Nikhilesh 	const uint8_t *tx_queue = t->tx_evqueue_id;
237*f0b68c0bSPavan Nikhilesh 	uint16_t nb_rx = 0, nb_tx = 0;
2382eaa37b8SPavan Nikhilesh 	uint16_t vector_sz;
2392eaa37b8SPavan Nikhilesh 
2402eaa37b8SPavan Nikhilesh 	while (!t->done) {
241*f0b68c0bSPavan Nikhilesh 		nb_rx = rte_event_dequeue_burst(dev, port, ev, BURST_SIZE, 0);
2422eaa37b8SPavan Nikhilesh 
2432eaa37b8SPavan Nikhilesh 		if (!nb_rx) {
2442eaa37b8SPavan Nikhilesh 			rte_pause();
2452eaa37b8SPavan Nikhilesh 			continue;
2462eaa37b8SPavan Nikhilesh 		}
2472eaa37b8SPavan Nikhilesh 
2482eaa37b8SPavan Nikhilesh 		vector_sz = 0;
2492eaa37b8SPavan Nikhilesh 		for (i = 0; i < nb_rx; i++) {
2502eaa37b8SPavan Nikhilesh 			ev[i].queue_id = tx_queue[ev[i].vec->port];
2512eaa37b8SPavan Nikhilesh 			ev[i].vec->queue = 0;
2522eaa37b8SPavan Nikhilesh 			vector_sz += ev[i].vec->nb_elem;
2532eaa37b8SPavan Nikhilesh 			pipeline_fwd_event_vector(&ev[i],
2542eaa37b8SPavan Nikhilesh 						  RTE_SCHED_TYPE_ATOMIC);
2552eaa37b8SPavan Nikhilesh 		}
2562eaa37b8SPavan Nikhilesh 
257*f0b68c0bSPavan Nikhilesh 		nb_tx = pipeline_event_enqueue_burst(dev, port, ev, nb_rx, t);
2582eaa37b8SPavan Nikhilesh 		w->processed_pkts += vector_sz;
2592eaa37b8SPavan Nikhilesh 	}
260*f0b68c0bSPavan Nikhilesh 	pipeline_worker_cleanup(dev, port, ev, nb_tx, nb_rx);
2612eaa37b8SPavan Nikhilesh 
2622eaa37b8SPavan Nikhilesh 	return 0;
2632eaa37b8SPavan Nikhilesh }
264314bcf58SPavan Nikhilesh 
265032a965aSPavan Nikhilesh static __rte_noinline int
pipeline_queue_worker_multi_stage_tx(void * arg)266314bcf58SPavan Nikhilesh pipeline_queue_worker_multi_stage_tx(void *arg)
267314bcf58SPavan Nikhilesh {
268f26320a6SPavan Nikhilesh 	PIPELINE_WORKER_MULTI_STAGE_INIT;
269032a965aSPavan Nikhilesh 	const uint8_t *tx_queue = t->tx_evqueue_id;
270*f0b68c0bSPavan Nikhilesh 	uint8_t enq = 0, deq = 0;
271314bcf58SPavan Nikhilesh 
272314bcf58SPavan Nikhilesh 	while (t->done == false) {
273*f0b68c0bSPavan Nikhilesh 		deq = rte_event_dequeue_burst(dev, port, &ev, 1, 0);
274314bcf58SPavan Nikhilesh 
275*f0b68c0bSPavan Nikhilesh 		if (!deq) {
276314bcf58SPavan Nikhilesh 			rte_pause();
277314bcf58SPavan Nikhilesh 			continue;
278314bcf58SPavan Nikhilesh 		}
279314bcf58SPavan Nikhilesh 
280314bcf58SPavan Nikhilesh 		cq_id = ev.queue_id % nb_stages;
281314bcf58SPavan Nikhilesh 
282032a965aSPavan Nikhilesh 		if (ev.queue_id == tx_queue[ev.mbuf->port]) {
283*f0b68c0bSPavan Nikhilesh 			enq = pipeline_event_tx(dev, port, &ev, t);
284*f0b68c0bSPavan Nikhilesh 			ev.op = RTE_EVENT_OP_RELEASE;
285314bcf58SPavan Nikhilesh 			w->processed_pkts++;
286314bcf58SPavan Nikhilesh 			continue;
287314bcf58SPavan Nikhilesh 		}
288314bcf58SPavan Nikhilesh 
289032a965aSPavan Nikhilesh 		ev.queue_id++;
290032a965aSPavan Nikhilesh 		pipeline_fwd_event(&ev, cq_id != last_queue ?
291032a965aSPavan Nikhilesh 				sched_type_list[cq_id] :
292032a965aSPavan Nikhilesh 				RTE_SCHED_TYPE_ATOMIC);
293*f0b68c0bSPavan Nikhilesh 		enq = pipeline_event_enqueue(dev, port, &ev, t);
294314bcf58SPavan Nikhilesh 	}
295*f0b68c0bSPavan Nikhilesh 	pipeline_worker_cleanup(dev, port, &ev, enq, deq);
296032a965aSPavan Nikhilesh 
297314bcf58SPavan Nikhilesh 	return 0;
298314bcf58SPavan Nikhilesh }
299314bcf58SPavan Nikhilesh 
300032a965aSPavan Nikhilesh static __rte_noinline int
pipeline_queue_worker_multi_stage_fwd(void * arg)301314bcf58SPavan Nikhilesh pipeline_queue_worker_multi_stage_fwd(void *arg)
302314bcf58SPavan Nikhilesh {
303f26320a6SPavan Nikhilesh 	PIPELINE_WORKER_MULTI_STAGE_INIT;
304032a965aSPavan Nikhilesh 	const uint8_t *tx_queue = t->tx_evqueue_id;
305*f0b68c0bSPavan Nikhilesh 	uint8_t enq = 0, deq = 0;
306314bcf58SPavan Nikhilesh 
307314bcf58SPavan Nikhilesh 	while (t->done == false) {
308*f0b68c0bSPavan Nikhilesh 		deq = rte_event_dequeue_burst(dev, port, &ev, 1, 0);
309314bcf58SPavan Nikhilesh 
310*f0b68c0bSPavan Nikhilesh 		if (!deq) {
311314bcf58SPavan Nikhilesh 			rte_pause();
312314bcf58SPavan Nikhilesh 			continue;
313314bcf58SPavan Nikhilesh 		}
314314bcf58SPavan Nikhilesh 
315314bcf58SPavan Nikhilesh 		cq_id = ev.queue_id % nb_stages;
316314bcf58SPavan Nikhilesh 
317314bcf58SPavan Nikhilesh 		if (cq_id == last_queue) {
318032a965aSPavan Nikhilesh 			ev.queue_id = tx_queue[ev.mbuf->port];
319032a965aSPavan Nikhilesh 			rte_event_eth_tx_adapter_txq_set(ev.mbuf, 0);
320314bcf58SPavan Nikhilesh 			pipeline_fwd_event(&ev, RTE_SCHED_TYPE_ATOMIC);
321*f0b68c0bSPavan Nikhilesh 			enq = pipeline_event_enqueue(dev, port, &ev, t);
322314bcf58SPavan Nikhilesh 			w->processed_pkts++;
323314bcf58SPavan Nikhilesh 		} else {
324314bcf58SPavan Nikhilesh 			ev.queue_id++;
325314bcf58SPavan Nikhilesh 			pipeline_fwd_event(&ev, sched_type_list[cq_id]);
326*f0b68c0bSPavan Nikhilesh 			enq = pipeline_event_enqueue(dev, port, &ev, t);
327314bcf58SPavan Nikhilesh 		}
328e0c05737SFeifei Wang 	}
329*f0b68c0bSPavan Nikhilesh 	pipeline_worker_cleanup(dev, port, &ev, enq, deq);
330032a965aSPavan Nikhilesh 
331314bcf58SPavan Nikhilesh 	return 0;
332314bcf58SPavan Nikhilesh }
333314bcf58SPavan Nikhilesh 
334032a965aSPavan Nikhilesh static __rte_noinline int
pipeline_queue_worker_multi_stage_burst_tx(void * arg)335314bcf58SPavan Nikhilesh pipeline_queue_worker_multi_stage_burst_tx(void *arg)
336314bcf58SPavan Nikhilesh {
337f26320a6SPavan Nikhilesh 	PIPELINE_WORKER_MULTI_STAGE_BURST_INIT;
338032a965aSPavan Nikhilesh 	const uint8_t *tx_queue = t->tx_evqueue_id;
339*f0b68c0bSPavan Nikhilesh 	uint16_t nb_rx = 0, nb_tx = 0;
340314bcf58SPavan Nikhilesh 
341314bcf58SPavan Nikhilesh 	while (t->done == false) {
342*f0b68c0bSPavan Nikhilesh 		nb_rx = rte_event_dequeue_burst(dev, port, ev, BURST_SIZE, 0);
343314bcf58SPavan Nikhilesh 
344314bcf58SPavan Nikhilesh 		if (!nb_rx) {
345314bcf58SPavan Nikhilesh 			rte_pause();
346314bcf58SPavan Nikhilesh 			continue;
347314bcf58SPavan Nikhilesh 		}
348314bcf58SPavan Nikhilesh 
349314bcf58SPavan Nikhilesh 		for (i = 0; i < nb_rx; i++) {
350314bcf58SPavan Nikhilesh 			rte_prefetch0(ev[i + 1].mbuf);
351314bcf58SPavan Nikhilesh 			cq_id = ev[i].queue_id % nb_stages;
352314bcf58SPavan Nikhilesh 
353032a965aSPavan Nikhilesh 			if (ev[i].queue_id == tx_queue[ev[i].mbuf->port]) {
354*f0b68c0bSPavan Nikhilesh 				pipeline_event_tx(dev, port, &ev[i], t);
355*f0b68c0bSPavan Nikhilesh 				ev[i].op = RTE_EVENT_OP_RELEASE;
356314bcf58SPavan Nikhilesh 				w->processed_pkts++;
357314bcf58SPavan Nikhilesh 				continue;
358314bcf58SPavan Nikhilesh 			}
359314bcf58SPavan Nikhilesh 
360314bcf58SPavan Nikhilesh 			ev[i].queue_id++;
361032a965aSPavan Nikhilesh 			pipeline_fwd_event(&ev[i], cq_id != last_queue ?
362032a965aSPavan Nikhilesh 					sched_type_list[cq_id] :
363032a965aSPavan Nikhilesh 					RTE_SCHED_TYPE_ATOMIC);
364314bcf58SPavan Nikhilesh 		}
365*f0b68c0bSPavan Nikhilesh 		nb_tx = pipeline_event_enqueue_burst(dev, port, ev, nb_rx, t);
36621b1ca48SFeifei Wang 	}
367*f0b68c0bSPavan Nikhilesh 	pipeline_worker_cleanup(dev, port, ev, nb_tx, nb_rx);
368032a965aSPavan Nikhilesh 
369314bcf58SPavan Nikhilesh 	return 0;
370314bcf58SPavan Nikhilesh }
371314bcf58SPavan Nikhilesh 
372032a965aSPavan Nikhilesh static __rte_noinline int
pipeline_queue_worker_multi_stage_burst_fwd(void * arg)373314bcf58SPavan Nikhilesh pipeline_queue_worker_multi_stage_burst_fwd(void *arg)
374314bcf58SPavan Nikhilesh {
375f26320a6SPavan Nikhilesh 	PIPELINE_WORKER_MULTI_STAGE_BURST_INIT;
376032a965aSPavan Nikhilesh 	const uint8_t *tx_queue = t->tx_evqueue_id;
377*f0b68c0bSPavan Nikhilesh 	uint16_t nb_rx = 0, nb_tx = 0;
378314bcf58SPavan Nikhilesh 
379314bcf58SPavan Nikhilesh 	while (t->done == false) {
380e0c05737SFeifei Wang 		uint16_t processed_pkts = 0;
381*f0b68c0bSPavan Nikhilesh 		nb_rx = rte_event_dequeue_burst(dev, port, ev, BURST_SIZE, 0);
382314bcf58SPavan Nikhilesh 
383314bcf58SPavan Nikhilesh 		if (!nb_rx) {
384314bcf58SPavan Nikhilesh 			rte_pause();
385314bcf58SPavan Nikhilesh 			continue;
386314bcf58SPavan Nikhilesh 		}
387314bcf58SPavan Nikhilesh 
388314bcf58SPavan Nikhilesh 		for (i = 0; i < nb_rx; i++) {
389314bcf58SPavan Nikhilesh 			rte_prefetch0(ev[i + 1].mbuf);
390314bcf58SPavan Nikhilesh 			cq_id = ev[i].queue_id % nb_stages;
391314bcf58SPavan Nikhilesh 
392314bcf58SPavan Nikhilesh 			if (cq_id == last_queue) {
393032a965aSPavan Nikhilesh 				ev[i].queue_id = tx_queue[ev[i].mbuf->port];
394032a965aSPavan Nikhilesh 				rte_event_eth_tx_adapter_txq_set(ev[i].mbuf, 0);
395314bcf58SPavan Nikhilesh 				pipeline_fwd_event(&ev[i],
396314bcf58SPavan Nikhilesh 						RTE_SCHED_TYPE_ATOMIC);
397e0c05737SFeifei Wang 				processed_pkts++;
398314bcf58SPavan Nikhilesh 			} else {
399314bcf58SPavan Nikhilesh 				ev[i].queue_id++;
400314bcf58SPavan Nikhilesh 				pipeline_fwd_event(&ev[i],
401314bcf58SPavan Nikhilesh 						sched_type_list[cq_id]);
402314bcf58SPavan Nikhilesh 			}
403314bcf58SPavan Nikhilesh 		}
404314bcf58SPavan Nikhilesh 
405*f0b68c0bSPavan Nikhilesh 		nb_tx = pipeline_event_enqueue_burst(dev, port, ev, nb_rx, t);
406e0c05737SFeifei Wang 		w->processed_pkts += processed_pkts;
407314bcf58SPavan Nikhilesh 	}
408*f0b68c0bSPavan Nikhilesh 	pipeline_worker_cleanup(dev, port, ev, nb_tx, nb_rx);
409032a965aSPavan Nikhilesh 
410314bcf58SPavan Nikhilesh 	return 0;
411314bcf58SPavan Nikhilesh }
412314bcf58SPavan Nikhilesh 
4132eaa37b8SPavan Nikhilesh static __rte_noinline int
pipeline_queue_worker_multi_stage_tx_vector(void * arg)4142eaa37b8SPavan Nikhilesh pipeline_queue_worker_multi_stage_tx_vector(void *arg)
4152eaa37b8SPavan Nikhilesh {
4162eaa37b8SPavan Nikhilesh 	PIPELINE_WORKER_MULTI_STAGE_INIT;
4172eaa37b8SPavan Nikhilesh 	const uint8_t *tx_queue = t->tx_evqueue_id;
418*f0b68c0bSPavan Nikhilesh 	uint8_t enq = 0, deq = 0;
4192eaa37b8SPavan Nikhilesh 	uint16_t vector_sz;
4202eaa37b8SPavan Nikhilesh 
4212eaa37b8SPavan Nikhilesh 	while (!t->done) {
422*f0b68c0bSPavan Nikhilesh 		deq = rte_event_dequeue_burst(dev, port, &ev, 1, 0);
4232eaa37b8SPavan Nikhilesh 
424*f0b68c0bSPavan Nikhilesh 		if (!deq) {
4252eaa37b8SPavan Nikhilesh 			rte_pause();
4262eaa37b8SPavan Nikhilesh 			continue;
4272eaa37b8SPavan Nikhilesh 		}
4282eaa37b8SPavan Nikhilesh 
4292eaa37b8SPavan Nikhilesh 		cq_id = ev.queue_id % nb_stages;
4302eaa37b8SPavan Nikhilesh 
4312eaa37b8SPavan Nikhilesh 		if (ev.queue_id == tx_queue[ev.vec->port]) {
4322eaa37b8SPavan Nikhilesh 			vector_sz = ev.vec->nb_elem;
433*f0b68c0bSPavan Nikhilesh 			enq = pipeline_event_tx_vector(dev, port, &ev, t);
4342eaa37b8SPavan Nikhilesh 			w->processed_pkts += vector_sz;
435*f0b68c0bSPavan Nikhilesh 			ev.op = RTE_EVENT_OP_RELEASE;
4362eaa37b8SPavan Nikhilesh 			continue;
4372eaa37b8SPavan Nikhilesh 		}
4382eaa37b8SPavan Nikhilesh 
4392eaa37b8SPavan Nikhilesh 		ev.queue_id++;
4402eaa37b8SPavan Nikhilesh 		pipeline_fwd_event_vector(&ev, cq_id != last_queue
4412eaa37b8SPavan Nikhilesh 						       ? sched_type_list[cq_id]
4422eaa37b8SPavan Nikhilesh 						       : RTE_SCHED_TYPE_ATOMIC);
443*f0b68c0bSPavan Nikhilesh 		enq = pipeline_event_enqueue(dev, port, &ev, t);
4442eaa37b8SPavan Nikhilesh 	}
445*f0b68c0bSPavan Nikhilesh 	pipeline_worker_cleanup(dev, port, &ev, enq, deq);
4462eaa37b8SPavan Nikhilesh 
4472eaa37b8SPavan Nikhilesh 	return 0;
4482eaa37b8SPavan Nikhilesh }
4492eaa37b8SPavan Nikhilesh 
4502eaa37b8SPavan Nikhilesh static __rte_noinline int
pipeline_queue_worker_multi_stage_fwd_vector(void * arg)4512eaa37b8SPavan Nikhilesh pipeline_queue_worker_multi_stage_fwd_vector(void *arg)
4522eaa37b8SPavan Nikhilesh {
4532eaa37b8SPavan Nikhilesh 	PIPELINE_WORKER_MULTI_STAGE_INIT;
4542eaa37b8SPavan Nikhilesh 	const uint8_t *tx_queue = t->tx_evqueue_id;
455*f0b68c0bSPavan Nikhilesh 	uint8_t enq = 0, deq = 0;
4562eaa37b8SPavan Nikhilesh 	uint16_t vector_sz;
4572eaa37b8SPavan Nikhilesh 
4582eaa37b8SPavan Nikhilesh 	while (!t->done) {
459*f0b68c0bSPavan Nikhilesh 		deq = rte_event_dequeue_burst(dev, port, &ev, 1, 0);
4602eaa37b8SPavan Nikhilesh 
461*f0b68c0bSPavan Nikhilesh 		if (!deq) {
4622eaa37b8SPavan Nikhilesh 			rte_pause();
4632eaa37b8SPavan Nikhilesh 			continue;
4642eaa37b8SPavan Nikhilesh 		}
4652eaa37b8SPavan Nikhilesh 
4662eaa37b8SPavan Nikhilesh 		cq_id = ev.queue_id % nb_stages;
4672eaa37b8SPavan Nikhilesh 
4682eaa37b8SPavan Nikhilesh 		if (cq_id == last_queue) {
4692eaa37b8SPavan Nikhilesh 			vector_sz = ev.vec->nb_elem;
4702eaa37b8SPavan Nikhilesh 			ev.queue_id = tx_queue[ev.vec->port];
4712eaa37b8SPavan Nikhilesh 			pipeline_fwd_event_vector(&ev, RTE_SCHED_TYPE_ATOMIC);
4722eaa37b8SPavan Nikhilesh 			w->processed_pkts += vector_sz;
4732eaa37b8SPavan Nikhilesh 		} else {
4742eaa37b8SPavan Nikhilesh 			ev.queue_id++;
4752eaa37b8SPavan Nikhilesh 			pipeline_fwd_event_vector(&ev, sched_type_list[cq_id]);
4762eaa37b8SPavan Nikhilesh 		}
4772eaa37b8SPavan Nikhilesh 
478*f0b68c0bSPavan Nikhilesh 		enq = pipeline_event_enqueue(dev, port, &ev, t);
4792eaa37b8SPavan Nikhilesh 	}
480*f0b68c0bSPavan Nikhilesh 	pipeline_worker_cleanup(dev, port, &ev, enq, deq);
4812eaa37b8SPavan Nikhilesh 
4822eaa37b8SPavan Nikhilesh 	return 0;
4832eaa37b8SPavan Nikhilesh }
4842eaa37b8SPavan Nikhilesh 
4852eaa37b8SPavan Nikhilesh static __rte_noinline int
pipeline_queue_worker_multi_stage_burst_tx_vector(void * arg)4862eaa37b8SPavan Nikhilesh pipeline_queue_worker_multi_stage_burst_tx_vector(void *arg)
4872eaa37b8SPavan Nikhilesh {
4882eaa37b8SPavan Nikhilesh 	PIPELINE_WORKER_MULTI_STAGE_BURST_INIT;
4892eaa37b8SPavan Nikhilesh 	const uint8_t *tx_queue = t->tx_evqueue_id;
490*f0b68c0bSPavan Nikhilesh 	uint16_t nb_rx = 0, nb_tx = 0;
4912eaa37b8SPavan Nikhilesh 	uint16_t vector_sz;
4922eaa37b8SPavan Nikhilesh 
4932eaa37b8SPavan Nikhilesh 	while (!t->done) {
494*f0b68c0bSPavan Nikhilesh 		nb_rx = rte_event_dequeue_burst(dev, port, ev, BURST_SIZE, 0);
4952eaa37b8SPavan Nikhilesh 
4962eaa37b8SPavan Nikhilesh 		if (!nb_rx) {
4972eaa37b8SPavan Nikhilesh 			rte_pause();
4982eaa37b8SPavan Nikhilesh 			continue;
4992eaa37b8SPavan Nikhilesh 		}
5002eaa37b8SPavan Nikhilesh 
5012eaa37b8SPavan Nikhilesh 		for (i = 0; i < nb_rx; i++) {
5022eaa37b8SPavan Nikhilesh 			cq_id = ev[i].queue_id % nb_stages;
5032eaa37b8SPavan Nikhilesh 
5042eaa37b8SPavan Nikhilesh 			if (ev[i].queue_id == tx_queue[ev[i].vec->port]) {
5052eaa37b8SPavan Nikhilesh 				vector_sz = ev[i].vec->nb_elem;
506*f0b68c0bSPavan Nikhilesh 				pipeline_event_tx_vector(dev, port, &ev[i], t);
5072eaa37b8SPavan Nikhilesh 				ev[i].op = RTE_EVENT_OP_RELEASE;
5082eaa37b8SPavan Nikhilesh 				w->processed_pkts += vector_sz;
5092eaa37b8SPavan Nikhilesh 				continue;
5102eaa37b8SPavan Nikhilesh 			}
5112eaa37b8SPavan Nikhilesh 
5122eaa37b8SPavan Nikhilesh 			ev[i].queue_id++;
5132eaa37b8SPavan Nikhilesh 			pipeline_fwd_event_vector(
5142eaa37b8SPavan Nikhilesh 				&ev[i], cq_id != last_queue
5152eaa37b8SPavan Nikhilesh 						? sched_type_list[cq_id]
5162eaa37b8SPavan Nikhilesh 						: RTE_SCHED_TYPE_ATOMIC);
5172eaa37b8SPavan Nikhilesh 		}
5182eaa37b8SPavan Nikhilesh 
519*f0b68c0bSPavan Nikhilesh 		nb_tx = pipeline_event_enqueue_burst(dev, port, ev, nb_rx, t);
5202eaa37b8SPavan Nikhilesh 	}
521*f0b68c0bSPavan Nikhilesh 	pipeline_worker_cleanup(dev, port, ev, nb_tx, nb_rx);
5222eaa37b8SPavan Nikhilesh 
5232eaa37b8SPavan Nikhilesh 	return 0;
5242eaa37b8SPavan Nikhilesh }
5252eaa37b8SPavan Nikhilesh 
5262eaa37b8SPavan Nikhilesh static __rte_noinline int
pipeline_queue_worker_multi_stage_burst_fwd_vector(void * arg)5272eaa37b8SPavan Nikhilesh pipeline_queue_worker_multi_stage_burst_fwd_vector(void *arg)
5282eaa37b8SPavan Nikhilesh {
5292eaa37b8SPavan Nikhilesh 	PIPELINE_WORKER_MULTI_STAGE_BURST_INIT;
5302eaa37b8SPavan Nikhilesh 	const uint8_t *tx_queue = t->tx_evqueue_id;
531*f0b68c0bSPavan Nikhilesh 	uint16_t nb_rx = 0, nb_tx = 0;
5322eaa37b8SPavan Nikhilesh 	uint16_t vector_sz;
5332eaa37b8SPavan Nikhilesh 
5342eaa37b8SPavan Nikhilesh 	while (!t->done) {
535*f0b68c0bSPavan Nikhilesh 		nb_rx = rte_event_dequeue_burst(dev, port, ev, BURST_SIZE, 0);
5362eaa37b8SPavan Nikhilesh 
5372eaa37b8SPavan Nikhilesh 		if (!nb_rx) {
5382eaa37b8SPavan Nikhilesh 			rte_pause();
5392eaa37b8SPavan Nikhilesh 			continue;
5402eaa37b8SPavan Nikhilesh 		}
5412eaa37b8SPavan Nikhilesh 
5422eaa37b8SPavan Nikhilesh 		for (i = 0; i < nb_rx; i++) {
5432eaa37b8SPavan Nikhilesh 			cq_id = ev[i].queue_id % nb_stages;
5442eaa37b8SPavan Nikhilesh 
5452eaa37b8SPavan Nikhilesh 			if (cq_id == last_queue) {
5462eaa37b8SPavan Nikhilesh 				ev[i].queue_id = tx_queue[ev[i].vec->port];
5472eaa37b8SPavan Nikhilesh 				vector_sz = ev[i].vec->nb_elem;
5482eaa37b8SPavan Nikhilesh 				pipeline_fwd_event_vector(
5492eaa37b8SPavan Nikhilesh 					&ev[i], RTE_SCHED_TYPE_ATOMIC);
5502eaa37b8SPavan Nikhilesh 				w->processed_pkts += vector_sz;
5512eaa37b8SPavan Nikhilesh 			} else {
5522eaa37b8SPavan Nikhilesh 				ev[i].queue_id++;
5532eaa37b8SPavan Nikhilesh 				pipeline_fwd_event_vector(
5542eaa37b8SPavan Nikhilesh 					&ev[i], sched_type_list[cq_id]);
5552eaa37b8SPavan Nikhilesh 			}
5562eaa37b8SPavan Nikhilesh 		}
5572eaa37b8SPavan Nikhilesh 
558*f0b68c0bSPavan Nikhilesh 		nb_tx = pipeline_event_enqueue_burst(dev, port, ev, nb_rx, t);
5592eaa37b8SPavan Nikhilesh 	}
560*f0b68c0bSPavan Nikhilesh 	pipeline_worker_cleanup(dev, port, ev, nb_tx, nb_rx);
5612eaa37b8SPavan Nikhilesh 
5622eaa37b8SPavan Nikhilesh 	return 0;
5632eaa37b8SPavan Nikhilesh }
5642eaa37b8SPavan Nikhilesh 
565314bcf58SPavan Nikhilesh static int
worker_wrapper(void * arg)566d60b4185SPavan Nikhilesh worker_wrapper(void *arg)
567d60b4185SPavan Nikhilesh {
568314bcf58SPavan Nikhilesh 	struct worker_data *w  = arg;
569314bcf58SPavan Nikhilesh 	struct evt_options *opt = w->t->opt;
570314bcf58SPavan Nikhilesh 	const bool burst = evt_has_burst_mode(w->dev_id);
571032a965aSPavan Nikhilesh 	const bool internal_port = w->t->internal_port;
572314bcf58SPavan Nikhilesh 	const uint8_t nb_stages = opt->nb_stages;
5732eaa37b8SPavan Nikhilesh 	/*vector/burst/internal_port*/
5742eaa37b8SPavan Nikhilesh 	const pipeline_queue_worker_t
5752eaa37b8SPavan Nikhilesh 	pipeline_queue_worker_single_stage[2][2][2] = {
5762eaa37b8SPavan Nikhilesh 		[0][0][0] = pipeline_queue_worker_single_stage_fwd,
5772eaa37b8SPavan Nikhilesh 		[0][0][1] = pipeline_queue_worker_single_stage_tx,
5782eaa37b8SPavan Nikhilesh 		[0][1][0] = pipeline_queue_worker_single_stage_burst_fwd,
5792eaa37b8SPavan Nikhilesh 		[0][1][1] = pipeline_queue_worker_single_stage_burst_tx,
5802eaa37b8SPavan Nikhilesh 		[1][0][0] = pipeline_queue_worker_single_stage_fwd_vector,
5812eaa37b8SPavan Nikhilesh 		[1][0][1] = pipeline_queue_worker_single_stage_tx_vector,
5822eaa37b8SPavan Nikhilesh 		[1][1][0] = pipeline_queue_worker_single_stage_burst_fwd_vector,
5832eaa37b8SPavan Nikhilesh 		[1][1][1] = pipeline_queue_worker_single_stage_burst_tx_vector,
5842eaa37b8SPavan Nikhilesh 	};
5852eaa37b8SPavan Nikhilesh 	const pipeline_queue_worker_t
5862eaa37b8SPavan Nikhilesh 	pipeline_queue_worker_multi_stage[2][2][2] = {
5872eaa37b8SPavan Nikhilesh 		[0][0][0] = pipeline_queue_worker_multi_stage_fwd,
5882eaa37b8SPavan Nikhilesh 		[0][0][1] = pipeline_queue_worker_multi_stage_tx,
5892eaa37b8SPavan Nikhilesh 		[0][1][0] = pipeline_queue_worker_multi_stage_burst_fwd,
5902eaa37b8SPavan Nikhilesh 		[0][1][1] = pipeline_queue_worker_multi_stage_burst_tx,
5912eaa37b8SPavan Nikhilesh 		[1][0][0] = pipeline_queue_worker_multi_stage_fwd_vector,
5922eaa37b8SPavan Nikhilesh 		[1][0][1] = pipeline_queue_worker_multi_stage_tx_vector,
5932eaa37b8SPavan Nikhilesh 		[1][1][0] = pipeline_queue_worker_multi_stage_burst_fwd_vector,
5942eaa37b8SPavan Nikhilesh 		[1][1][1] = pipeline_queue_worker_multi_stage_burst_tx_vector,
5952eaa37b8SPavan Nikhilesh 	};
596314bcf58SPavan Nikhilesh 
5972eaa37b8SPavan Nikhilesh 	if (nb_stages == 1)
5982eaa37b8SPavan Nikhilesh 		return (pipeline_queue_worker_single_stage[opt->ena_vector]
5992eaa37b8SPavan Nikhilesh 							  [burst]
6002eaa37b8SPavan Nikhilesh 							  [internal_port])(arg);
6012eaa37b8SPavan Nikhilesh 	else
6022eaa37b8SPavan Nikhilesh 		return (pipeline_queue_worker_multi_stage[opt->ena_vector]
6032eaa37b8SPavan Nikhilesh 							 [burst]
6042eaa37b8SPavan Nikhilesh 							 [internal_port])(arg);
605314bcf58SPavan Nikhilesh 
606d60b4185SPavan Nikhilesh 	rte_panic("invalid worker\n");
607d60b4185SPavan Nikhilesh }
608d60b4185SPavan Nikhilesh 
609d60b4185SPavan Nikhilesh static int
pipeline_queue_launch_lcores(struct evt_test * test,struct evt_options * opt)610d60b4185SPavan Nikhilesh pipeline_queue_launch_lcores(struct evt_test *test, struct evt_options *opt)
611d60b4185SPavan Nikhilesh {
612d60b4185SPavan Nikhilesh 	return pipeline_launch_lcores(test, opt, worker_wrapper);
613d60b4185SPavan Nikhilesh }
614d60b4185SPavan Nikhilesh 
615d60b4185SPavan Nikhilesh static int
pipeline_queue_eventdev_setup(struct evt_test * test,struct evt_options * opt)616d60b4185SPavan Nikhilesh pipeline_queue_eventdev_setup(struct evt_test *test, struct evt_options *opt)
617d60b4185SPavan Nikhilesh {
618d60b4185SPavan Nikhilesh 	int ret;
619d60b4185SPavan Nikhilesh 	int nb_ports;
620d60b4185SPavan Nikhilesh 	int nb_queues;
621d60b4185SPavan Nikhilesh 	int nb_stages = opt->nb_stages;
622d60b4185SPavan Nikhilesh 	uint8_t queue;
623032a965aSPavan Nikhilesh 	uint8_t tx_evport_id = 0;
624032a965aSPavan Nikhilesh 	uint8_t tx_evqueue_id[RTE_MAX_ETHPORTS];
625d60b4185SPavan Nikhilesh 	uint8_t queue_arr[RTE_EVENT_MAX_QUEUES_PER_DEV];
626d60b4185SPavan Nikhilesh 	uint8_t nb_worker_queues = 0;
627032a965aSPavan Nikhilesh 	uint16_t prod = 0;
628032a965aSPavan Nikhilesh 	struct rte_event_dev_info info;
629032a965aSPavan Nikhilesh 	struct test_pipeline *t = evt_test_priv(test);
630d60b4185SPavan Nikhilesh 
631d60b4185SPavan Nikhilesh 	nb_ports = evt_nr_active_lcores(opt->wlcores);
632d9a42a69SThomas Monjalon 	nb_queues = rte_eth_dev_count_avail() * (nb_stages);
633d60b4185SPavan Nikhilesh 
634032a965aSPavan Nikhilesh 	/* One queue for Tx adapter per port */
635d9a42a69SThomas Monjalon 	nb_queues += rte_eth_dev_count_avail();
636d60b4185SPavan Nikhilesh 
637032a965aSPavan Nikhilesh 	memset(tx_evqueue_id, 0, sizeof(uint8_t) * RTE_MAX_ETHPORTS);
638032a965aSPavan Nikhilesh 	memset(queue_arr, 0, sizeof(uint8_t) * RTE_EVENT_MAX_QUEUES_PER_DEV);
639d60b4185SPavan Nikhilesh 
640032a965aSPavan Nikhilesh 	rte_event_dev_info_get(opt->dev_id, &info);
641f0959283SPavan Nikhilesh 	ret = evt_configure_eventdev(opt, nb_queues, nb_ports);
642d60b4185SPavan Nikhilesh 	if (ret) {
643d60b4185SPavan Nikhilesh 		evt_err("failed to configure eventdev %d", opt->dev_id);
644d60b4185SPavan Nikhilesh 		return ret;
645d60b4185SPavan Nikhilesh 	}
646d60b4185SPavan Nikhilesh 
647d60b4185SPavan Nikhilesh 	struct rte_event_queue_conf q_conf = {
648d60b4185SPavan Nikhilesh 			.priority = RTE_EVENT_DEV_PRIORITY_NORMAL,
649d60b4185SPavan Nikhilesh 			.nb_atomic_flows = opt->nb_flows,
650d60b4185SPavan Nikhilesh 			.nb_atomic_order_sequences = opt->nb_flows,
651d60b4185SPavan Nikhilesh 	};
652d60b4185SPavan Nikhilesh 	/* queue configurations */
653d60b4185SPavan Nikhilesh 	for (queue = 0; queue < nb_queues; queue++) {
654d60b4185SPavan Nikhilesh 		uint8_t slot;
655d60b4185SPavan Nikhilesh 
656032a965aSPavan Nikhilesh 		q_conf.event_queue_cfg = 0;
657d60b4185SPavan Nikhilesh 		slot = queue % (nb_stages + 1);
658032a965aSPavan Nikhilesh 		if (slot == nb_stages) {
659d60b4185SPavan Nikhilesh 			q_conf.schedule_type = RTE_SCHED_TYPE_ATOMIC;
660032a965aSPavan Nikhilesh 			if (!t->internal_port) {
661d60b4185SPavan Nikhilesh 				q_conf.event_queue_cfg =
662d60b4185SPavan Nikhilesh 					RTE_EVENT_QUEUE_CFG_SINGLE_LINK;
663032a965aSPavan Nikhilesh 			}
664032a965aSPavan Nikhilesh 			tx_evqueue_id[prod++] = queue;
665d60b4185SPavan Nikhilesh 		} else {
666032a965aSPavan Nikhilesh 			q_conf.schedule_type = opt->sched_type_list[slot];
667d60b4185SPavan Nikhilesh 			queue_arr[nb_worker_queues] = queue;
668d60b4185SPavan Nikhilesh 			nb_worker_queues++;
669d60b4185SPavan Nikhilesh 		}
670d60b4185SPavan Nikhilesh 
671d60b4185SPavan Nikhilesh 		ret = rte_event_queue_setup(opt->dev_id, queue, &q_conf);
672d60b4185SPavan Nikhilesh 		if (ret) {
673d60b4185SPavan Nikhilesh 			evt_err("failed to setup queue=%d", queue);
674d60b4185SPavan Nikhilesh 			return ret;
675d60b4185SPavan Nikhilesh 		}
676d60b4185SPavan Nikhilesh 	}
677d60b4185SPavan Nikhilesh 
678535c630cSPavan Nikhilesh 	if (opt->wkr_deq_dep > info.max_event_port_dequeue_depth)
679535c630cSPavan Nikhilesh 		opt->wkr_deq_dep = info.max_event_port_dequeue_depth;
680535c630cSPavan Nikhilesh 
681d60b4185SPavan Nikhilesh 	/* port configuration */
682d60b4185SPavan Nikhilesh 	const struct rte_event_port_conf p_conf = {
683d60b4185SPavan Nikhilesh 			.dequeue_depth = opt->wkr_deq_dep,
684d60b4185SPavan Nikhilesh 			.enqueue_depth = info.max_event_port_dequeue_depth,
685d60b4185SPavan Nikhilesh 			.new_event_threshold = info.max_num_events,
686d60b4185SPavan Nikhilesh 	};
687d60b4185SPavan Nikhilesh 
688032a965aSPavan Nikhilesh 	if (!t->internal_port) {
689d60b4185SPavan Nikhilesh 		ret = pipeline_event_port_setup(test, opt, queue_arr,
690d60b4185SPavan Nikhilesh 				nb_worker_queues, p_conf);
691d60b4185SPavan Nikhilesh 		if (ret)
692d60b4185SPavan Nikhilesh 			return ret;
693d60b4185SPavan Nikhilesh 	} else
694d60b4185SPavan Nikhilesh 		ret = pipeline_event_port_setup(test, opt, NULL, nb_queues,
695d60b4185SPavan Nikhilesh 				p_conf);
696d60b4185SPavan Nikhilesh 
697d60b4185SPavan Nikhilesh 	if (ret)
698d60b4185SPavan Nikhilesh 		return ret;
699d60b4185SPavan Nikhilesh 	/*
700d60b4185SPavan Nikhilesh 	 * The pipelines are setup in the following manner:
701d60b4185SPavan Nikhilesh 	 *
702d60b4185SPavan Nikhilesh 	 * eth_dev_count = 2, nb_stages = 2.
703d60b4185SPavan Nikhilesh 	 *
704d60b4185SPavan Nikhilesh 	 *	queues = 6
705d60b4185SPavan Nikhilesh 	 *	stride = 3
706d60b4185SPavan Nikhilesh 	 *
707d60b4185SPavan Nikhilesh 	 *	event queue pipelines:
708d60b4185SPavan Nikhilesh 	 *	eth0 -> q0 -> q1 -> (q2->tx)
709d60b4185SPavan Nikhilesh 	 *	eth1 -> q3 -> q4 -> (q5->tx)
710d60b4185SPavan Nikhilesh 	 *
711032a965aSPavan Nikhilesh 	 *	q2, q5 configured as ATOMIC | SINGLE_LINK
712d60b4185SPavan Nikhilesh 	 *
713d60b4185SPavan Nikhilesh 	 */
714032a965aSPavan Nikhilesh 	ret = pipeline_event_rx_adapter_setup(opt, nb_stages + 1, p_conf);
715032a965aSPavan Nikhilesh 	if (ret)
716032a965aSPavan Nikhilesh 		return ret;
717032a965aSPavan Nikhilesh 
718032a965aSPavan Nikhilesh 	ret = pipeline_event_tx_adapter_setup(opt, p_conf);
719d60b4185SPavan Nikhilesh 	if (ret)
720d60b4185SPavan Nikhilesh 		return ret;
721d60b4185SPavan Nikhilesh 
722d60b4185SPavan Nikhilesh 	if (!evt_has_distributed_sched(opt->dev_id)) {
723d60b4185SPavan Nikhilesh 		uint32_t service_id;
724d60b4185SPavan Nikhilesh 		rte_event_dev_service_id_get(opt->dev_id, &service_id);
725d60b4185SPavan Nikhilesh 		ret = evt_service_setup(service_id);
726d60b4185SPavan Nikhilesh 		if (ret) {
727d60b4185SPavan Nikhilesh 			evt_err("No service lcore found to run event dev.");
728d60b4185SPavan Nikhilesh 			return ret;
729d60b4185SPavan Nikhilesh 		}
730d60b4185SPavan Nikhilesh 	}
731d60b4185SPavan Nikhilesh 
732032a965aSPavan Nikhilesh 	/* Connect the tx_evqueue_id to the Tx adapter port */
733032a965aSPavan Nikhilesh 	if (!t->internal_port) {
734032a965aSPavan Nikhilesh 		RTE_ETH_FOREACH_DEV(prod) {
735032a965aSPavan Nikhilesh 			ret = rte_event_eth_tx_adapter_event_port_get(prod,
736032a965aSPavan Nikhilesh 					&tx_evport_id);
737032a965aSPavan Nikhilesh 			if (ret) {
738032a965aSPavan Nikhilesh 				evt_err("Unable to get Tx adptr[%d] evprt[%d]",
739032a965aSPavan Nikhilesh 						prod, tx_evport_id);
740032a965aSPavan Nikhilesh 				return ret;
741032a965aSPavan Nikhilesh 			}
742032a965aSPavan Nikhilesh 
743032a965aSPavan Nikhilesh 			if (rte_event_port_link(opt->dev_id, tx_evport_id,
744032a965aSPavan Nikhilesh 						&tx_evqueue_id[prod],
745032a965aSPavan Nikhilesh 						NULL, 1) != 1) {
746032a965aSPavan Nikhilesh 				evt_err("Unable to link Tx adptr[%d] evprt[%d]",
747032a965aSPavan Nikhilesh 						prod, tx_evport_id);
748032a965aSPavan Nikhilesh 				return ret;
749032a965aSPavan Nikhilesh 			}
750032a965aSPavan Nikhilesh 		}
751032a965aSPavan Nikhilesh 	}
752032a965aSPavan Nikhilesh 
75366b82db2SPavan Nikhilesh 	ret = rte_event_dev_start(opt->dev_id);
75466b82db2SPavan Nikhilesh 	if (ret) {
75566b82db2SPavan Nikhilesh 		evt_err("failed to start eventdev %d", opt->dev_id);
75666b82db2SPavan Nikhilesh 		return ret;
75766b82db2SPavan Nikhilesh 	}
75866b82db2SPavan Nikhilesh 
75966b82db2SPavan Nikhilesh 
760032a965aSPavan Nikhilesh 	RTE_ETH_FOREACH_DEV(prod) {
761032a965aSPavan Nikhilesh 		ret = rte_eth_dev_start(prod);
762032a965aSPavan Nikhilesh 		if (ret) {
763032a965aSPavan Nikhilesh 			evt_err("Ethernet dev [%d] failed to start."
764032a965aSPavan Nikhilesh 					" Using synthetic producer", prod);
765032a965aSPavan Nikhilesh 			return ret;
766032a965aSPavan Nikhilesh 		}
767032a965aSPavan Nikhilesh 
768032a965aSPavan Nikhilesh 	}
769032a965aSPavan Nikhilesh 
770032a965aSPavan Nikhilesh 	RTE_ETH_FOREACH_DEV(prod) {
771032a965aSPavan Nikhilesh 		ret = rte_event_eth_rx_adapter_start(prod);
772032a965aSPavan Nikhilesh 		if (ret) {
773032a965aSPavan Nikhilesh 			evt_err("Rx adapter[%d] start failed", prod);
774032a965aSPavan Nikhilesh 			return ret;
775032a965aSPavan Nikhilesh 		}
776032a965aSPavan Nikhilesh 
777032a965aSPavan Nikhilesh 		ret = rte_event_eth_tx_adapter_start(prod);
778032a965aSPavan Nikhilesh 		if (ret) {
779032a965aSPavan Nikhilesh 			evt_err("Tx adapter[%d] start failed", prod);
780032a965aSPavan Nikhilesh 			return ret;
781032a965aSPavan Nikhilesh 		}
782032a965aSPavan Nikhilesh 	}
783032a965aSPavan Nikhilesh 
784032a965aSPavan Nikhilesh 	memcpy(t->tx_evqueue_id, tx_evqueue_id, sizeof(uint8_t) *
785032a965aSPavan Nikhilesh 			RTE_MAX_ETHPORTS);
786032a965aSPavan Nikhilesh 
787d60b4185SPavan Nikhilesh 	return 0;
788d60b4185SPavan Nikhilesh }
789d60b4185SPavan Nikhilesh 
790d60b4185SPavan Nikhilesh static void
pipeline_queue_opt_dump(struct evt_options * opt)791d60b4185SPavan Nikhilesh pipeline_queue_opt_dump(struct evt_options *opt)
792d60b4185SPavan Nikhilesh {
793d60b4185SPavan Nikhilesh 	pipeline_opt_dump(opt, pipeline_queue_nb_event_queues(opt));
794d60b4185SPavan Nikhilesh }
795d60b4185SPavan Nikhilesh 
796d60b4185SPavan Nikhilesh static int
pipeline_queue_opt_check(struct evt_options * opt)797d60b4185SPavan Nikhilesh pipeline_queue_opt_check(struct evt_options *opt)
798d60b4185SPavan Nikhilesh {
799d60b4185SPavan Nikhilesh 	return pipeline_opt_check(opt, pipeline_queue_nb_event_queues(opt));
800d60b4185SPavan Nikhilesh }
801d60b4185SPavan Nikhilesh 
802d60b4185SPavan Nikhilesh static bool
pipeline_queue_capability_check(struct evt_options * opt)803d60b4185SPavan Nikhilesh pipeline_queue_capability_check(struct evt_options *opt)
804d60b4185SPavan Nikhilesh {
805d60b4185SPavan Nikhilesh 	struct rte_event_dev_info dev_info;
806d60b4185SPavan Nikhilesh 
807d60b4185SPavan Nikhilesh 	rte_event_dev_info_get(opt->dev_id, &dev_info);
808d60b4185SPavan Nikhilesh 	if (dev_info.max_event_queues < pipeline_queue_nb_event_queues(opt) ||
809d60b4185SPavan Nikhilesh 			dev_info.max_event_ports <
810d60b4185SPavan Nikhilesh 			evt_nr_active_lcores(opt->wlcores)) {
811d60b4185SPavan Nikhilesh 		evt_err("not enough eventdev queues=%d/%d or ports=%d/%d",
812d60b4185SPavan Nikhilesh 			pipeline_queue_nb_event_queues(opt),
813d60b4185SPavan Nikhilesh 			dev_info.max_event_queues,
814d60b4185SPavan Nikhilesh 			evt_nr_active_lcores(opt->wlcores),
815d60b4185SPavan Nikhilesh 			dev_info.max_event_ports);
816d60b4185SPavan Nikhilesh 	}
817d60b4185SPavan Nikhilesh 
818d60b4185SPavan Nikhilesh 	return true;
819d60b4185SPavan Nikhilesh }
820d60b4185SPavan Nikhilesh 
821d60b4185SPavan Nikhilesh static const struct evt_test_ops pipeline_queue =  {
822d60b4185SPavan Nikhilesh 	.cap_check          = pipeline_queue_capability_check,
823d60b4185SPavan Nikhilesh 	.opt_check          = pipeline_queue_opt_check,
824d60b4185SPavan Nikhilesh 	.opt_dump           = pipeline_queue_opt_dump,
825d60b4185SPavan Nikhilesh 	.test_setup         = pipeline_test_setup,
826d60b4185SPavan Nikhilesh 	.mempool_setup      = pipeline_mempool_setup,
827d60b4185SPavan Nikhilesh 	.ethdev_setup	    = pipeline_ethdev_setup,
828d60b4185SPavan Nikhilesh 	.eventdev_setup     = pipeline_queue_eventdev_setup,
829d60b4185SPavan Nikhilesh 	.launch_lcores      = pipeline_queue_launch_lcores,
830a734e738SPavan Nikhilesh 	.ethdev_rx_stop     = pipeline_ethdev_rx_stop,
831d60b4185SPavan Nikhilesh 	.eventdev_destroy   = pipeline_eventdev_destroy,
832d60b4185SPavan Nikhilesh 	.mempool_destroy    = pipeline_mempool_destroy,
833d60b4185SPavan Nikhilesh 	.ethdev_destroy	    = pipeline_ethdev_destroy,
834d60b4185SPavan Nikhilesh 	.test_result        = pipeline_test_result,
835d60b4185SPavan Nikhilesh 	.test_destroy       = pipeline_test_destroy,
836d60b4185SPavan Nikhilesh };
837d60b4185SPavan Nikhilesh 
838d60b4185SPavan Nikhilesh EVT_TEST_REGISTER(pipeline_queue);
839