A pktio interface can be used with poll mode drivers, where TX completion often
has to be done manually. This turned up as a problem with ODP-DPDK and
odp_l2fwd:

while (!exit_threads) {
        pkts = odp_pktio_recv(pktio_src,...);
        if (pkts <= 0)
                continue;
...
        if (pkts_ok > 0)
                odp_pktio_send(pktio_dst, pkt_tbl, pkts_ok);
...
}

In this example we never call odp_pktio_send() on pktio_dst if there wasn't
any new packets received on pktio_src. DPDK needs manual TX completion. The
above example should have an odp_pktio_send_completion(pktio_dst) right at the
beginning of the loop.

Signed-off-by: Zoltan Kiss <zoltan.k...@linaro.org>
---
 include/odp/api/packet_io.h | 16 ++++++++++++++++
 1 file changed, 16 insertions(+)

diff --git a/include/odp/api/packet_io.h b/include/odp/api/packet_io.h
index b97b2b8..3a4054c 100644
--- a/include/odp/api/packet_io.h
+++ b/include/odp/api/packet_io.h
@@ -119,6 +119,22 @@ int odp_pktio_recv(odp_pktio_t pktio, odp_packet_t 
pkt_table[], int len);
 int odp_pktio_send(odp_pktio_t pktio, odp_packet_t pkt_table[], int len);
 
 /**
+ * Release sent packets
+ *
+ * This function should be called after sending on a pktio. If the platform
+ * doesn't implement send completion in other ways, this function should call
+ * odp_packet_free() on packets where transmission is already completed. It can
+ * be a no-op if the platform guarantees that the packets will be released upon
+ * completion, but the application must call it periodically after send to make
+ * sure packets are released.
+ *
+ * @param pktio        ODP packet IO handle
+ *
+ * @retval <0 on failure
+ */
+int odp_pktio_send_complete(odp_pktio_t pktio);
+
+/**
  * Set the default input queue to be associated with a pktio handle
  *
  * @param pktio                ODP packet IO handle
-- 
1.9.1

_______________________________________________
lng-odp mailing list
lng-odp@lists.linaro.org
https://lists.linaro.org/mailman/listinfo/lng-odp

Reply via email to