]> git.droids-corp.org - dpdk.git/commitdiff
eventdev/eth_rx: add event buffer size configurability
authorNaga Harish K S V <s.v.naga.harish.k@intel.com>
Wed, 6 Oct 2021 07:55:44 +0000 (02:55 -0500)
committerJerin Jacob <jerinj@marvell.com>
Thu, 21 Oct 2021 08:14:50 +0000 (10:14 +0200)
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 <s.v.naga.harish.k@intel.com>
Signed-off-by: Ganapati Kundapura <ganapati.kundapura@intel.com>
Acked-by: Jay Jayatheerthan <jay.jayatheerthan@intel.com>
Acked-by: Jerin Jacob <jerinj@marvell.com>
app/test/test_event_eth_rx_adapter.c
doc/guides/prog_guide/event_ethernet_rx_adapter.rst
lib/eventdev/rte_event_eth_rx_adapter.c
lib/eventdev/rte_event_eth_rx_adapter.h
lib/eventdev/version.map

index d0dc5522f4bf1026319a6e2aa69ac2f9425b6e46..03c4d0bcbea0a57ca7ebd3ee65b2a97330a77a45 100644 (file)
@@ -428,6 +428,50 @@ adapter_create_free(void)
        return TEST_SUCCESS;
 }
 
+static int
+adapter_create_free_with_params(void)
+{
+       int err;
+
+       struct rte_event_port_conf rx_p_conf = {
+                       .dequeue_depth = 8,
+                       .enqueue_depth = 8,
+                       .new_event_threshold = 1200,
+       };
+
+       struct rte_event_eth_rx_adapter_params rxa_params = {
+                       .event_buf_size = 1024
+       };
+
+       err = rte_event_eth_rx_adapter_create_with_params(TEST_INST_ID,
+                               TEST_DEV_ID, NULL, NULL);
+       TEST_ASSERT(err == -EINVAL, "Expected -EINVAL got %d", err);
+
+       err = rte_event_eth_rx_adapter_create_with_params(TEST_INST_ID,
+                               TEST_DEV_ID, &rx_p_conf, &rxa_params);
+       TEST_ASSERT(err == 0, "Expected 0 got %d", err);
+
+       err = rte_event_eth_rx_adapter_create_with_params(TEST_INST_ID,
+                               TEST_DEV_ID, &rx_p_conf, &rxa_params);
+       TEST_ASSERT(err == -EEXIST, "Expected -EEXIST %d got %d", -EEXIST, err);
+
+       rxa_params.event_buf_size = 0;
+       err = rte_event_eth_rx_adapter_create_with_params(TEST_INST_ID,
+                               TEST_DEV_ID, &rx_p_conf, &rxa_params);
+       TEST_ASSERT(err == -EINVAL, "Expected -EINVAL got %d", err);
+
+       err = rte_event_eth_rx_adapter_free(TEST_INST_ID);
+       TEST_ASSERT(err == 0, "Expected 0 got %d", err);
+
+       err = rte_event_eth_rx_adapter_free(TEST_INST_ID);
+       TEST_ASSERT(err == -EINVAL, "Expected -EINVAL %d got %d", -EINVAL, err);
+
+       err = rte_event_eth_rx_adapter_free(1);
+       TEST_ASSERT(err == -EINVAL, "Expected -EINVAL %d got %d", -EINVAL, err);
+
+       return TEST_SUCCESS;
+}
+
 static int
 adapter_queue_add_del(void)
 {
@@ -435,7 +479,7 @@ adapter_queue_add_del(void)
        struct rte_event ev;
        uint32_t cap;
 
-       struct rte_event_eth_rx_adapter_queue_conf queue_config;
+       struct rte_event_eth_rx_adapter_queue_conf queue_config = {0};
 
        err = rte_event_eth_rx_adapter_caps_get(TEST_DEV_ID, TEST_ETHDEV_ID,
                                         &cap);
@@ -523,7 +567,7 @@ adapter_multi_eth_add_del(void)
        uint16_t port_index, port_index_base, drv_id = 0;
        char driver_name[50];
 
-       struct rte_event_eth_rx_adapter_queue_conf queue_config;
+       struct rte_event_eth_rx_adapter_queue_conf queue_config = {0};
 
        ev.queue_id = 0;
        ev.sched_type = RTE_SCHED_TYPE_ATOMIC;
@@ -594,7 +638,7 @@ adapter_intr_queue_add_del(void)
        struct rte_event ev;
        uint32_t cap;
        uint16_t eth_port;
-       struct rte_event_eth_rx_adapter_queue_conf queue_config;
+       struct rte_event_eth_rx_adapter_queue_conf queue_config = {0};
 
        if (!default_params.rx_intr_port_inited)
                return 0;
@@ -687,7 +731,7 @@ adapter_start_stop(void)
        ev.sched_type = RTE_SCHED_TYPE_ATOMIC;
        ev.priority = 0;
 
-       struct rte_event_eth_rx_adapter_queue_conf queue_config;
+       struct rte_event_eth_rx_adapter_queue_conf queue_config = {0};
 
        queue_config.rx_queue_flags = 0;
        if (default_params.caps &
@@ -802,6 +846,7 @@ static struct unit_test_suite event_eth_rx_tests = {
        .teardown = testsuite_teardown,
        .unit_test_cases = {
                TEST_CASE_ST(NULL, NULL, adapter_create_free),
+               TEST_CASE_ST(NULL, NULL, adapter_create_free_with_params),
                TEST_CASE_ST(adapter_create, adapter_free,
                                        adapter_queue_add_del),
                TEST_CASE_ST(adapter_create, adapter_free,
index ce23d8a474af8b96c2486b95592f6aa27a7c3c7f..8526aecf57ebd235531e4287777a779866c78d29 100644 (file)
@@ -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
 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 
index 857d35713976367d1498b0840afd6c93aadf1fac..e6de036ca05441f48ad4680b4111527463e90627 100644 (file)
@@ -85,7 +85,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 */
@@ -946,7 +948,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],
@@ -972,7 +974,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) {
@@ -2206,12 +2208,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;
@@ -2226,6 +2231,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;
 
@@ -2273,11 +2279,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 = rxa_params->event_buf_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;
 
@@ -2293,6 +2318,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 = {0};
+
+       /* 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_params 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)
@@ -2302,12 +2382,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);
@@ -2336,6 +2418,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;
 
@@ -2711,6 +2794,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;
 }
 
index 470543e434cfc2c372785ca1c4c098cb5b2a635a..846ca569e90f06504fbb48536b7407f24f1362a2 100644 (file)
@@ -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()
@@ -37,7 +38,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
@@ -257,6 +258,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
@@ -357,6 +369,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
  *
index 9f280160fad8d38c26bcc9176fd107545953c0c1..7de18497a607a0a3af00ad71bfe01b9a1b750378 100644 (file)
@@ -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;