On Mon, Aug 21, 2023 at 9:14 PM Naga Harish K S V <s.v.naga.haris...@intel.com> wrote: > > Add new API "rte_event_eth_rx_adapter_create_ext_with_params()" for > creating Rx adapter instance. This API is similar to > rte_event_eth_rx_adapter_create_ext() with an additional input > argument for adapter configuration parameters of type > "struct rte_event_eth_rx_adapter_params". > > Signed-off-by: Naga Harish K S V <s.v.naga.haris...@intel.com>
Acked-by: Jerin Jacob <jer...@marvell.com> Applied to dpdk-next-net-eventdev/for-main. Thanks > --- > v2: > * Fix warning > v3: > * remove __rte_cold hint as per review comments > v4: > * address review comments > v5: > * Update release notes document > v6: > * incorporate review comments > v7: > * remove __rte_cold that is still remaining > --- > --- > app/test/test_event_eth_rx_adapter.c | 87 +++++++++++++++++++ > .../prog_guide/event_ethernet_rx_adapter.rst | 3 + > doc/guides/rel_notes/release_23_11.rst | 5 ++ > lib/eventdev/rte_event_eth_rx_adapter.c | 75 +++++++++++----- > lib/eventdev/rte_event_eth_rx_adapter.h | 37 +++++++- > lib/eventdev/version.map | 3 + > 6 files changed, 187 insertions(+), 23 deletions(-) > > diff --git a/app/test/test_event_eth_rx_adapter.c > b/app/test/test_event_eth_rx_adapter.c > index 52d146f97c..2d5e197666 100644 > --- a/app/test/test_event_eth_rx_adapter.c > +++ b/app/test/test_event_eth_rx_adapter.c > @@ -444,6 +444,91 @@ adapter_create_with_params(void) > return TEST_SUCCESS; > } > > +static int > +test_port_conf_cb(uint8_t id, uint8_t event_dev_id, > + struct rte_event_eth_rx_adapter_conf *conf, > + void *conf_arg) > +{ > + struct rte_event_port_conf *port_conf, def_port_conf = {0}; > + uint32_t started; > + static int port_allocated; > + static uint8_t port_id; > + int ret; > + > + if (port_allocated) { > + conf->event_port_id = port_id; > + conf->max_nb_rx = 128; > + return 0; > + } > + > + RTE_SET_USED(id); > + > + ret = rte_event_dev_attr_get(event_dev_id, RTE_EVENT_DEV_ATTR_STARTED, > + &started); > + if (ret < 0) > + return ret; > + > + if (started) > + rte_event_dev_stop(event_dev_id); > + > + port_id = 1; > + > + if (conf_arg != NULL) > + port_conf = conf_arg; > + else { > + port_conf = &def_port_conf; > + ret = rte_event_port_default_conf_get(event_dev_id, port_id, > + port_conf); > + if (ret < 0) > + return ret; > + } > + > + ret = rte_event_port_setup(event_dev_id, port_id, port_conf); > + if (ret < 0) > + return ret; > + > + conf->event_port_id = port_id; > + conf->max_nb_rx = 128; > + > + if (started) > + rte_event_dev_start(event_dev_id); > + > + /* Reuse this port number next time this is called */ > + port_allocated = 1; > + > + return 0; > +} > + > +static int > +adapter_create_ext_with_params(void) > +{ > + int err; > + struct rte_event_dev_info dev_info; > + struct rte_event_eth_rx_adapter_params rxa_params; > + > + err = rte_event_dev_info_get(TEST_DEV_ID, &dev_info); > + TEST_ASSERT(err == 0, "Expected 0 got %d", err); > + > + rxa_params.use_queue_event_buf = false; > + rxa_params.event_buf_size = 0; > + > + err = rte_event_eth_rx_adapter_create_ext_with_params(TEST_INST_ID, > + TEST_DEV_ID, test_port_conf_cb, NULL, &rxa_params); > + TEST_ASSERT(err == -EINVAL, "Expected -EINVAL got %d", err); > + > + rxa_params.event_buf_size = 128; > + > + err = rte_event_eth_rx_adapter_create_ext_with_params(TEST_INST_ID, > + TEST_DEV_ID, test_port_conf_cb, NULL, &rxa_params); > + TEST_ASSERT(err == 0, "Expected 0 got %d", err); > + > + err = rte_event_eth_rx_adapter_create_ext_with_params(TEST_INST_ID, > + TEST_DEV_ID, test_port_conf_cb, NULL, &rxa_params); > + TEST_ASSERT(err == -EEXIST, "Expected -EEXIST got %d", err); > + > + return TEST_SUCCESS; > +} > + > static int > adapter_queue_event_buf_test(void) > { > @@ -1337,6 +1422,8 @@ static struct unit_test_suite event_eth_rx_tests = { > adapter_pollq_instance_get), > TEST_CASE_ST(adapter_create, adapter_free, > adapter_get_set_params), > + TEST_CASE_ST(adapter_create_ext_with_params, adapter_free, > + adapter_start_stop), > TEST_CASES_END() /**< NULL terminate unit test array */ > } > }; > diff --git a/doc/guides/prog_guide/event_ethernet_rx_adapter.rst > b/doc/guides/prog_guide/event_ethernet_rx_adapter.rst > index 7c5e73b9fd..2e68cca798 100644 > --- a/doc/guides/prog_guide/event_ethernet_rx_adapter.rst > +++ b/doc/guides/prog_guide/event_ethernet_rx_adapter.rst > @@ -71,6 +71,9 @@ set to true. The function is passed the event device to be > associated with > the adapter and port configuration for the adapter to setup an event port > if the adapter needs to use a service function. > > +If the application desires to control both the event port allocation and > event > +buffer size, ``rte_event_eth_rx_adapter_create_ext_with_params()`` can be > used. > + > Event device configuration for service based adapter > ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ > > diff --git a/doc/guides/rel_notes/release_23_11.rst > b/doc/guides/rel_notes/release_23_11.rst > index 4411bb32c1..81b629ea2e 100644 > --- a/doc/guides/rel_notes/release_23_11.rst > +++ b/doc/guides/rel_notes/release_23_11.rst > @@ -72,6 +72,11 @@ New Features > Also, make sure to start the actual text at the margin. > ======================================================= > > +* **Added new Ethernet Rx Adapter create API.** > + > + * Added new API ``rte_event_eth_rx_adapter_create_ext_with_params()`` > + for creating Rx adapter instance for the applications desire to > + control both the event port allocation and event buffer size. > > Removed Items > ------------- > diff --git a/lib/eventdev/rte_event_eth_rx_adapter.c > b/lib/eventdev/rte_event_eth_rx_adapter.c > index f7f93ccdfd..93bed18e93 100644 > --- a/lib/eventdev/rte_event_eth_rx_adapter.c > +++ b/lib/eventdev/rte_event_eth_rx_adapter.c > @@ -2485,6 +2485,39 @@ rxa_create(uint8_t id, uint8_t dev_id, > return 0; > } > > +static int > +rxa_config_params_validate(struct rte_event_eth_rx_adapter_params > *rxa_params, > + struct rte_event_eth_rx_adapter_params > *temp_params) > +{ > + if (rxa_params == NULL) { > + /* use default values if rxa_params is NULL */ > + temp_params->event_buf_size = ETH_EVENT_BUFFER_SIZE; > + temp_params->use_queue_event_buf = false; > + } else if (!rxa_params->use_queue_event_buf && > + rxa_params->event_buf_size == 0) { > + RTE_EDEV_LOG_ERR("event buffer size can't be zero\n"); > + return -EINVAL; > + } else if (rxa_params->use_queue_event_buf && > + rxa_params->event_buf_size != 0) { > + RTE_EDEV_LOG_ERR("event buffer size needs to be configured " > + "as part of queue add\n"); > + return -EINVAL; > + } > + > + *temp_params = *rxa_params; > + /* adjust event buff size with BATCH_SIZE used for fetching > + * packets from NIC rx queues to get full buffer utilization > + * and prevent unnecessary rollovers. > + */ > + if (!temp_params->use_queue_event_buf) { > + temp_params->event_buf_size = > + RTE_ALIGN(temp_params->event_buf_size, BATCH_SIZE); > + temp_params->event_buf_size += (BATCH_SIZE + BATCH_SIZE); > + } > + > + return 0; > +} > + > int > rte_event_eth_rx_adapter_create_ext(uint8_t id, uint8_t dev_id, > rte_event_eth_rx_adapter_conf_cb conf_cb, > @@ -2511,27 +2544,9 @@ rte_event_eth_rx_adapter_create_with_params(uint8_t > id, uint8_t dev_id, > if (port_config == NULL) > return -EINVAL; > > - if (rxa_params == NULL) { > - /* use default values if rxa_params is NULL */ > - rxa_params = &temp_params; > - rxa_params->event_buf_size = ETH_EVENT_BUFFER_SIZE; > - rxa_params->use_queue_event_buf = false; > - } else if ((!rxa_params->use_queue_event_buf && > - rxa_params->event_buf_size == 0) || > - (rxa_params->use_queue_event_buf && > - rxa_params->event_buf_size != 0)) { > - RTE_EDEV_LOG_ERR("Invalid adapter params\n"); > - return -EINVAL; > - } else if (!rxa_params->use_queue_event_buf) { > - /* adjust event buff size with BATCH_SIZE used for fetching > - * packets from NIC rx queues to get full buffer utilization > - * and prevent unnecessary rollovers. > - */ > - > - rxa_params->event_buf_size = > - RTE_ALIGN(rxa_params->event_buf_size, BATCH_SIZE); > - rxa_params->event_buf_size += (BATCH_SIZE + BATCH_SIZE); > - } > + ret = rxa_config_params_validate(rxa_params, &temp_params); > + if (ret != 0) > + return ret; > > pc = rte_malloc(NULL, sizeof(*pc), 0); > if (pc == NULL) > @@ -2539,7 +2554,7 @@ rte_event_eth_rx_adapter_create_with_params(uint8_t id, > uint8_t dev_id, > > *pc = *port_config; > > - ret = rxa_create(id, dev_id, rxa_params, rxa_default_conf_cb, pc); > + ret = rxa_create(id, dev_id, &temp_params, rxa_default_conf_cb, pc); > if (ret) > rte_free(pc); > > @@ -2549,6 +2564,22 @@ rte_event_eth_rx_adapter_create_with_params(uint8_t > id, uint8_t dev_id, > return ret; > } > > +int > +rte_event_eth_rx_adapter_create_ext_with_params(uint8_t id, uint8_t dev_id, > + rte_event_eth_rx_adapter_conf_cb conf_cb, > + void *conf_arg, > + struct rte_event_eth_rx_adapter_params *rxa_params) > +{ > + struct rte_event_eth_rx_adapter_params temp_params = {0}; > + int ret; > + > + ret = rxa_config_params_validate(rxa_params, &temp_params); > + if (ret != 0) > + return ret; > + > + return rxa_create(id, dev_id, &temp_params, conf_cb, conf_arg); > +} > + > int > rte_event_eth_rx_adapter_create(uint8_t id, uint8_t dev_id, > struct rte_event_port_conf *port_config) > diff --git a/lib/eventdev/rte_event_eth_rx_adapter.h > b/lib/eventdev/rte_event_eth_rx_adapter.h > index fe2a6bdd2c..842581e87e 100644 > --- a/lib/eventdev/rte_event_eth_rx_adapter.h > +++ b/lib/eventdev/rte_event_eth_rx_adapter.h > @@ -27,6 +27,7 @@ > * - rte_event_eth_rx_adapter_create_ext() > * - rte_event_eth_rx_adapter_create() > * - rte_event_eth_rx_adapter_create_with_params() > + * - rte_event_eth_rx_adapter_create_ext_with_params() > * - rte_event_eth_rx_adapter_free() > * - rte_event_eth_rx_adapter_queue_add() > * - rte_event_eth_rx_adapter_queue_del() > @@ -45,7 +46,8 @@ > * > * The application creates an ethernet to event adapter using > * rte_event_eth_rx_adapter_create_ext() or rte_event_eth_rx_adapter_create() > - * or rte_event_eth_rx_adapter_create_with_params() functions. > + * or rte_event_eth_rx_adapter_create_with_params() or > + * rte_event_eth_rx_adapter_create_ext_with_params() functions. > * > * The adapter needs to know which ethernet rx queues to poll for mbufs as > well > * as event device parameters such as the event queue identifier, event > @@ -469,6 +471,39 @@ int rte_event_eth_rx_adapter_create_with_params(uint8_t > id, uint8_t dev_id, > struct rte_event_port_conf *port_config, > struct rte_event_eth_rx_adapter_params *rxa_params); > > +/** > + * This is a variant of rte_event_eth_rx_adapter_create_ext() with additional > + * adapter params specified in ``struct rte_event_eth_rx_adapter_params``. > + * > + * @param id > + * The identifier of the ethernet Rx event adapter. > + * > + * @param dev_id > + * The identifier of the event device to configure. > + * > + * @param conf_cb > + * Callback function that fills in members of a > + * struct rte_event_eth_rx_adapter_conf struct passed into > + * it. > + * > + * @param conf_arg > + * Argument that is passed to the conf_cb function. > + * > + * @param rxa_params > + * Pointer to struct rte_event_eth_rx_adapter_params. > + * In case of NULL, default values are used. > + * > + * @return > + * - 0: Success > + * - <0: Error code on failure > + */ > +__rte_experimental > +int > +rte_event_eth_rx_adapter_create_ext_with_params(uint8_t id, uint8_t dev_id, > + rte_event_eth_rx_adapter_conf_cb conf_cb, > + void *conf_arg, > + struct rte_event_eth_rx_adapter_params *rxa_params); > + > /** > * Free an event adapter > * > diff --git a/lib/eventdev/version.map b/lib/eventdev/version.map > index b03c10d99f..7ce09a87bb 100644 > --- a/lib/eventdev/version.map > +++ b/lib/eventdev/version.map > @@ -131,6 +131,9 @@ EXPERIMENTAL { > rte_event_eth_tx_adapter_runtime_params_init; > rte_event_eth_tx_adapter_runtime_params_set; > rte_event_timer_remaining_ticks_get; > + > + # added in 23.11 > + rte_event_eth_rx_adapter_create_ext_with_params; > }; > > INTERNAL { > -- > 2.25.1 >