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