>> diff --git a/examples/l3fwd/main.c b/examples/l3fwd/main.c >> index 20df12748..69d212bc2 100644 >> --- a/examples/l3fwd/main.c >> +++ b/examples/l3fwd/main.c >> @@ -826,6 +826,93 @@ prepare_ptype_parser(uint16_t portid, >uint16_t queueid) >> return 0; >> } >> >> +static inline int >> +l3fwd_service_enable(uint32_t service_id) >> +{ >> + uint8_t min_service_count = UINT8_MAX; >> + uint32_t slcore_array[RTE_MAX_LCORE]; >> + unsigned int slcore = 0; >> + uint8_t service_count; >> + int32_t slcore_count; >> + >> + if (!rte_service_lcore_count()) >> + return -ENOENT; >> + >> + slcore_count = rte_service_lcore_list(slcore_array, >RTE_MAX_LCORE); >> + if (slcore_count < 0) >> + return -ENOENT; >> + /* Get the core which has least number of services running. */ >> + while (slcore_count--) { >> + /* Reset default mapping */ >> + rte_service_map_lcore_set(service_id, >> + slcore_array[slcore_count], 0); >> + service_count = rte_service_lcore_count_services( >> + slcore_array[slcore_count]); >> + if (service_count < min_service_count) { >> + slcore = slcore_array[slcore_count]; >> + min_service_count = service_count; >> + } >> + } >> + if (rte_service_map_lcore_set(service_id, slcore, 1)) >> + return -ENOENT; >> + rte_service_lcore_start(slcore); >> + >> + return 0; >> +} >> + >> +static void >> +l3fwd_event_service_setup(void) >> +{ >> + struct l3fwd_event_resources *evt_rsrc = >l3fwd_get_eventdev_rsrc(); >> + struct rte_event_dev_info evdev_info; >> + uint32_t service_id, caps; >> + int ret, i; >> + >> + rte_event_dev_info_get(evt_rsrc->event_d_id, &evdev_info); >> + if (evdev_info.event_dev_cap & >RTE_EVENT_DEV_CAP_DISTRIBUTED_SCHED) { >> + ret = rte_event_dev_service_id_get(evt_rsrc- >>event_d_id, >> + &service_id); >> + if (ret != -ESRCH && ret != 0) >> + rte_exit(EXIT_FAILURE, >> + "Error in starting eventdev service\n"); >> + l3fwd_service_enable(service_id); >> + } >> + >> + for (i = 0; i < evt_rsrc->rx_adptr.nb_rx_adptr; i++) { >> + ret = rte_event_eth_rx_adapter_caps_get(evt_rsrc- >>event_d_id, >> + evt_rsrc->rx_adptr.rx_adptr[i], &caps); >> + if (ret < 0) >> + rte_exit(EXIT_FAILURE, >> + "Failed to get Rx adapter[%d] caps\n", >> + evt_rsrc->rx_adptr.rx_adptr[i]); >> + ret = rte_event_eth_rx_adapter_service_id_get( >> + evt_rsrc->event_d_id, >> + &service_id); >> + if (ret != -ESRCH && ret != 0) >> + rte_exit(EXIT_FAILURE, >> + "Error in starting Rx adapter[%d] >service\n", >> + evt_rsrc->rx_adptr.rx_adptr[i]); >> + l3fwd_service_enable(service_id); >> + } >> + >> + for (i = 0; i < evt_rsrc->tx_adptr.nb_tx_adptr; i++) { >> + ret = rte_event_eth_tx_adapter_caps_get(evt_rsrc- >>event_d_id, >> + evt_rsrc->tx_adptr.tx_adptr[i], &caps); >> + if (ret < 0) >> + rte_exit(EXIT_FAILURE, >> + "Failed to get Rx adapter[%d] caps\n", >> + evt_rsrc->tx_adptr.tx_adptr[i]); >> + ret = rte_event_eth_tx_adapter_service_id_get( >> + evt_rsrc->event_d_id, >> + &service_id); >> + if (ret != -ESRCH && ret != 0) >> + rte_exit(EXIT_FAILURE, >> + "Error in starting Rx adapter[%d] >service\n", >> + evt_rsrc->tx_adptr.tx_adptr[i]); >> + l3fwd_service_enable(service_id); >> + } >> +} >> + >> int >> main(int argc, char **argv) >> { >> @@ -869,6 +956,8 @@ main(int argc, char **argv) >> evt_rsrc->port_mask = enabled_port_mask; >> /* Configure eventdev parameters if user has requested */ >> l3fwd_event_resource_setup(&port_conf); >> + if (evt_rsrc->enabled) >> + goto skip_port_config; > >Please try to avoid introducing more gotos. >If init code below is poll mode specific, let's move it int a separate >function. >Then we can have something like: >If (evt_rsrc->enabled) { > ... > ret = l3fwd_event_resource_setup(...); > l3fwd_event_service_setup(); > ... >} else > ret = l3fwd_poll_resource_setup(...); > >... >
Sure, if we are ok to change/mode existing l3fwd code it makes things a lot easier. >> >> if (check_lcore_params() < 0) >> rte_exit(EXIT_FAILURE, "check_lcore_params >failed\n"); >> @@ -1054,6 +1143,7 @@ main(int argc, char **argv) >> } >> } >> >> +skip_port_config: >> printf("\n"); >> >> /* start ports */ >> @@ -1083,6 +1173,9 @@ main(int argc, char **argv) >> } >> } >> >> + if (evt_rsrc->enabled) >> + l3fwd_event_service_setup(); >> + >> printf("\n"); >> >> for (lcore_id = 0; lcore_id < RTE_MAX_LCORE; lcore_id++) { >> -- >> 2.17.1