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 8d60b4185SPavan Nikhilesh /* See http://dpdk.org/doc/guides/tools/testeventdev.html for test details */ 9d60b4185SPavan Nikhilesh 10d60b4185SPavan Nikhilesh static __rte_always_inline int 11d60b4185SPavan Nikhilesh pipeline_queue_nb_event_queues(struct evt_options *opt) 12d60b4185SPavan Nikhilesh { 13d60b4185SPavan Nikhilesh uint16_t eth_count = rte_eth_dev_count(); 14d60b4185SPavan Nikhilesh 15d60b4185SPavan Nikhilesh return (eth_count * opt->nb_stages) + eth_count; 16d60b4185SPavan Nikhilesh } 17d60b4185SPavan Nikhilesh 18d60b4185SPavan Nikhilesh static int 19*314bcf58SPavan Nikhilesh pipeline_queue_worker_single_stage_tx(void *arg) 20*314bcf58SPavan Nikhilesh { 21*314bcf58SPavan Nikhilesh PIPELINE_WROKER_SINGLE_STAGE_INIT; 22*314bcf58SPavan Nikhilesh 23*314bcf58SPavan Nikhilesh while (t->done == false) { 24*314bcf58SPavan Nikhilesh uint16_t event = rte_event_dequeue_burst(dev, port, &ev, 1, 0); 25*314bcf58SPavan Nikhilesh 26*314bcf58SPavan Nikhilesh if (!event) { 27*314bcf58SPavan Nikhilesh rte_pause(); 28*314bcf58SPavan Nikhilesh continue; 29*314bcf58SPavan Nikhilesh } 30*314bcf58SPavan Nikhilesh 31*314bcf58SPavan Nikhilesh if (ev.sched_type == RTE_SCHED_TYPE_ATOMIC) { 32*314bcf58SPavan Nikhilesh pipeline_tx_pkt(ev.mbuf); 33*314bcf58SPavan Nikhilesh w->processed_pkts++; 34*314bcf58SPavan Nikhilesh } else { 35*314bcf58SPavan Nikhilesh ev.queue_id++; 36*314bcf58SPavan Nikhilesh pipeline_fwd_event(&ev, RTE_SCHED_TYPE_ATOMIC); 37*314bcf58SPavan Nikhilesh pipeline_event_enqueue(dev, port, &ev); 38*314bcf58SPavan Nikhilesh } 39*314bcf58SPavan Nikhilesh } 40*314bcf58SPavan Nikhilesh 41*314bcf58SPavan Nikhilesh return 0; 42*314bcf58SPavan Nikhilesh } 43*314bcf58SPavan Nikhilesh 44*314bcf58SPavan Nikhilesh static int 45*314bcf58SPavan Nikhilesh pipeline_queue_worker_single_stage_fwd(void *arg) 46*314bcf58SPavan Nikhilesh { 47*314bcf58SPavan Nikhilesh PIPELINE_WROKER_SINGLE_STAGE_INIT; 48*314bcf58SPavan Nikhilesh const uint8_t tx_queue = t->tx_service.queue_id; 49*314bcf58SPavan Nikhilesh 50*314bcf58SPavan Nikhilesh while (t->done == false) { 51*314bcf58SPavan Nikhilesh uint16_t event = rte_event_dequeue_burst(dev, port, &ev, 1, 0); 52*314bcf58SPavan Nikhilesh 53*314bcf58SPavan Nikhilesh if (!event) { 54*314bcf58SPavan Nikhilesh rte_pause(); 55*314bcf58SPavan Nikhilesh continue; 56*314bcf58SPavan Nikhilesh } 57*314bcf58SPavan Nikhilesh 58*314bcf58SPavan Nikhilesh ev.queue_id = tx_queue; 59*314bcf58SPavan Nikhilesh pipeline_fwd_event(&ev, RTE_SCHED_TYPE_ATOMIC); 60*314bcf58SPavan Nikhilesh pipeline_event_enqueue(dev, port, &ev); 61*314bcf58SPavan Nikhilesh w->processed_pkts++; 62*314bcf58SPavan Nikhilesh } 63*314bcf58SPavan Nikhilesh 64*314bcf58SPavan Nikhilesh return 0; 65*314bcf58SPavan Nikhilesh } 66*314bcf58SPavan Nikhilesh 67*314bcf58SPavan Nikhilesh static int 68*314bcf58SPavan Nikhilesh pipeline_queue_worker_single_stage_burst_tx(void *arg) 69*314bcf58SPavan Nikhilesh { 70*314bcf58SPavan Nikhilesh PIPELINE_WROKER_SINGLE_STAGE_BURST_INIT; 71*314bcf58SPavan Nikhilesh 72*314bcf58SPavan Nikhilesh while (t->done == false) { 73*314bcf58SPavan Nikhilesh uint16_t nb_rx = rte_event_dequeue_burst(dev, port, ev, 74*314bcf58SPavan Nikhilesh BURST_SIZE, 0); 75*314bcf58SPavan Nikhilesh 76*314bcf58SPavan Nikhilesh if (!nb_rx) { 77*314bcf58SPavan Nikhilesh rte_pause(); 78*314bcf58SPavan Nikhilesh continue; 79*314bcf58SPavan Nikhilesh } 80*314bcf58SPavan Nikhilesh 81*314bcf58SPavan Nikhilesh for (i = 0; i < nb_rx; i++) { 82*314bcf58SPavan Nikhilesh rte_prefetch0(ev[i + 1].mbuf); 83*314bcf58SPavan Nikhilesh if (ev[i].sched_type == RTE_SCHED_TYPE_ATOMIC) { 84*314bcf58SPavan Nikhilesh 85*314bcf58SPavan Nikhilesh pipeline_tx_pkt(ev[i].mbuf); 86*314bcf58SPavan Nikhilesh ev[i].op = RTE_EVENT_OP_RELEASE; 87*314bcf58SPavan Nikhilesh w->processed_pkts++; 88*314bcf58SPavan Nikhilesh } else { 89*314bcf58SPavan Nikhilesh ev[i].queue_id++; 90*314bcf58SPavan Nikhilesh pipeline_fwd_event(&ev[i], 91*314bcf58SPavan Nikhilesh RTE_SCHED_TYPE_ATOMIC); 92*314bcf58SPavan Nikhilesh } 93*314bcf58SPavan Nikhilesh } 94*314bcf58SPavan Nikhilesh 95*314bcf58SPavan Nikhilesh pipeline_event_enqueue_burst(dev, port, ev, nb_rx); 96*314bcf58SPavan Nikhilesh } 97*314bcf58SPavan Nikhilesh 98*314bcf58SPavan Nikhilesh return 0; 99*314bcf58SPavan Nikhilesh } 100*314bcf58SPavan Nikhilesh 101*314bcf58SPavan Nikhilesh static int 102*314bcf58SPavan Nikhilesh pipeline_queue_worker_single_stage_burst_fwd(void *arg) 103*314bcf58SPavan Nikhilesh { 104*314bcf58SPavan Nikhilesh PIPELINE_WROKER_SINGLE_STAGE_BURST_INIT; 105*314bcf58SPavan Nikhilesh const uint8_t tx_queue = t->tx_service.queue_id; 106*314bcf58SPavan Nikhilesh 107*314bcf58SPavan Nikhilesh while (t->done == false) { 108*314bcf58SPavan Nikhilesh uint16_t nb_rx = rte_event_dequeue_burst(dev, port, ev, 109*314bcf58SPavan Nikhilesh BURST_SIZE, 0); 110*314bcf58SPavan Nikhilesh 111*314bcf58SPavan Nikhilesh if (!nb_rx) { 112*314bcf58SPavan Nikhilesh rte_pause(); 113*314bcf58SPavan Nikhilesh continue; 114*314bcf58SPavan Nikhilesh } 115*314bcf58SPavan Nikhilesh 116*314bcf58SPavan Nikhilesh for (i = 0; i < nb_rx; i++) { 117*314bcf58SPavan Nikhilesh rte_prefetch0(ev[i + 1].mbuf); 118*314bcf58SPavan Nikhilesh ev[i].queue_id = tx_queue; 119*314bcf58SPavan Nikhilesh pipeline_fwd_event(&ev[i], RTE_SCHED_TYPE_ATOMIC); 120*314bcf58SPavan Nikhilesh w->processed_pkts++; 121*314bcf58SPavan Nikhilesh } 122*314bcf58SPavan Nikhilesh 123*314bcf58SPavan Nikhilesh pipeline_event_enqueue_burst(dev, port, ev, nb_rx); 124*314bcf58SPavan Nikhilesh } 125*314bcf58SPavan Nikhilesh 126*314bcf58SPavan Nikhilesh return 0; 127*314bcf58SPavan Nikhilesh } 128*314bcf58SPavan Nikhilesh 129*314bcf58SPavan Nikhilesh 130*314bcf58SPavan Nikhilesh static int 131*314bcf58SPavan Nikhilesh pipeline_queue_worker_multi_stage_tx(void *arg) 132*314bcf58SPavan Nikhilesh { 133*314bcf58SPavan Nikhilesh PIPELINE_WROKER_MULTI_STAGE_INIT; 134*314bcf58SPavan Nikhilesh const uint8_t nb_stages = t->opt->nb_stages + 1; 135*314bcf58SPavan Nikhilesh 136*314bcf58SPavan Nikhilesh while (t->done == false) { 137*314bcf58SPavan Nikhilesh uint16_t event = rte_event_dequeue_burst(dev, port, &ev, 1, 0); 138*314bcf58SPavan Nikhilesh 139*314bcf58SPavan Nikhilesh if (!event) { 140*314bcf58SPavan Nikhilesh rte_pause(); 141*314bcf58SPavan Nikhilesh continue; 142*314bcf58SPavan Nikhilesh } 143*314bcf58SPavan Nikhilesh 144*314bcf58SPavan Nikhilesh cq_id = ev.queue_id % nb_stages; 145*314bcf58SPavan Nikhilesh 146*314bcf58SPavan Nikhilesh if (cq_id >= last_queue) { 147*314bcf58SPavan Nikhilesh if (ev.sched_type == RTE_SCHED_TYPE_ATOMIC) { 148*314bcf58SPavan Nikhilesh 149*314bcf58SPavan Nikhilesh pipeline_tx_pkt(ev.mbuf); 150*314bcf58SPavan Nikhilesh w->processed_pkts++; 151*314bcf58SPavan Nikhilesh continue; 152*314bcf58SPavan Nikhilesh } 153*314bcf58SPavan Nikhilesh ev.queue_id += (cq_id == last_queue) ? 1 : 0; 154*314bcf58SPavan Nikhilesh pipeline_fwd_event(&ev, RTE_SCHED_TYPE_ATOMIC); 155*314bcf58SPavan Nikhilesh } else { 156*314bcf58SPavan Nikhilesh ev.queue_id++; 157*314bcf58SPavan Nikhilesh pipeline_fwd_event(&ev, sched_type_list[cq_id]); 158*314bcf58SPavan Nikhilesh } 159*314bcf58SPavan Nikhilesh 160*314bcf58SPavan Nikhilesh pipeline_event_enqueue(dev, port, &ev); 161*314bcf58SPavan Nikhilesh } 162*314bcf58SPavan Nikhilesh return 0; 163*314bcf58SPavan Nikhilesh } 164*314bcf58SPavan Nikhilesh 165*314bcf58SPavan Nikhilesh static int 166*314bcf58SPavan Nikhilesh pipeline_queue_worker_multi_stage_fwd(void *arg) 167*314bcf58SPavan Nikhilesh { 168*314bcf58SPavan Nikhilesh PIPELINE_WROKER_MULTI_STAGE_INIT; 169*314bcf58SPavan Nikhilesh const uint8_t nb_stages = t->opt->nb_stages + 1; 170*314bcf58SPavan Nikhilesh const uint8_t tx_queue = t->tx_service.queue_id; 171*314bcf58SPavan Nikhilesh 172*314bcf58SPavan Nikhilesh while (t->done == false) { 173*314bcf58SPavan Nikhilesh uint16_t event = rte_event_dequeue_burst(dev, port, &ev, 1, 0); 174*314bcf58SPavan Nikhilesh 175*314bcf58SPavan Nikhilesh if (!event) { 176*314bcf58SPavan Nikhilesh rte_pause(); 177*314bcf58SPavan Nikhilesh continue; 178*314bcf58SPavan Nikhilesh } 179*314bcf58SPavan Nikhilesh 180*314bcf58SPavan Nikhilesh cq_id = ev.queue_id % nb_stages; 181*314bcf58SPavan Nikhilesh 182*314bcf58SPavan Nikhilesh if (cq_id == last_queue) { 183*314bcf58SPavan Nikhilesh ev.queue_id = tx_queue; 184*314bcf58SPavan Nikhilesh pipeline_fwd_event(&ev, RTE_SCHED_TYPE_ATOMIC); 185*314bcf58SPavan Nikhilesh w->processed_pkts++; 186*314bcf58SPavan Nikhilesh } else { 187*314bcf58SPavan Nikhilesh ev.queue_id++; 188*314bcf58SPavan Nikhilesh pipeline_fwd_event(&ev, sched_type_list[cq_id]); 189*314bcf58SPavan Nikhilesh } 190*314bcf58SPavan Nikhilesh 191*314bcf58SPavan Nikhilesh pipeline_event_enqueue(dev, port, &ev); 192*314bcf58SPavan Nikhilesh } 193*314bcf58SPavan Nikhilesh return 0; 194*314bcf58SPavan Nikhilesh } 195*314bcf58SPavan Nikhilesh 196*314bcf58SPavan Nikhilesh static int 197*314bcf58SPavan Nikhilesh pipeline_queue_worker_multi_stage_burst_tx(void *arg) 198*314bcf58SPavan Nikhilesh { 199*314bcf58SPavan Nikhilesh PIPELINE_WROKER_MULTI_STAGE_BURST_INIT; 200*314bcf58SPavan Nikhilesh const uint8_t nb_stages = t->opt->nb_stages + 1; 201*314bcf58SPavan Nikhilesh 202*314bcf58SPavan Nikhilesh while (t->done == false) { 203*314bcf58SPavan Nikhilesh uint16_t nb_rx = rte_event_dequeue_burst(dev, port, ev, 204*314bcf58SPavan Nikhilesh BURST_SIZE, 0); 205*314bcf58SPavan Nikhilesh 206*314bcf58SPavan Nikhilesh if (!nb_rx) { 207*314bcf58SPavan Nikhilesh rte_pause(); 208*314bcf58SPavan Nikhilesh continue; 209*314bcf58SPavan Nikhilesh } 210*314bcf58SPavan Nikhilesh 211*314bcf58SPavan Nikhilesh for (i = 0; i < nb_rx; i++) { 212*314bcf58SPavan Nikhilesh rte_prefetch0(ev[i + 1].mbuf); 213*314bcf58SPavan Nikhilesh cq_id = ev[i].queue_id % nb_stages; 214*314bcf58SPavan Nikhilesh 215*314bcf58SPavan Nikhilesh if (cq_id >= last_queue) { 216*314bcf58SPavan Nikhilesh if (ev[i].sched_type == RTE_SCHED_TYPE_ATOMIC) { 217*314bcf58SPavan Nikhilesh 218*314bcf58SPavan Nikhilesh pipeline_tx_pkt(ev[i].mbuf); 219*314bcf58SPavan Nikhilesh ev[i].op = RTE_EVENT_OP_RELEASE; 220*314bcf58SPavan Nikhilesh w->processed_pkts++; 221*314bcf58SPavan Nikhilesh continue; 222*314bcf58SPavan Nikhilesh } 223*314bcf58SPavan Nikhilesh 224*314bcf58SPavan Nikhilesh ev[i].queue_id += (cq_id == last_queue) ? 1 : 0; 225*314bcf58SPavan Nikhilesh pipeline_fwd_event(&ev[i], 226*314bcf58SPavan Nikhilesh RTE_SCHED_TYPE_ATOMIC); 227*314bcf58SPavan Nikhilesh } else { 228*314bcf58SPavan Nikhilesh ev[i].queue_id++; 229*314bcf58SPavan Nikhilesh pipeline_fwd_event(&ev[i], 230*314bcf58SPavan Nikhilesh sched_type_list[cq_id]); 231*314bcf58SPavan Nikhilesh } 232*314bcf58SPavan Nikhilesh 233*314bcf58SPavan Nikhilesh } 234*314bcf58SPavan Nikhilesh 235*314bcf58SPavan Nikhilesh pipeline_event_enqueue_burst(dev, port, ev, nb_rx); 236*314bcf58SPavan Nikhilesh } 237*314bcf58SPavan Nikhilesh return 0; 238*314bcf58SPavan Nikhilesh } 239*314bcf58SPavan Nikhilesh 240*314bcf58SPavan Nikhilesh static int 241*314bcf58SPavan Nikhilesh pipeline_queue_worker_multi_stage_burst_fwd(void *arg) 242*314bcf58SPavan Nikhilesh { 243*314bcf58SPavan Nikhilesh PIPELINE_WROKER_MULTI_STAGE_BURST_INIT; 244*314bcf58SPavan Nikhilesh const uint8_t nb_stages = t->opt->nb_stages + 1; 245*314bcf58SPavan Nikhilesh const uint8_t tx_queue = t->tx_service.queue_id; 246*314bcf58SPavan Nikhilesh 247*314bcf58SPavan Nikhilesh while (t->done == false) { 248*314bcf58SPavan Nikhilesh uint16_t nb_rx = rte_event_dequeue_burst(dev, port, ev, 249*314bcf58SPavan Nikhilesh BURST_SIZE, 0); 250*314bcf58SPavan Nikhilesh 251*314bcf58SPavan Nikhilesh if (!nb_rx) { 252*314bcf58SPavan Nikhilesh rte_pause(); 253*314bcf58SPavan Nikhilesh continue; 254*314bcf58SPavan Nikhilesh } 255*314bcf58SPavan Nikhilesh 256*314bcf58SPavan Nikhilesh for (i = 0; i < nb_rx; i++) { 257*314bcf58SPavan Nikhilesh rte_prefetch0(ev[i + 1].mbuf); 258*314bcf58SPavan Nikhilesh cq_id = ev[i].queue_id % nb_stages; 259*314bcf58SPavan Nikhilesh 260*314bcf58SPavan Nikhilesh if (cq_id == last_queue) { 261*314bcf58SPavan Nikhilesh ev[i].queue_id = tx_queue; 262*314bcf58SPavan Nikhilesh pipeline_fwd_event(&ev[i], 263*314bcf58SPavan Nikhilesh RTE_SCHED_TYPE_ATOMIC); 264*314bcf58SPavan Nikhilesh w->processed_pkts++; 265*314bcf58SPavan Nikhilesh } else { 266*314bcf58SPavan Nikhilesh ev[i].queue_id++; 267*314bcf58SPavan Nikhilesh pipeline_fwd_event(&ev[i], 268*314bcf58SPavan Nikhilesh sched_type_list[cq_id]); 269*314bcf58SPavan Nikhilesh } 270*314bcf58SPavan Nikhilesh } 271*314bcf58SPavan Nikhilesh 272*314bcf58SPavan Nikhilesh pipeline_event_enqueue_burst(dev, port, ev, nb_rx); 273*314bcf58SPavan Nikhilesh } 274*314bcf58SPavan Nikhilesh return 0; 275*314bcf58SPavan Nikhilesh } 276*314bcf58SPavan Nikhilesh 277*314bcf58SPavan Nikhilesh static int 278d60b4185SPavan Nikhilesh worker_wrapper(void *arg) 279d60b4185SPavan Nikhilesh { 280*314bcf58SPavan Nikhilesh struct worker_data *w = arg; 281*314bcf58SPavan Nikhilesh struct evt_options *opt = w->t->opt; 282*314bcf58SPavan Nikhilesh const bool burst = evt_has_burst_mode(w->dev_id); 283*314bcf58SPavan Nikhilesh const bool mt_safe = !w->t->mt_unsafe; 284*314bcf58SPavan Nikhilesh const uint8_t nb_stages = opt->nb_stages; 285*314bcf58SPavan Nikhilesh RTE_SET_USED(opt); 286*314bcf58SPavan Nikhilesh 287*314bcf58SPavan Nikhilesh if (nb_stages == 1) { 288*314bcf58SPavan Nikhilesh if (!burst && mt_safe) 289*314bcf58SPavan Nikhilesh return pipeline_queue_worker_single_stage_tx(arg); 290*314bcf58SPavan Nikhilesh else if (!burst && !mt_safe) 291*314bcf58SPavan Nikhilesh return pipeline_queue_worker_single_stage_fwd(arg); 292*314bcf58SPavan Nikhilesh else if (burst && mt_safe) 293*314bcf58SPavan Nikhilesh return pipeline_queue_worker_single_stage_burst_tx(arg); 294*314bcf58SPavan Nikhilesh else if (burst && !mt_safe) 295*314bcf58SPavan Nikhilesh return pipeline_queue_worker_single_stage_burst_fwd( 296*314bcf58SPavan Nikhilesh arg); 297*314bcf58SPavan Nikhilesh } else { 298*314bcf58SPavan Nikhilesh if (!burst && mt_safe) 299*314bcf58SPavan Nikhilesh return pipeline_queue_worker_multi_stage_tx(arg); 300*314bcf58SPavan Nikhilesh else if (!burst && !mt_safe) 301*314bcf58SPavan Nikhilesh return pipeline_queue_worker_multi_stage_fwd(arg); 302*314bcf58SPavan Nikhilesh else if (burst && mt_safe) 303*314bcf58SPavan Nikhilesh return pipeline_queue_worker_multi_stage_burst_tx(arg); 304*314bcf58SPavan Nikhilesh else if (burst && !mt_safe) 305*314bcf58SPavan Nikhilesh return pipeline_queue_worker_multi_stage_burst_fwd(arg); 306*314bcf58SPavan Nikhilesh 307*314bcf58SPavan Nikhilesh } 308d60b4185SPavan Nikhilesh rte_panic("invalid worker\n"); 309d60b4185SPavan Nikhilesh } 310d60b4185SPavan Nikhilesh 311d60b4185SPavan Nikhilesh static int 312d60b4185SPavan Nikhilesh pipeline_queue_launch_lcores(struct evt_test *test, struct evt_options *opt) 313d60b4185SPavan Nikhilesh { 314d60b4185SPavan Nikhilesh struct test_pipeline *t = evt_test_priv(test); 315d60b4185SPavan Nikhilesh 316d60b4185SPavan Nikhilesh if (t->mt_unsafe) 317d60b4185SPavan Nikhilesh rte_service_component_runstate_set(t->tx_service.service_id, 1); 318d60b4185SPavan Nikhilesh return pipeline_launch_lcores(test, opt, worker_wrapper); 319d60b4185SPavan Nikhilesh } 320d60b4185SPavan Nikhilesh 321d60b4185SPavan Nikhilesh static int 322d60b4185SPavan Nikhilesh pipeline_queue_eventdev_setup(struct evt_test *test, struct evt_options *opt) 323d60b4185SPavan Nikhilesh { 324d60b4185SPavan Nikhilesh int ret; 325d60b4185SPavan Nikhilesh int nb_ports; 326d60b4185SPavan Nikhilesh int nb_queues; 327d60b4185SPavan Nikhilesh int nb_stages = opt->nb_stages; 328d60b4185SPavan Nikhilesh uint8_t queue; 329d60b4185SPavan Nikhilesh struct rte_event_dev_info info; 330d60b4185SPavan Nikhilesh struct test_pipeline *t = evt_test_priv(test); 331d60b4185SPavan Nikhilesh uint8_t tx_evqueue_id = 0; 332d60b4185SPavan Nikhilesh uint8_t queue_arr[RTE_EVENT_MAX_QUEUES_PER_DEV]; 333d60b4185SPavan Nikhilesh uint8_t nb_worker_queues = 0; 334d60b4185SPavan Nikhilesh 335d60b4185SPavan Nikhilesh nb_ports = evt_nr_active_lcores(opt->wlcores); 336d60b4185SPavan Nikhilesh nb_queues = rte_eth_dev_count() * (nb_stages); 337d60b4185SPavan Nikhilesh 338d60b4185SPavan Nikhilesh /* Extra port for Tx service. */ 339d60b4185SPavan Nikhilesh if (t->mt_unsafe) { 340d60b4185SPavan Nikhilesh tx_evqueue_id = nb_queues; 341d60b4185SPavan Nikhilesh nb_ports++; 342d60b4185SPavan Nikhilesh nb_queues++; 343d60b4185SPavan Nikhilesh } else 344d60b4185SPavan Nikhilesh nb_queues += rte_eth_dev_count(); 345d60b4185SPavan Nikhilesh 346d60b4185SPavan Nikhilesh rte_event_dev_info_get(opt->dev_id, &info); 347d60b4185SPavan Nikhilesh 348d60b4185SPavan Nikhilesh const struct rte_event_dev_config config = { 349d60b4185SPavan Nikhilesh .nb_event_queues = nb_queues, 350d60b4185SPavan Nikhilesh .nb_event_ports = nb_ports, 351d60b4185SPavan Nikhilesh .nb_events_limit = info.max_num_events, 352d60b4185SPavan Nikhilesh .nb_event_queue_flows = opt->nb_flows, 353d60b4185SPavan Nikhilesh .nb_event_port_dequeue_depth = 354d60b4185SPavan Nikhilesh info.max_event_port_dequeue_depth, 355d60b4185SPavan Nikhilesh .nb_event_port_enqueue_depth = 356d60b4185SPavan Nikhilesh info.max_event_port_enqueue_depth, 357d60b4185SPavan Nikhilesh }; 358d60b4185SPavan Nikhilesh ret = rte_event_dev_configure(opt->dev_id, &config); 359d60b4185SPavan Nikhilesh if (ret) { 360d60b4185SPavan Nikhilesh evt_err("failed to configure eventdev %d", opt->dev_id); 361d60b4185SPavan Nikhilesh return ret; 362d60b4185SPavan Nikhilesh } 363d60b4185SPavan Nikhilesh 364d60b4185SPavan Nikhilesh struct rte_event_queue_conf q_conf = { 365d60b4185SPavan Nikhilesh .priority = RTE_EVENT_DEV_PRIORITY_NORMAL, 366d60b4185SPavan Nikhilesh .nb_atomic_flows = opt->nb_flows, 367d60b4185SPavan Nikhilesh .nb_atomic_order_sequences = opt->nb_flows, 368d60b4185SPavan Nikhilesh }; 369d60b4185SPavan Nikhilesh /* queue configurations */ 370d60b4185SPavan Nikhilesh for (queue = 0; queue < nb_queues; queue++) { 371d60b4185SPavan Nikhilesh uint8_t slot; 372d60b4185SPavan Nikhilesh 373d60b4185SPavan Nikhilesh if (!t->mt_unsafe) { 374d60b4185SPavan Nikhilesh slot = queue % (nb_stages + 1); 375d60b4185SPavan Nikhilesh q_conf.schedule_type = slot == nb_stages ? 376d60b4185SPavan Nikhilesh RTE_SCHED_TYPE_ATOMIC : 377d60b4185SPavan Nikhilesh opt->sched_type_list[slot]; 378d60b4185SPavan Nikhilesh } else { 379d60b4185SPavan Nikhilesh slot = queue % nb_stages; 380d60b4185SPavan Nikhilesh 381d60b4185SPavan Nikhilesh if (queue == tx_evqueue_id) { 382d60b4185SPavan Nikhilesh q_conf.schedule_type = RTE_SCHED_TYPE_ATOMIC; 383d60b4185SPavan Nikhilesh q_conf.event_queue_cfg = 384d60b4185SPavan Nikhilesh RTE_EVENT_QUEUE_CFG_SINGLE_LINK; 385d60b4185SPavan Nikhilesh } else { 386d60b4185SPavan Nikhilesh q_conf.schedule_type = 387d60b4185SPavan Nikhilesh opt->sched_type_list[slot]; 388d60b4185SPavan Nikhilesh queue_arr[nb_worker_queues] = queue; 389d60b4185SPavan Nikhilesh nb_worker_queues++; 390d60b4185SPavan Nikhilesh } 391d60b4185SPavan Nikhilesh } 392d60b4185SPavan Nikhilesh 393d60b4185SPavan Nikhilesh ret = rte_event_queue_setup(opt->dev_id, queue, &q_conf); 394d60b4185SPavan Nikhilesh if (ret) { 395d60b4185SPavan Nikhilesh evt_err("failed to setup queue=%d", queue); 396d60b4185SPavan Nikhilesh return ret; 397d60b4185SPavan Nikhilesh } 398d60b4185SPavan Nikhilesh } 399d60b4185SPavan Nikhilesh 400d60b4185SPavan Nikhilesh /* port configuration */ 401d60b4185SPavan Nikhilesh const struct rte_event_port_conf p_conf = { 402d60b4185SPavan Nikhilesh .dequeue_depth = opt->wkr_deq_dep, 403d60b4185SPavan Nikhilesh .enqueue_depth = info.max_event_port_dequeue_depth, 404d60b4185SPavan Nikhilesh .new_event_threshold = info.max_num_events, 405d60b4185SPavan Nikhilesh }; 406d60b4185SPavan Nikhilesh 407d60b4185SPavan Nikhilesh /* 408d60b4185SPavan Nikhilesh * If tx is multi thread safe then allow workers to do Tx else use Tx 409d60b4185SPavan Nikhilesh * service to Tx packets. 410d60b4185SPavan Nikhilesh */ 411d60b4185SPavan Nikhilesh if (t->mt_unsafe) { 412d60b4185SPavan Nikhilesh ret = pipeline_event_port_setup(test, opt, queue_arr, 413d60b4185SPavan Nikhilesh nb_worker_queues, p_conf); 414d60b4185SPavan Nikhilesh if (ret) 415d60b4185SPavan Nikhilesh return ret; 416d60b4185SPavan Nikhilesh 417d60b4185SPavan Nikhilesh ret = pipeline_event_tx_service_setup(test, opt, tx_evqueue_id, 418d60b4185SPavan Nikhilesh nb_ports - 1, p_conf); 419d60b4185SPavan Nikhilesh 420d60b4185SPavan Nikhilesh } else 421d60b4185SPavan Nikhilesh ret = pipeline_event_port_setup(test, opt, NULL, nb_queues, 422d60b4185SPavan Nikhilesh p_conf); 423d60b4185SPavan Nikhilesh 424d60b4185SPavan Nikhilesh if (ret) 425d60b4185SPavan Nikhilesh return ret; 426d60b4185SPavan Nikhilesh /* 427d60b4185SPavan Nikhilesh * The pipelines are setup in the following manner: 428d60b4185SPavan Nikhilesh * 429d60b4185SPavan Nikhilesh * eth_dev_count = 2, nb_stages = 2. 430d60b4185SPavan Nikhilesh * 431d60b4185SPavan Nikhilesh * Multi thread safe : 432d60b4185SPavan Nikhilesh * queues = 6 433d60b4185SPavan Nikhilesh * stride = 3 434d60b4185SPavan Nikhilesh * 435d60b4185SPavan Nikhilesh * event queue pipelines: 436d60b4185SPavan Nikhilesh * eth0 -> q0 -> q1 -> (q2->tx) 437d60b4185SPavan Nikhilesh * eth1 -> q3 -> q4 -> (q5->tx) 438d60b4185SPavan Nikhilesh * 439d60b4185SPavan Nikhilesh * q2, q5 configured as ATOMIC 440d60b4185SPavan Nikhilesh * 441d60b4185SPavan Nikhilesh * Multi thread unsafe : 442d60b4185SPavan Nikhilesh * queues = 5 443d60b4185SPavan Nikhilesh * stride = 2 444d60b4185SPavan Nikhilesh * 445d60b4185SPavan Nikhilesh * event queue pipelines: 446d60b4185SPavan Nikhilesh * eth0 -> q0 -> q1 447d60b4185SPavan Nikhilesh * } (q4->tx) Tx service 448d60b4185SPavan Nikhilesh * eth1 -> q2 -> q3 449d60b4185SPavan Nikhilesh * 450d60b4185SPavan Nikhilesh * q4 configured as SINGLE_LINK|ATOMIC 451d60b4185SPavan Nikhilesh */ 452d60b4185SPavan Nikhilesh ret = pipeline_event_rx_adapter_setup(opt, 453d60b4185SPavan Nikhilesh t->mt_unsafe ? nb_stages : nb_stages + 1, p_conf); 454d60b4185SPavan Nikhilesh if (ret) 455d60b4185SPavan Nikhilesh return ret; 456d60b4185SPavan Nikhilesh 457d60b4185SPavan Nikhilesh if (!evt_has_distributed_sched(opt->dev_id)) { 458d60b4185SPavan Nikhilesh uint32_t service_id; 459d60b4185SPavan Nikhilesh rte_event_dev_service_id_get(opt->dev_id, &service_id); 460d60b4185SPavan Nikhilesh ret = evt_service_setup(service_id); 461d60b4185SPavan Nikhilesh if (ret) { 462d60b4185SPavan Nikhilesh evt_err("No service lcore found to run event dev."); 463d60b4185SPavan Nikhilesh return ret; 464d60b4185SPavan Nikhilesh } 465d60b4185SPavan Nikhilesh } 466d60b4185SPavan Nikhilesh 467d60b4185SPavan Nikhilesh ret = rte_event_dev_start(opt->dev_id); 468d60b4185SPavan Nikhilesh if (ret) { 469d60b4185SPavan Nikhilesh evt_err("failed to start eventdev %d", opt->dev_id); 470d60b4185SPavan Nikhilesh return ret; 471d60b4185SPavan Nikhilesh } 472d60b4185SPavan Nikhilesh 473d60b4185SPavan Nikhilesh return 0; 474d60b4185SPavan Nikhilesh } 475d60b4185SPavan Nikhilesh 476d60b4185SPavan Nikhilesh static void 477d60b4185SPavan Nikhilesh pipeline_queue_opt_dump(struct evt_options *opt) 478d60b4185SPavan Nikhilesh { 479d60b4185SPavan Nikhilesh pipeline_opt_dump(opt, pipeline_queue_nb_event_queues(opt)); 480d60b4185SPavan Nikhilesh } 481d60b4185SPavan Nikhilesh 482d60b4185SPavan Nikhilesh static int 483d60b4185SPavan Nikhilesh pipeline_queue_opt_check(struct evt_options *opt) 484d60b4185SPavan Nikhilesh { 485d60b4185SPavan Nikhilesh return pipeline_opt_check(opt, pipeline_queue_nb_event_queues(opt)); 486d60b4185SPavan Nikhilesh } 487d60b4185SPavan Nikhilesh 488d60b4185SPavan Nikhilesh static bool 489d60b4185SPavan Nikhilesh pipeline_queue_capability_check(struct evt_options *opt) 490d60b4185SPavan Nikhilesh { 491d60b4185SPavan Nikhilesh struct rte_event_dev_info dev_info; 492d60b4185SPavan Nikhilesh 493d60b4185SPavan Nikhilesh rte_event_dev_info_get(opt->dev_id, &dev_info); 494d60b4185SPavan Nikhilesh if (dev_info.max_event_queues < pipeline_queue_nb_event_queues(opt) || 495d60b4185SPavan Nikhilesh dev_info.max_event_ports < 496d60b4185SPavan Nikhilesh evt_nr_active_lcores(opt->wlcores)) { 497d60b4185SPavan Nikhilesh evt_err("not enough eventdev queues=%d/%d or ports=%d/%d", 498d60b4185SPavan Nikhilesh pipeline_queue_nb_event_queues(opt), 499d60b4185SPavan Nikhilesh dev_info.max_event_queues, 500d60b4185SPavan Nikhilesh evt_nr_active_lcores(opt->wlcores), 501d60b4185SPavan Nikhilesh dev_info.max_event_ports); 502d60b4185SPavan Nikhilesh } 503d60b4185SPavan Nikhilesh 504d60b4185SPavan Nikhilesh return true; 505d60b4185SPavan Nikhilesh } 506d60b4185SPavan Nikhilesh 507d60b4185SPavan Nikhilesh static const struct evt_test_ops pipeline_queue = { 508d60b4185SPavan Nikhilesh .cap_check = pipeline_queue_capability_check, 509d60b4185SPavan Nikhilesh .opt_check = pipeline_queue_opt_check, 510d60b4185SPavan Nikhilesh .opt_dump = pipeline_queue_opt_dump, 511d60b4185SPavan Nikhilesh .test_setup = pipeline_test_setup, 512d60b4185SPavan Nikhilesh .mempool_setup = pipeline_mempool_setup, 513d60b4185SPavan Nikhilesh .ethdev_setup = pipeline_ethdev_setup, 514d60b4185SPavan Nikhilesh .eventdev_setup = pipeline_queue_eventdev_setup, 515d60b4185SPavan Nikhilesh .launch_lcores = pipeline_queue_launch_lcores, 516d60b4185SPavan Nikhilesh .eventdev_destroy = pipeline_eventdev_destroy, 517d60b4185SPavan Nikhilesh .mempool_destroy = pipeline_mempool_destroy, 518d60b4185SPavan Nikhilesh .ethdev_destroy = pipeline_ethdev_destroy, 519d60b4185SPavan Nikhilesh .test_result = pipeline_test_result, 520d60b4185SPavan Nikhilesh .test_destroy = pipeline_test_destroy, 521d60b4185SPavan Nikhilesh }; 522d60b4185SPavan Nikhilesh 523d60b4185SPavan Nikhilesh EVT_TEST_REGISTER(pipeline_queue); 524