Add locking support to dpdk_recv_queue() and
dpdk_send_queue().
Reviewed-by: Petri Savolainen <[email protected]>
Signed-off-by: Matias Elo <[email protected]>
---
platform/linux-generic/include/odp_packet_dpdk.h | 5 +++++
platform/linux-generic/pktio/dpdk.c | 19 +++++++++++++++++++
2 files changed, 24 insertions(+)
diff --git a/platform/linux-generic/include/odp_packet_dpdk.h
b/platform/linux-generic/include/odp_packet_dpdk.h
index e844814..63806a0 100644
--- a/platform/linux-generic/include/odp_packet_dpdk.h
+++ b/platform/linux-generic/include/odp_packet_dpdk.h
@@ -9,6 +9,7 @@
#include <odp/api/packet_io.h>
#include <odp/api/pool.h>
+#include <odp/api/ticketlock.h>
#include <net/if.h>
@@ -39,6 +40,10 @@ typedef struct {
/** DPDK packet pool name (pktpool_<ifname>) */
char pool_name[IF_NAMESIZE + 8];
uint8_t port_id; /**< DPDK port identifier */
+ odp_bool_t lockless_rx; /**< no locking for rx */
+ odp_bool_t lockless_tx; /**< no locking for tx */
+ odp_ticketlock_t rx_lock[PKTIO_MAX_QUEUES]; /**< RX queue locks */
+ odp_ticketlock_t tx_lock[PKTIO_MAX_QUEUES]; /**< TX queue locks */
} pkt_dpdk_t;
#endif
diff --git a/platform/linux-generic/pktio/dpdk.c
b/platform/linux-generic/pktio/dpdk.c
index e4a5c9d..218fff9 100644
--- a/platform/linux-generic/pktio/dpdk.c
+++ b/platform/linux-generic/pktio/dpdk.c
@@ -283,6 +283,7 @@ static int dpdk_open(odp_pktio_t id ODP_UNUSED,
odp_pool_info_t pool_info;
uint16_t data_room;
uint16_t mtu;
+ int i;
if (getenv("ODP_PKTIO_DISABLE_DPDK"))
return -1;
@@ -352,6 +353,11 @@ static int dpdk_open(odp_pktio_t id ODP_UNUSED,
RTE_PKTMBUF_HEADROOM;
pkt_dpdk->data_room = RTE_MIN(pool_info.params.pkt.len, data_room);
+ for (i = 0; i < PKTIO_MAX_QUEUES; i++) {
+ odp_ticketlock_init(&pkt_dpdk->rx_lock[i]);
+ odp_ticketlock_init(&pkt_dpdk->tx_lock[i]);
+ }
+
return 0;
}
@@ -537,16 +543,23 @@ static int dpdk_recv_queue(pktio_entry_t *pktio_entry,
odp_packet_t pkt_table[],
int num)
{
+ pkt_dpdk_t *pkt_dpdk = &pktio_entry->s.pkt_dpdk;
uint16_t nb_rx;
struct rte_mbuf *rx_mbufs[num];
+ if (!pkt_dpdk->lockless_rx)
+ odp_ticketlock_lock(&pkt_dpdk->rx_lock[index]);
+
nb_rx = rte_eth_rx_burst(pktio_entry->s.pkt_dpdk.port_id, index,
rx_mbufs, num);
if (nb_rx > 0)
nb_rx = mbuf_to_pkt(pktio_entry, pkt_table, rx_mbufs, nb_rx);
+ if (!pktio_entry->s.pkt_dpdk.lockless_rx)
+ odp_ticketlock_unlock(&pkt_dpdk->rx_lock[index]);
+
return nb_rx;
}
@@ -568,6 +581,9 @@ static int dpdk_send_queue(pktio_entry_t *pktio_entry,
int i;
int mbufs;
+ if (!pktio_entry->s.pkt_dpdk.lockless_tx)
+ odp_ticketlock_lock(&pkt_dpdk->tx_lock[index]);
+
mbufs = pkt_to_mbuf(pktio_entry, tx_mbufs, pkt_table, num);
tx_pkts = rte_eth_tx_burst(pkt_dpdk->port_id, index,
@@ -580,6 +596,9 @@ static int dpdk_send_queue(pktio_entry_t *pktio_entry,
odp_packet_free_multi(pkt_table, tx_pkts);
+ if (!pktio_entry->s.pkt_dpdk.lockless_tx)
+ odp_ticketlock_unlock(&pkt_dpdk->tx_lock[index]);
+
if (odp_unlikely(tx_pkts == 0 && __odp_errno != 0))
return -1;
--
1.9.1
_______________________________________________
lng-odp mailing list
[email protected]
https://lists.linaro.org/mailman/listinfo/lng-odp