153a3b7e8SJerin Jacob /* SPDX-License-Identifier: BSD-3-Clause 253a3b7e8SJerin Jacob * Copyright(c) 2017 Cavium, Inc 3d1f59fb7SJerin Jacob */ 4d1f59fb7SJerin Jacob 5*08966fe7STyler Retzlaff #include <stdalign.h> 6*08966fe7STyler Retzlaff 7d1f59fb7SJerin Jacob #include "test_order_common.h" 8d1f59fb7SJerin Jacob 9d1f59fb7SJerin Jacob int 10ba11ebf1SJerin Jacob order_test_result(struct evt_test *test, struct evt_options *opt) 11ba11ebf1SJerin Jacob { 12ba11ebf1SJerin Jacob RTE_SET_USED(opt); 13ba11ebf1SJerin Jacob struct test_order *t = evt_test_priv(test); 14ba11ebf1SJerin Jacob 15ba11ebf1SJerin Jacob return t->result; 16ba11ebf1SJerin Jacob } 17ba11ebf1SJerin Jacob 1833b7483dSJerin Jacob static inline int 1933b7483dSJerin Jacob order_producer(void *arg) 2033b7483dSJerin Jacob { 2133b7483dSJerin Jacob struct prod_data *p = arg; 2233b7483dSJerin Jacob struct test_order *t = p->t; 2333b7483dSJerin Jacob struct evt_options *opt = t->opt; 2433b7483dSJerin Jacob const uint8_t dev_id = p->dev_id; 2533b7483dSJerin Jacob const uint8_t port = p->port_id; 2633b7483dSJerin Jacob struct rte_mempool *pool = t->pool; 2733b7483dSJerin Jacob const uint64_t nb_pkts = t->nb_pkts; 2833b7483dSJerin Jacob uint32_t *producer_flow_seq = t->producer_flow_seq; 2933b7483dSJerin Jacob const uint32_t nb_flows = t->nb_flows; 3033b7483dSJerin Jacob uint64_t count = 0; 3133b7483dSJerin Jacob struct rte_mbuf *m; 3233b7483dSJerin Jacob struct rte_event ev; 3333b7483dSJerin Jacob 3433b7483dSJerin Jacob if (opt->verbose_level > 1) 3533b7483dSJerin Jacob printf("%s(): lcore %d dev_id %d port=%d queue=%d\n", 3633b7483dSJerin Jacob __func__, rte_lcore_id(), dev_id, port, p->queue_id); 3733b7483dSJerin Jacob 3833b7483dSJerin Jacob ev.event = 0; 3933b7483dSJerin Jacob ev.op = RTE_EVENT_OP_NEW; 4033b7483dSJerin Jacob ev.queue_id = p->queue_id; 4133b7483dSJerin Jacob ev.sched_type = RTE_SCHED_TYPE_ORDERED; 4233b7483dSJerin Jacob ev.priority = RTE_EVENT_DEV_PRIORITY_NORMAL; 4333b7483dSJerin Jacob ev.event_type = RTE_EVENT_TYPE_CPU; 4433b7483dSJerin Jacob ev.sub_event_type = 0; /* stage 0 */ 4533b7483dSJerin Jacob 4633b7483dSJerin Jacob while (count < nb_pkts && t->err == false) { 4733b7483dSJerin Jacob m = rte_pktmbuf_alloc(pool); 4833b7483dSJerin Jacob if (m == NULL) 4933b7483dSJerin Jacob continue; 5033b7483dSJerin Jacob 51a4931d5bSThomas Monjalon const flow_id_t flow = (uintptr_t)m % nb_flows; 5233b7483dSJerin Jacob /* Maintain seq number per flow */ 5345a059b0SDavid Marchand *order_mbuf_seqn(t, m) = producer_flow_seq[flow]++; 54a4931d5bSThomas Monjalon order_flow_id_save(t, flow, m, &ev); 5533b7483dSJerin Jacob 5633b7483dSJerin Jacob while (rte_event_enqueue_burst(dev_id, port, &ev, 1) != 1) { 5733b7483dSJerin Jacob if (t->err) 5833b7483dSJerin Jacob break; 5933b7483dSJerin Jacob rte_pause(); 6033b7483dSJerin Jacob } 6133b7483dSJerin Jacob 6233b7483dSJerin Jacob count++; 6333b7483dSJerin Jacob } 6433b7483dSJerin Jacob return 0; 6533b7483dSJerin Jacob } 6633b7483dSJerin Jacob 67ba11ebf1SJerin Jacob int 68ba11ebf1SJerin Jacob order_opt_check(struct evt_options *opt) 69ba11ebf1SJerin Jacob { 70f77f8c9fSPavan Nikhilesh if (opt->prod_type != EVT_PROD_TYPE_SYNT) { 719fdc9986SPavan Nikhilesh evt_err("Invalid producer type '%s' valid producer '%s'", 729fdc9986SPavan Nikhilesh evt_prod_id_to_name(opt->prod_type), 739fdc9986SPavan Nikhilesh evt_prod_id_to_name(EVT_PROD_TYPE_SYNT)); 749fdc9986SPavan Nikhilesh return -1; 75f77f8c9fSPavan Nikhilesh } 76f77f8c9fSPavan Nikhilesh 77cb056611SStephen Hemminger /* 1 producer + N workers + main */ 78ba11ebf1SJerin Jacob if (rte_lcore_count() < 3) { 79ba11ebf1SJerin Jacob evt_err("test need minimum 3 lcores"); 80ba11ebf1SJerin Jacob return -1; 81ba11ebf1SJerin Jacob } 82ba11ebf1SJerin Jacob 83ba11ebf1SJerin Jacob /* Validate worker lcores */ 84cb056611SStephen Hemminger if (evt_lcores_has_overlap(opt->wlcores, rte_get_main_lcore())) { 85cb056611SStephen Hemminger evt_err("worker lcores overlaps with main lcore"); 86ba11ebf1SJerin Jacob return -1; 87ba11ebf1SJerin Jacob } 88ba11ebf1SJerin Jacob 89ba11ebf1SJerin Jacob if (evt_nr_active_lcores(opt->plcores) == 0) { 90ba11ebf1SJerin Jacob evt_err("missing the producer lcore"); 91ba11ebf1SJerin Jacob return -1; 92ba11ebf1SJerin Jacob } 93ba11ebf1SJerin Jacob 94ba11ebf1SJerin Jacob if (evt_nr_active_lcores(opt->plcores) != 1) { 95ba11ebf1SJerin Jacob evt_err("only one producer lcore must be selected"); 96ba11ebf1SJerin Jacob return -1; 97ba11ebf1SJerin Jacob } 98ba11ebf1SJerin Jacob 99ba11ebf1SJerin Jacob int plcore = evt_get_first_active_lcore(opt->plcores); 100ba11ebf1SJerin Jacob 101ba11ebf1SJerin Jacob if (plcore < 0) { 102ba11ebf1SJerin Jacob evt_err("failed to find active producer"); 103ba11ebf1SJerin Jacob return plcore; 104ba11ebf1SJerin Jacob } 105ba11ebf1SJerin Jacob 106ba11ebf1SJerin Jacob if (evt_lcores_has_overlap(opt->wlcores, plcore)) { 107ba11ebf1SJerin Jacob evt_err("worker lcores overlaps producer lcore"); 108ba11ebf1SJerin Jacob return -1; 109ba11ebf1SJerin Jacob } 110ba11ebf1SJerin Jacob if (evt_has_disabled_lcore(opt->wlcores)) { 111ba11ebf1SJerin Jacob evt_err("one or more workers lcores are not enabled"); 112ba11ebf1SJerin Jacob return -1; 113ba11ebf1SJerin Jacob } 114ba11ebf1SJerin Jacob if (!evt_has_active_lcore(opt->wlcores)) { 115ba11ebf1SJerin Jacob evt_err("minimum one worker is required"); 116ba11ebf1SJerin Jacob return -1; 117ba11ebf1SJerin Jacob } 118ba11ebf1SJerin Jacob 119ba11ebf1SJerin Jacob /* Validate producer lcore */ 120cb056611SStephen Hemminger if (plcore == (int)rte_get_main_lcore()) { 121cb056611SStephen Hemminger evt_err("producer lcore and main lcore should be different"); 122ba11ebf1SJerin Jacob return -1; 123ba11ebf1SJerin Jacob } 124ba11ebf1SJerin Jacob if (!rte_lcore_is_enabled(plcore)) { 125ba11ebf1SJerin Jacob evt_err("producer lcore is not enabled"); 126ba11ebf1SJerin Jacob return -1; 127ba11ebf1SJerin Jacob } 128ba11ebf1SJerin Jacob 129ba11ebf1SJerin Jacob /* Fixups */ 130ba11ebf1SJerin Jacob if (opt->nb_pkts == 0) 131ba11ebf1SJerin Jacob opt->nb_pkts = INT64_MAX; 132ba11ebf1SJerin Jacob 133ba11ebf1SJerin Jacob return 0; 134ba11ebf1SJerin Jacob } 135ba11ebf1SJerin Jacob 136ba11ebf1SJerin Jacob int 137d1f59fb7SJerin Jacob order_test_setup(struct evt_test *test, struct evt_options *opt) 138d1f59fb7SJerin Jacob { 139d1f59fb7SJerin Jacob void *test_order; 140a4931d5bSThomas Monjalon struct test_order *t; 141a4931d5bSThomas Monjalon static const struct rte_mbuf_dynfield flow_id_dynfield_desc = { 142a4931d5bSThomas Monjalon .name = "test_event_dynfield_flow_id", 143a4931d5bSThomas Monjalon .size = sizeof(flow_id_t), 144*08966fe7STyler Retzlaff .align = alignof(flow_id_t), 145a4931d5bSThomas Monjalon }; 14645a059b0SDavid Marchand static const struct rte_mbuf_dynfield seqn_dynfield_desc = { 14745a059b0SDavid Marchand .name = "test_event_dynfield_seqn", 14845a059b0SDavid Marchand .size = sizeof(seqn_t), 149*08966fe7STyler Retzlaff .align = alignof(seqn_t), 15045a059b0SDavid Marchand }; 151d1f59fb7SJerin Jacob 152d1f59fb7SJerin Jacob test_order = rte_zmalloc_socket(test->name, sizeof(struct test_order), 153d1f59fb7SJerin Jacob RTE_CACHE_LINE_SIZE, opt->socket_id); 154d1f59fb7SJerin Jacob if (test_order == NULL) { 155d1f59fb7SJerin Jacob evt_err("failed to allocate test_order memory"); 156d1f59fb7SJerin Jacob goto nomem; 157d1f59fb7SJerin Jacob } 158d1f59fb7SJerin Jacob test->test_priv = test_order; 159a4931d5bSThomas Monjalon t = evt_test_priv(test); 160d1f59fb7SJerin Jacob 161a4931d5bSThomas Monjalon t->flow_id_dynfield_offset = 162a4931d5bSThomas Monjalon rte_mbuf_dynfield_register(&flow_id_dynfield_desc); 163a4931d5bSThomas Monjalon if (t->flow_id_dynfield_offset < 0) { 164a4931d5bSThomas Monjalon evt_err("failed to register mbuf field"); 165a4931d5bSThomas Monjalon return -rte_errno; 166a4931d5bSThomas Monjalon } 167d1f59fb7SJerin Jacob 16845a059b0SDavid Marchand t->seqn_dynfield_offset = 16945a059b0SDavid Marchand rte_mbuf_dynfield_register(&seqn_dynfield_desc); 17045a059b0SDavid Marchand if (t->seqn_dynfield_offset < 0) { 17145a059b0SDavid Marchand evt_err("failed to register mbuf field"); 17245a059b0SDavid Marchand return -rte_errno; 17345a059b0SDavid Marchand } 17445a059b0SDavid Marchand 175d1f59fb7SJerin Jacob t->producer_flow_seq = rte_zmalloc_socket("test_producer_flow_seq", 176d1f59fb7SJerin Jacob sizeof(*t->producer_flow_seq) * opt->nb_flows, 177d1f59fb7SJerin Jacob RTE_CACHE_LINE_SIZE, opt->socket_id); 178d1f59fb7SJerin Jacob 179d1f59fb7SJerin Jacob if (t->producer_flow_seq == NULL) { 180d1f59fb7SJerin Jacob evt_err("failed to allocate t->producer_flow_seq memory"); 181d1f59fb7SJerin Jacob goto prod_nomem; 182d1f59fb7SJerin Jacob } 183d1f59fb7SJerin Jacob 184d1f59fb7SJerin Jacob t->expected_flow_seq = rte_zmalloc_socket("test_expected_flow_seq", 185d1f59fb7SJerin Jacob sizeof(*t->expected_flow_seq) * opt->nb_flows, 186d1f59fb7SJerin Jacob RTE_CACHE_LINE_SIZE, opt->socket_id); 187d1f59fb7SJerin Jacob 188d1f59fb7SJerin Jacob if (t->expected_flow_seq == NULL) { 189d1f59fb7SJerin Jacob evt_err("failed to allocate t->expected_flow_seq memory"); 190d1f59fb7SJerin Jacob goto exp_nomem; 191d1f59fb7SJerin Jacob } 19251094872SJoyce Kong __atomic_store_n(&t->outstand_pkts, opt->nb_pkts, __ATOMIC_RELAXED); 193d1f59fb7SJerin Jacob t->err = false; 194d1f59fb7SJerin Jacob t->nb_pkts = opt->nb_pkts; 195d1f59fb7SJerin Jacob t->nb_flows = opt->nb_flows; 196d1f59fb7SJerin Jacob t->result = EVT_TEST_FAILED; 197d1f59fb7SJerin Jacob t->opt = opt; 198d1f59fb7SJerin Jacob return 0; 199d1f59fb7SJerin Jacob 200d1f59fb7SJerin Jacob exp_nomem: 201d1f59fb7SJerin Jacob rte_free(t->producer_flow_seq); 202d1f59fb7SJerin Jacob prod_nomem: 203d1f59fb7SJerin Jacob rte_free(test->test_priv); 204d1f59fb7SJerin Jacob nomem: 205d1f59fb7SJerin Jacob return -ENOMEM; 206d1f59fb7SJerin Jacob } 207d1f59fb7SJerin Jacob 208d1f59fb7SJerin Jacob void 209d1f59fb7SJerin Jacob order_test_destroy(struct evt_test *test, struct evt_options *opt) 210d1f59fb7SJerin Jacob { 211d1f59fb7SJerin Jacob RTE_SET_USED(opt); 212d1f59fb7SJerin Jacob struct test_order *t = evt_test_priv(test); 213d1f59fb7SJerin Jacob 214d1f59fb7SJerin Jacob rte_free(t->expected_flow_seq); 215d1f59fb7SJerin Jacob rte_free(t->producer_flow_seq); 216d1f59fb7SJerin Jacob rte_free(test->test_priv); 217d1f59fb7SJerin Jacob } 218ba11ebf1SJerin Jacob 219ba11ebf1SJerin Jacob int 220ba11ebf1SJerin Jacob order_mempool_setup(struct evt_test *test, struct evt_options *opt) 221ba11ebf1SJerin Jacob { 222ba11ebf1SJerin Jacob struct test_order *t = evt_test_priv(test); 223ba11ebf1SJerin Jacob 224ba11ebf1SJerin Jacob t->pool = rte_pktmbuf_pool_create(test->name, opt->pool_sz, 225ba11ebf1SJerin Jacob 256 /* Cache */, 0, 226ba11ebf1SJerin Jacob 512, /* Use very small mbufs */ 227ba11ebf1SJerin Jacob opt->socket_id); 228ba11ebf1SJerin Jacob if (t->pool == NULL) { 229ba11ebf1SJerin Jacob evt_err("failed to create mempool"); 230ba11ebf1SJerin Jacob return -ENOMEM; 231ba11ebf1SJerin Jacob } 232ba11ebf1SJerin Jacob 233ba11ebf1SJerin Jacob return 0; 234ba11ebf1SJerin Jacob } 235ba11ebf1SJerin Jacob 236ba11ebf1SJerin Jacob void 237ba11ebf1SJerin Jacob order_mempool_destroy(struct evt_test *test, struct evt_options *opt) 238ba11ebf1SJerin Jacob { 239ba11ebf1SJerin Jacob RTE_SET_USED(opt); 240ba11ebf1SJerin Jacob struct test_order *t = evt_test_priv(test); 241ba11ebf1SJerin Jacob 242ba11ebf1SJerin Jacob rte_mempool_free(t->pool); 243ba11ebf1SJerin Jacob } 244ba11ebf1SJerin Jacob 245ba11ebf1SJerin Jacob void 246ba11ebf1SJerin Jacob order_eventdev_destroy(struct evt_test *test, struct evt_options *opt) 247ba11ebf1SJerin Jacob { 248ba11ebf1SJerin Jacob RTE_SET_USED(test); 249ba11ebf1SJerin Jacob 250ba11ebf1SJerin Jacob rte_event_dev_stop(opt->dev_id); 251ba11ebf1SJerin Jacob rte_event_dev_close(opt->dev_id); 252ba11ebf1SJerin Jacob } 253ba11ebf1SJerin Jacob 254ba11ebf1SJerin Jacob void 255ba11ebf1SJerin Jacob order_opt_dump(struct evt_options *opt) 256ba11ebf1SJerin Jacob { 257ba11ebf1SJerin Jacob evt_dump_producer_lcores(opt); 2587be78d02SJosh Soref evt_dump("nb_worker_lcores", "%d", evt_nr_active_lcores(opt->wlcores)); 259ba11ebf1SJerin Jacob evt_dump_worker_lcores(opt); 260ba11ebf1SJerin Jacob evt_dump("nb_evdev_ports", "%d", order_nb_event_ports(opt)); 261ba11ebf1SJerin Jacob } 262ba11ebf1SJerin Jacob 2635710e751SJerin Jacob int 26433b7483dSJerin Jacob order_launch_lcores(struct evt_test *test, struct evt_options *opt, 26533b7483dSJerin Jacob int (*worker)(void *)) 26633b7483dSJerin Jacob { 26733b7483dSJerin Jacob int ret, lcore_id; 26833b7483dSJerin Jacob struct test_order *t = evt_test_priv(test); 26933b7483dSJerin Jacob 27033b7483dSJerin Jacob int wkr_idx = 0; 27133b7483dSJerin Jacob /* launch workers */ 272cb056611SStephen Hemminger RTE_LCORE_FOREACH_WORKER(lcore_id) { 27333b7483dSJerin Jacob if (!(opt->wlcores[lcore_id])) 27433b7483dSJerin Jacob continue; 27533b7483dSJerin Jacob 27633b7483dSJerin Jacob ret = rte_eal_remote_launch(worker, &t->worker[wkr_idx], 27733b7483dSJerin Jacob lcore_id); 27833b7483dSJerin Jacob if (ret) { 27933b7483dSJerin Jacob evt_err("failed to launch worker %d", lcore_id); 28033b7483dSJerin Jacob return ret; 28133b7483dSJerin Jacob } 28233b7483dSJerin Jacob wkr_idx++; 28333b7483dSJerin Jacob } 28433b7483dSJerin Jacob 28533b7483dSJerin Jacob /* launch producer */ 28633b7483dSJerin Jacob int plcore = evt_get_first_active_lcore(opt->plcores); 28733b7483dSJerin Jacob 28833b7483dSJerin Jacob ret = rte_eal_remote_launch(order_producer, &t->prod, plcore); 28933b7483dSJerin Jacob if (ret) { 29033b7483dSJerin Jacob evt_err("failed to launch order_producer %d", plcore); 29133b7483dSJerin Jacob return ret; 29233b7483dSJerin Jacob } 29333b7483dSJerin Jacob 29433b7483dSJerin Jacob uint64_t cycles = rte_get_timer_cycles(); 29533b7483dSJerin Jacob int64_t old_remaining = -1; 29633b7483dSJerin Jacob 29733b7483dSJerin Jacob while (t->err == false) { 29833b7483dSJerin Jacob uint64_t new_cycles = rte_get_timer_cycles(); 29951094872SJoyce Kong int64_t remaining = __atomic_load_n(&t->outstand_pkts, __ATOMIC_RELAXED); 30033b7483dSJerin Jacob 30133b7483dSJerin Jacob if (remaining <= 0) { 30233b7483dSJerin Jacob t->result = EVT_TEST_SUCCESS; 30333b7483dSJerin Jacob break; 30433b7483dSJerin Jacob } 30533b7483dSJerin Jacob 30633b7483dSJerin Jacob if (new_cycles - cycles > rte_get_timer_hz() * 1) { 30733b7483dSJerin Jacob printf(CLGRN"\r%"PRId64""CLNRM, remaining); 30833b7483dSJerin Jacob fflush(stdout); 30933b7483dSJerin Jacob if (old_remaining == remaining) { 31033b7483dSJerin Jacob rte_event_dev_dump(opt->dev_id, stdout); 31133b7483dSJerin Jacob evt_err("No schedules for seconds, deadlock"); 31233b7483dSJerin Jacob t->err = true; 31333b7483dSJerin Jacob break; 31433b7483dSJerin Jacob } 31533b7483dSJerin Jacob old_remaining = remaining; 31633b7483dSJerin Jacob cycles = new_cycles; 31733b7483dSJerin Jacob } 31833b7483dSJerin Jacob } 31933b7483dSJerin Jacob printf("\r"); 32033b7483dSJerin Jacob 32133b7483dSJerin Jacob return 0; 32233b7483dSJerin Jacob } 32333b7483dSJerin Jacob 32433b7483dSJerin Jacob int 3255710e751SJerin Jacob order_event_dev_port_setup(struct evt_test *test, struct evt_options *opt, 3265710e751SJerin Jacob uint8_t nb_workers, uint8_t nb_queues) 3275710e751SJerin Jacob { 3285710e751SJerin Jacob int ret; 3295710e751SJerin Jacob uint8_t port; 3305710e751SJerin Jacob struct test_order *t = evt_test_priv(test); 331f77f8c9fSPavan Nikhilesh struct rte_event_dev_info dev_info; 332f77f8c9fSPavan Nikhilesh 333f77f8c9fSPavan Nikhilesh ret = rte_event_dev_info_get(opt->dev_id, &dev_info); 334f77f8c9fSPavan Nikhilesh if (ret) { 335f77f8c9fSPavan Nikhilesh evt_err("failed to get eventdev info %d", opt->dev_id); 336f77f8c9fSPavan Nikhilesh return ret; 337f77f8c9fSPavan Nikhilesh } 338f77f8c9fSPavan Nikhilesh 339f77f8c9fSPavan Nikhilesh if (opt->wkr_deq_dep > dev_info.max_event_port_dequeue_depth) 340f77f8c9fSPavan Nikhilesh opt->wkr_deq_dep = dev_info.max_event_port_dequeue_depth; 341ba11ebf1SJerin Jacob 3425710e751SJerin Jacob /* port configuration */ 343f77f8c9fSPavan Nikhilesh const struct rte_event_port_conf p_conf = { 3445710e751SJerin Jacob .dequeue_depth = opt->wkr_deq_dep, 345f77f8c9fSPavan Nikhilesh .enqueue_depth = dev_info.max_event_port_dequeue_depth, 346f77f8c9fSPavan Nikhilesh .new_event_threshold = dev_info.max_num_events, 3475710e751SJerin Jacob }; 3485710e751SJerin Jacob 3495710e751SJerin Jacob /* setup one port per worker, linking to all queues */ 3505710e751SJerin Jacob for (port = 0; port < nb_workers; port++) { 3515710e751SJerin Jacob struct worker_data *w = &t->worker[port]; 3525710e751SJerin Jacob 3535710e751SJerin Jacob w->dev_id = opt->dev_id; 3545710e751SJerin Jacob w->port_id = port; 3555710e751SJerin Jacob w->t = t; 3565710e751SJerin Jacob 357f77f8c9fSPavan Nikhilesh ret = rte_event_port_setup(opt->dev_id, port, &p_conf); 3585710e751SJerin Jacob if (ret) { 3595710e751SJerin Jacob evt_err("failed to setup port %d", port); 3605710e751SJerin Jacob return ret; 3615710e751SJerin Jacob } 3625710e751SJerin Jacob 3635710e751SJerin Jacob ret = rte_event_port_link(opt->dev_id, port, NULL, NULL, 0); 3645710e751SJerin Jacob if (ret != nb_queues) { 3655710e751SJerin Jacob evt_err("failed to link all queues to port %d", port); 3665710e751SJerin Jacob return -EINVAL; 3675710e751SJerin Jacob } 3685710e751SJerin Jacob } 3695710e751SJerin Jacob struct prod_data *p = &t->prod; 3705710e751SJerin Jacob 3715710e751SJerin Jacob p->dev_id = opt->dev_id; 3725710e751SJerin Jacob p->port_id = port; /* last port */ 3735710e751SJerin Jacob p->queue_id = 0; 3745710e751SJerin Jacob p->t = t; 3755710e751SJerin Jacob 376f77f8c9fSPavan Nikhilesh ret = rte_event_port_setup(opt->dev_id, port, &p_conf); 3775710e751SJerin Jacob if (ret) { 3785710e751SJerin Jacob evt_err("failed to setup producer port %d", port); 3795710e751SJerin Jacob return ret; 3805710e751SJerin Jacob } 3815710e751SJerin Jacob 3825710e751SJerin Jacob return ret; 3835710e751SJerin Jacob } 384