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