Add locking support to dpdk_recv_queue() and
dpdk_send_queue().

Reviewed-by: Petri Savolainen <petri.savolai...@nokia.com>
Signed-off-by: Matias Elo <matias....@nokia.com>
---
 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 6ebcb3e..f4a3e2c 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/packet_io.h>
 #include <odp/pool.h>
+#include <odp/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 ccb659a..3ddabbf 100644
--- a/platform/linux-generic/pktio/dpdk.c
+++ b/platform/linux-generic/pktio/dpdk.c
@@ -278,6 +278,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;
@@ -345,6 +346,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;
 }
 
@@ -530,16 +536,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;
 }
 
@@ -561,6 +574,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,
@@ -573,6 +589,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
lng-odp@lists.linaro.org
https://lists.linaro.org/mailman/listinfo/lng-odp

Reply via email to