eventdev: add Tx flag for packets with same destination
authorNipun Gupta <nipun.gupta@nxp.com>
Fri, 11 Oct 2019 13:03:06 +0000 (18:33 +0530)
committerJerin Jacob <jerinj@marvell.com>
Fri, 18 Oct 2019 08:03:08 +0000 (10:03 +0200)
This patch introduces a `flag` in the Eth TX adapter enqueue API.
Some drivers may support burst functionality only with the packets
having same destination device and queue.

The flag `RTE_EVENT_ETH_TX_ADAPTER_ENQUEUE_SAME_DEST` can be used
to indicate this so the underlying driver, for drivers to utilize
burst functionality appropriately.

Signed-off-by: Nipun Gupta <nipun.gupta@nxp.com>
Acked-by: Jerin Jacob <jerinj@marvell.com>
Acked-by: Hemant Agrawal <hemant.agrawal@nxp.com>
app/test-eventdev/test_pipeline_common.h
doc/guides/prog_guide/event_ethernet_tx_adapter.rst
doc/guides/rel_notes/release_19_11.rst
drivers/event/octeontx/ssovf_evdev.c
drivers/event/octeontx2/otx2_evdev.c
examples/eventdev_pipeline/pipeline_worker_tx.c
lib/librte_eventdev/Makefile
lib/librte_eventdev/meson.build
lib/librte_eventdev/rte_event_eth_tx_adapter.h
lib/librte_eventdev/rte_eventdev.c
lib/librte_eventdev/rte_eventdev.h

index 0440b9e..6e73c6a 100644 (file)
@@ -106,7 +106,7 @@ pipeline_event_tx(const uint8_t dev, const uint8_t port,
                struct rte_event * const ev)
 {
        rte_event_eth_tx_adapter_txq_set(ev->mbuf, 0);
-       while (!rte_event_eth_tx_adapter_enqueue(dev, port, ev, 1))
+       while (!rte_event_eth_tx_adapter_enqueue(dev, port, ev, 1, 0))
                rte_pause();
 }
 
@@ -116,10 +116,10 @@ pipeline_event_tx_burst(const uint8_t dev, const uint8_t port,
 {
        uint16_t enq;
 
-       enq = rte_event_eth_tx_adapter_enqueue(dev, port, ev, nb_rx);
+       enq = rte_event_eth_tx_adapter_enqueue(dev, port, ev, nb_rx, 0);
        while (enq < nb_rx) {
                enq += rte_event_eth_tx_adapter_enqueue(dev, port,
-                               ev + enq, nb_rx - enq);
+                               ev + enq, nb_rx - enq, 0);
        }
 }
 
index 192f9e1..a8c13e1 100644 (file)
@@ -137,11 +137,12 @@ should use the ``rte_event_enqueue_burst()`` function.
        if (cap & RTE_EVENT_ETH_TX_ADAPTER_CAP_INTERNAL_PORT) {
 
                event.mbuf = m;
+               eq_flags = 0;
 
                m->port = tx_port;
                rte_event_eth_tx_adapter_txq_set(m, tx_queue_id);
 
-               rte_event_eth_tx_adapter_enqueue(dev_id, ev_port, &event, 1);
+               rte_event_eth_tx_adapter_enqueue(dev_id, ev_port, &event, 1, eq_flags);
        } else {
 
                event.queue_id = qid; /* event queue linked to adapter port */
index 40121b9..856088c 100644 (file)
@@ -186,6 +186,11 @@ API Changes
 * ethdev: changed ``rte_eth_dev_owner_delete`` return value from ``void`` to
   ``int`` to provide a way to report various error conditions.
 
+* event: The function ``rte_event_eth_tx_adapter_enqueue`` takes an additional
+  input as ``flags``. Flag ``RTE_EVENT_ETH_TX_ADAPTER_ENQUEUE_SAME_DEST`` which
+  has been introduced in this release is used when used when all the packets
+  enqueued in the tx adapter are destined for the same Ethernet port & Tx queue.
+
 
 ABI Changes
 -----------
@@ -238,7 +243,7 @@ The libraries prepended with a plus sign were incremented in this version.
      librte_eal.so.11
      librte_efd.so.1
    + librte_ethdev.so.13
-     librte_eventdev.so.7
+   + librte_eventdev.so.8
      librte_flow_classify.so.1
      librte_gro.so.1
      librte_gso.so.1
index a273d4c..e4e7c44 100644 (file)
@@ -147,6 +147,7 @@ ssovf_fastpath_fns_set(struct rte_eventdev *dev)
        dev->dequeue       = ssows_deq;
        dev->dequeue_burst = ssows_deq_burst;
        dev->txa_enqueue = sso_event_tx_adapter_enqueue;
+       dev->txa_enqueue_same_dest = dev->txa_enqueue;
 
        if (edev->is_timeout_deq) {
                dev->dequeue       = ssows_deq_timeout;
index 4d8860f..2daeba4 100644 (file)
@@ -434,6 +434,8 @@ SSO_TX_ADPTR_ENQ_FASTPATH_FUNC
                                                NIX_TX_OFFLOAD_L3_L4_CSUM_F)];
                }
        }
+
+       event_dev->txa_enqueue_same_dest = event_dev->txa_enqueue;
        rte_mb();
 }
 
index 8961cd6..a0f40c2 100644 (file)
@@ -40,7 +40,7 @@ worker_tx_pkt(const uint8_t dev, const uint8_t port, struct rte_event *ev)
 {
        exchange_mac(ev->mbuf);
        rte_event_eth_tx_adapter_txq_set(ev->mbuf, 0);
-       while (!rte_event_eth_tx_adapter_enqueue(dev, port, ev, 1))
+       while (!rte_event_eth_tx_adapter_enqueue(dev, port, ev, 1, 0))
                rte_pause();
 }
 
index cd3ff80..9e6a99a 100644 (file)
@@ -8,7 +8,7 @@ include $(RTE_SDK)/mk/rte.vars.mk
 LIB = librte_eventdev.a
 
 # library version
-LIBABIVER := 7
+LIBABIVER := 8
 
 # build flags
 CFLAGS += -DALLOW_EXPERIMENTAL_API
index 19541f2..9ba6c03 100644 (file)
@@ -1,7 +1,7 @@
 # SPDX-License-Identifier: BSD-3-Clause
 # Copyright(c) 2017 Intel Corporation
 
-version = 7
+version = 8
 allow_experimental_apis = true
 
 if is_linux
index c848261..93b717a 100644 (file)
@@ -300,6 +300,11 @@ rte_event_eth_tx_adapter_txq_get(struct rte_mbuf *pkt)
 int
 rte_event_eth_tx_adapter_event_port_get(uint8_t id, uint8_t *event_port_id);
 
+#define RTE_EVENT_ETH_TX_ADAPTER_ENQUEUE_SAME_DEST     0x1
+/**< This flag is used when all the packets enqueued in the tx adapter are
+ * destined for the same Ethernet port & Tx queue.
+ */
+
 /**
  * Enqueue a burst of events objects or an event object supplied in *rte_event*
  * structure on an  event device designated by its *dev_id* through the event
@@ -324,6 +329,10 @@ rte_event_eth_tx_adapter_event_port_get(uint8_t id, uint8_t *event_port_id);
  *  The number of event objects to enqueue, typically number of
  *  rte_event_port_attr_get(...RTE_EVENT_PORT_ATTR_ENQ_DEPTH...)
  *  available for this port.
+ * @param flags
+ *  RTE_EVENT_ETH_TX_ADAPTER_ENQUEUE_ flags.
+ *  #RTE_EVENT_ETH_TX_ADAPTER_ENQUEUE_SAME_DEST signifies that all the packets
+ *  which are enqueued are destined for the same Ethernet port & Tx queue.
  *
  * @return
  *   The number of event objects actually enqueued on the event device. The
@@ -343,7 +352,8 @@ static inline uint16_t
 rte_event_eth_tx_adapter_enqueue(uint8_t dev_id,
                                uint8_t port_id,
                                struct rte_event ev[],
-                               uint16_t nb_events)
+                               uint16_t nb_events,
+                               const uint8_t flags)
 {
        const struct rte_eventdev *dev = &rte_eventdevs[dev_id];
 
@@ -359,7 +369,12 @@ rte_event_eth_tx_adapter_enqueue(uint8_t dev_id,
                return 0;
        }
 #endif
-       return dev->txa_enqueue(dev->data->ports[port_id], ev, nb_events);
+       if (flags)
+               return dev->txa_enqueue_same_dest(dev->data->ports[port_id],
+                                                 ev, nb_events);
+       else
+               return dev->txa_enqueue(dev->data->ports[port_id], ev,
+                                       nb_events);
 }
 
 /**
index f44c869..b987e07 100644 (file)
@@ -1351,6 +1351,7 @@ rte_event_pmd_allocate(const char *name, int socket_id)
        eventdev = &rte_eventdevs[dev_id];
 
        eventdev->txa_enqueue = rte_event_tx_adapter_enqueue;
+       eventdev->txa_enqueue_same_dest = rte_event_tx_adapter_enqueue;
 
        if (eventdev->data == NULL) {
                struct rte_eventdev_data *eventdev_data = NULL;
index 5044a13..ced6f29 100644 (file)
@@ -1230,6 +1230,12 @@ typedef uint16_t (*event_tx_adapter_enqueue)(void *port,
                                struct rte_event ev[], uint16_t nb_events);
 /**< @internal Enqueue burst of events on port of a device */
 
+typedef uint16_t (*event_tx_adapter_enqueue_same_dest)(void *port,
+               struct rte_event ev[], uint16_t nb_events);
+/**< @internal Enqueue burst of events on port of a device supporting
+ * burst having same destination Ethernet port & Tx queue.
+ */
+
 #define RTE_EVENTDEV_NAME_MAX_LEN      (64)
 /**< @internal Max length of name of event PMD */
 
@@ -1292,6 +1298,10 @@ struct rte_eventdev {
        /**< Pointer to PMD dequeue function. */
        event_dequeue_burst_t dequeue_burst;
        /**< Pointer to PMD dequeue burst function. */
+       event_tx_adapter_enqueue_same_dest txa_enqueue_same_dest;
+       /**< Pointer to PMD eth Tx adapter burst enqueue function with
+        * events destined to same Eth port & Tx queue.
+        */
        event_tx_adapter_enqueue txa_enqueue;
        /**< Pointer to PMD eth Tx adapter enqueue function. */
        struct rte_eventdev_data *data;