From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mails.dpdk.org (mails.dpdk.org [217.70.189.124]) by inbox.dpdk.org (Postfix) with ESMTP id 4098EA0547; Wed, 29 Sep 2021 07:16:29 +0200 (CEST) Received: from [217.70.189.124] (localhost [127.0.0.1]) by mails.dpdk.org (Postfix) with ESMTP id 0BD35410D7; Wed, 29 Sep 2021 07:16:29 +0200 (CEST) Received: from mail-io1-f47.google.com (mail-io1-f47.google.com [209.85.166.47]) by mails.dpdk.org (Postfix) with ESMTP id CAA3440E3C for ; Wed, 29 Sep 2021 07:16:27 +0200 (CEST) Received: by mail-io1-f47.google.com with SMTP id i62so1577373ioa.6 for ; Tue, 28 Sep 2021 22:16:27 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20210112; h=mime-version:references:in-reply-to:from:date:message-id:subject:to :cc; bh=uEKdcZGpH0+Wc58ivwNTfrfkC9vSxy1RXxy7QvgKi3o=; b=G5R2JjKI7LC5nRof5QO4i5ZDL1rWKVxRAr0ladCLCWWVJu/Vir2LzE31BLxAA7WKFJ aNjk182koNDW2wdSf8RvpnNLVeVDFb+gVG99Zt5oFMnnPBcS3BatlR1HxJebjCub5teq 69jtgT5MSRrJu5mZWuHr1fubPvr3+UxoAkA8nO7uHpfhNM9JIH5LD3WUctdsFnxNqJqo V+e1iHjNgsFP3KMewGs0J88D109wXnb7dVWvtN02N0Vxwc0ZJQtk+UjxtCo9UnxmG1FU DeBzJVPeSpd0v77GCGdBlyFBO/flOywwD+kqvHtDBKw5k0LybtaiL1NeBLMz1IVljh6c WYEA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=x-gm-message-state:mime-version:references:in-reply-to:from:date :message-id:subject:to:cc; bh=uEKdcZGpH0+Wc58ivwNTfrfkC9vSxy1RXxy7QvgKi3o=; b=td0U9FFsyWMf9xpv5TmrZAeeJP/GJdJxug0F7QvxOfTRwQsJqgjHU5W4fIf7ip0kG7 8e4g6ueDHy9PUQF6aKTRqvLuDGriQ4JrAMHrJ6UHB2YSQDKbnD3x2lxOnlhxVpTnCmrd 01EGyoGNSjbS3spK34kYVT3w3r3vS7vA6cgWhZuB3kbMzIbxWwfuc9FQDUWQH4fKwekP jivNtmUFOU6fP69LKHriYa0HbnHfRpKFgzJMdvqyJogaUdccJ1dJ0yO7nU73pouLHcwx fC/N2bZ7ue+JpQZUNxgGZycNi4az25k4utTKo1VfY6/EqKZPR8Xt039K96YKZnVeqaqv YWVw== X-Gm-Message-State: AOAM530kmbYj8r4ug/k/oMEnwFkUuDV7hVmCObFq7m+AbnleIjDDeuMT O68dqoyAPBSbRMIyHM6Q4D+2lVhI5/QymyPJ9bPs7wW6 X-Google-Smtp-Source: ABdhPJzgYExyLazehq0pAbaNgEvNDnvtYrcbUz1JhrVcPcDv7l4pDIopXm300Lx5xtcYli+H2VI8ywQ/i+4dNoYlHiE= X-Received: by 2002:a05:6638:1416:: with SMTP id k22mr1356064jad.126.1632892587114; Tue, 28 Sep 2021 22:16:27 -0700 (PDT) MIME-Version: 1.0 References: <20210921094559.1788022-1-s.v.naga.harish.k@intel.com> <20210922151400.3718855-1-s.v.naga.harish.k@intel.com> In-Reply-To: <20210922151400.3718855-1-s.v.naga.harish.k@intel.com> From: Jerin Jacob Date: Wed, 29 Sep 2021 10:46:01 +0530 Message-ID: To: Naga Harish K S V Cc: Jerin Jacob , "Jayatheerthan, Jay" , dpdk-dev , Ganapati Kundapura Content-Type: text/plain; charset="UTF-8" Subject: Re: [dpdk-dev] [PATCH v3 1/5] eventdev/rx_adapter: add event buffer size configurability X-BeenThere: dev@dpdk.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: DPDK patches and discussions List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: dev-bounces@dpdk.org Sender: "dev" On Wed, Sep 22, 2021 at 8:44 PM Naga Harish K S V wrote: > > Currently event buffer is static array with a default size defined > internally. > > To configure event buffer size from application, > ``rte_event_eth_rx_adapter_create_with_params`` api is added which > takes ``struct rte_event_eth_rx_adapter_params`` to configure event > buffer size in addition other params . The event buffer size is > rounded up for better buffer utilization and performance . In case > of NULL params argument, default event buffer size is used. > > Signed-off-by: Naga Harish K S V > Signed-off-by: Ganapati Kundapura Changes look good to me. @Jayatheerthan, Jay Could review and Ack it? > > --- > v3: > * updated documentation and code comments as per review comments. > * updated new create api test case name with suitable one. > > v2: > * Updated header file and rx adapter documentation as per review comments. > * new api name is modified as rte_event_eth_rx_adapter_create_with_params > as per review comments. > * rxa_params pointer argument Value NULL is allowed to represent the > default values > > v1: > * Initial implementation with documentation and unit tests. > --- > .../prog_guide/event_ethernet_rx_adapter.rst | 7 ++ > lib/eventdev/rte_event_eth_rx_adapter.c | 98 +++++++++++++++++-- > lib/eventdev/rte_event_eth_rx_adapter.h | 41 +++++++- > lib/eventdev/version.map | 2 + > 4 files changed, 140 insertions(+), 8 deletions(-) > > diff --git a/doc/guides/prog_guide/event_ethernet_rx_adapter.rst b/doc/guides/prog_guide/event_ethernet_rx_adapter.rst > index 0780b6f711..dd753613bd 100644 > --- a/doc/guides/prog_guide/event_ethernet_rx_adapter.rst > +++ b/doc/guides/prog_guide/event_ethernet_rx_adapter.rst > @@ -62,6 +62,13 @@ service function and needs to create an event port for it. The callback is > expected to fill the ``struct rte_event_eth_rx_adapter_conf structure`` > passed to it. > > +If the application desires to control the event buffer size, it can use the > +``rte_event_eth_rx_adapter_create_with_params()`` api. The event buffer size is > +specified using ``struct rte_event_eth_rx_adapter_params::event_buf_size``. > +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. > + > Adding Rx Queues to the Adapter Instance > ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ > > diff --git a/lib/eventdev/rte_event_eth_rx_adapter.c b/lib/eventdev/rte_event_eth_rx_adapter.c > index f2dc69503d..7dec9a8734 100644 > --- a/lib/eventdev/rte_event_eth_rx_adapter.c > +++ b/lib/eventdev/rte_event_eth_rx_adapter.c > @@ -82,7 +82,9 @@ struct rte_eth_event_enqueue_buffer { > /* Count of events in this buffer */ > uint16_t count; > /* Array of events in this buffer */ > - struct rte_event events[ETH_EVENT_BUFFER_SIZE]; > + struct rte_event *events; > + /* size of event buffer */ > + uint16_t events_size; > /* Event enqueue happens from head */ > uint16_t head; > /* New packets from rte_eth_rx_burst is enqued from tail */ > @@ -919,7 +921,7 @@ rxa_buffer_mbufs(struct rte_event_eth_rx_adapter *rx_adapter, > dropped = 0; > nb_cb = dev_info->cb_fn(eth_dev_id, rx_queue_id, > buf->last | > - (RTE_DIM(buf->events) & ~buf->last_mask), > + (buf->events_size & ~buf->last_mask), > buf->count >= BATCH_SIZE ? > buf->count - BATCH_SIZE : 0, > &buf->events[buf->tail], > @@ -945,7 +947,7 @@ rxa_pkt_buf_available(struct rte_eth_event_enqueue_buffer *buf) > uint32_t nb_req = buf->tail + BATCH_SIZE; > > if (!buf->last) { > - if (nb_req <= RTE_DIM(buf->events)) > + if (nb_req <= buf->events_size) > return true; > > if (buf->head >= BATCH_SIZE) { > @@ -2164,12 +2166,15 @@ rxa_ctrl(uint8_t id, int start) > 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, > - void *conf_arg) > +static int > +rxa_create(uint8_t id, uint8_t dev_id, > + struct rte_event_eth_rx_adapter_params *rxa_params, > + rte_event_eth_rx_adapter_conf_cb conf_cb, > + void *conf_arg) > { > struct rte_event_eth_rx_adapter *rx_adapter; > + struct rte_eth_event_enqueue_buffer *buf; > + struct rte_event *events; > int ret; > int socket_id; > uint16_t i; > @@ -2184,6 +2189,7 @@ rte_event_eth_rx_adapter_create_ext(uint8_t id, uint8_t dev_id, > > RTE_EVENT_ETH_RX_ADAPTER_ID_VALID_OR_ERR_RET(id, -EINVAL); > RTE_EVENTDEV_VALID_DEVID_OR_ERR_RET(dev_id, -EINVAL); > + > if (conf_cb == NULL) > return -EINVAL; > > @@ -2231,11 +2237,30 @@ rte_event_eth_rx_adapter_create_ext(uint8_t id, uint8_t dev_id, > rte_free(rx_adapter); > return -ENOMEM; > } > + > rte_spinlock_init(&rx_adapter->rx_lock); > + > for (i = 0; i < RTE_MAX_ETHPORTS; i++) > rx_adapter->eth_devices[i].dev = &rte_eth_devices[i]; > > + /* Rx adapter event buffer allocation */ > + buf = &rx_adapter->event_enqueue_buffer; > + buf->events_size = RTE_ALIGN(rxa_params->event_buf_size, BATCH_SIZE); > + > + events = rte_zmalloc_socket(rx_adapter->mem_name, > + buf->events_size * sizeof(*events), > + 0, socket_id); > + if (events == NULL) { > + RTE_EDEV_LOG_ERR("Failed to allocate mem for event buffer\n"); > + rte_free(rx_adapter->eth_devices); > + rte_free(rx_adapter); > + return -ENOMEM; > + } > + > + rx_adapter->event_enqueue_buffer.events = events; > + > event_eth_rx_adapter[id] = rx_adapter; > + > if (conf_cb == rxa_default_conf_cb) > rx_adapter->default_cb_arg = 1; > rte_eventdev_trace_eth_rx_adapter_create(id, dev_id, conf_cb, > @@ -2243,6 +2268,61 @@ rte_event_eth_rx_adapter_create_ext(uint8_t id, uint8_t dev_id, > 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, > + void *conf_arg) > +{ > + struct rte_event_eth_rx_adapter_params rxa_params; > + > + /* use default values for adapter params */ > + rxa_params.event_buf_size = ETH_EVENT_BUFFER_SIZE; > + > + return rxa_create(id, dev_id, &rxa_params, conf_cb, conf_arg); > +} > + > +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) > +{ > + struct rte_event_port_conf *pc; > + int ret; > + struct rte_event_eth_rx_adapter_params temp_params = {0}; > + > + if (port_config == NULL) > + return -EINVAL; > + > + /* use default values if rxa_parmas is NULL */ > + if (rxa_params == NULL) { > + rxa_params = &temp_params; > + rxa_params->event_buf_size = ETH_EVENT_BUFFER_SIZE; > + } > + > + if (rxa_params->event_buf_size == 0) > + return -EINVAL; > + > + pc = rte_malloc(NULL, sizeof(*pc), 0); > + if (pc == NULL) > + return -ENOMEM; > + > + *pc = *port_config; > + > + /* 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_create(id, dev_id, rxa_params, rxa_default_conf_cb, pc); > + if (ret) > + rte_free(pc); > + > + return ret; > +} > + > int > rte_event_eth_rx_adapter_create(uint8_t id, uint8_t dev_id, > struct rte_event_port_conf *port_config) > @@ -2252,12 +2332,14 @@ rte_event_eth_rx_adapter_create(uint8_t id, uint8_t dev_id, > > if (port_config == NULL) > return -EINVAL; > + > RTE_EVENT_ETH_RX_ADAPTER_ID_VALID_OR_ERR_RET(id, -EINVAL); > > pc = rte_malloc(NULL, sizeof(*pc), 0); > if (pc == NULL) > return -ENOMEM; > *pc = *port_config; > + > ret = rte_event_eth_rx_adapter_create_ext(id, dev_id, > rxa_default_conf_cb, > pc); > @@ -2286,6 +2368,7 @@ rte_event_eth_rx_adapter_free(uint8_t id) > if (rx_adapter->default_cb_arg) > rte_free(rx_adapter->conf_arg); > rte_free(rx_adapter->eth_devices); > + rte_free(rx_adapter->event_enqueue_buffer.events); > rte_free(rx_adapter); > event_eth_rx_adapter[id] = NULL; > > @@ -2658,6 +2741,7 @@ rte_event_eth_rx_adapter_stats_get(uint8_t id, > > stats->rx_packets += dev_stats_sum.rx_packets; > stats->rx_enq_count += dev_stats_sum.rx_enq_count; > + > return 0; > } > > diff --git a/lib/eventdev/rte_event_eth_rx_adapter.h b/lib/eventdev/rte_event_eth_rx_adapter.h > index 3f8b362295..6e8b3085f8 100644 > --- a/lib/eventdev/rte_event_eth_rx_adapter.h > +++ b/lib/eventdev/rte_event_eth_rx_adapter.h > @@ -26,6 +26,7 @@ > * The ethernet Rx event adapter's functions are: > * - 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_free() > * - rte_event_eth_rx_adapter_queue_add() > * - rte_event_eth_rx_adapter_queue_del() > @@ -36,7 +37,7 @@ > * > * The application creates an ethernet to event adapter using > * rte_event_eth_rx_adapter_create_ext() or rte_event_eth_rx_adapter_create() > - * functions. > + * or rte_event_eth_rx_adapter_create_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 > * priority and scheduling type that the adapter should use when constructing > @@ -256,6 +257,17 @@ struct rte_event_eth_rx_adapter_vector_limits { > */ > }; > > +/** > + * A structure to hold adapter config params > + */ > +struct rte_event_eth_rx_adapter_params { > + uint16_t event_buf_size; > + /**< size of event buffer for the adapter. > + * This value is rounded up for better buffer utilization > + * and performance. > + */ > +}; > + > /** > * > * Callback function invoked by the SW adapter before it continues > @@ -356,6 +368,33 @@ int rte_event_eth_rx_adapter_create_ext(uint8_t id, uint8_t dev_id, > int rte_event_eth_rx_adapter_create(uint8_t id, uint8_t dev_id, > struct rte_event_port_conf *port_config); > > +/** > + * This is a variant of rte_event_eth_rx_adapter_create() 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 port_config > + * Argument of type *rte_event_port_conf* 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_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); > + > /** > * Free an event adapter > * > diff --git a/lib/eventdev/version.map b/lib/eventdev/version.map > index cd86d2d908..87586de879 100644 > --- a/lib/eventdev/version.map > +++ b/lib/eventdev/version.map > @@ -138,6 +138,8 @@ EXPERIMENTAL { > __rte_eventdev_trace_port_setup; > # added in 20.11 > rte_event_pmd_pci_probe_named; > + # added in 21.11 > + rte_event_eth_rx_adapter_create_with_params; > > #added in 21.05 > rte_event_vector_pool_create; > -- > 2.25.1 >