linux-generic pktio has now separate rx/tx locks, what's the purpose of this extra locking?

On 28/01/16 07:03, Matias Elo wrote:
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 5676f4c..659f08d 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>

@@ -38,6 +39,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 aad4066..7a82b07 100644
--- a/platform/linux-generic/pktio/dpdk.c
+++ b/platform/linux-generic/pktio/dpdk.c
@@ -277,6 +277,7 @@ static int dpdk_open(odp_pktio_t id ODP_UNUSED,
        struct rte_mempool *pkt_pool;
        odp_pool_info_t pool_info;
        uint16_t data_room;
+       int i;

        if (getenv("ODP_PKTIO_DISABLE_DPDK"))
                return -1;
@@ -338,6 +339,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;
  }

@@ -497,16 +503,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;
  }

@@ -528,6 +541,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,
@@ -540,6 +556,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;


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

Reply via email to