net/mlx4: associate MR to MP in a short function
authorOphir Munk <ophirmu@mellanox.com>
Thu, 2 Nov 2017 16:42:45 +0000 (16:42 +0000)
committerFerruh Yigit <ferruh.yigit@intel.com>
Fri, 3 Nov 2017 19:22:07 +0000 (20:22 +0100)
Associate memory region to mempool (on data path) in a short function.
Handle the less common case of adding a new memory region to mempool
in a separate function.

Signed-off-by: Ophir Munk <ophirmu@mellanox.com>
Acked-by: Adrien Mazarguil <adrien.mazarguil@6wind.com>
drivers/net/mlx4/mlx4.h
drivers/net/mlx4/mlx4_mr.c
drivers/net/mlx4/mlx4_rxtx.c
drivers/net/mlx4/mlx4_rxtx.h

index e0a9853..70cf453 100644 (file)
@@ -160,5 +160,7 @@ int mlx4_rx_intr_enable(struct rte_eth_dev *dev, uint16_t idx);
 /* mlx4_mr.c */
 
 struct ibv_mr *mlx4_mp2mr(struct ibv_pd *pd, struct rte_mempool *mp);
+uint32_t mlx4_txq_add_mr(struct txq *txq, struct rte_mempool *mp,
+                        uint32_t i);
 
 #endif /* RTE_PMD_MLX4_H_ */
index 9700884..8105cc5 100644 (file)
@@ -36,7 +36,9 @@
  * Memory management functions for mlx4 driver.
  */
 
+#include <assert.h>
 #include <errno.h>
+#include <inttypes.h>
 #include <stddef.h>
 #include <stdint.h>
 #include <string.h>
 #pragma GCC diagnostic error "-Wpedantic"
 #endif
 
+#include <rte_branch_prediction.h>
 #include <rte_common.h>
 #include <rte_errno.h>
 #include <rte_memory.h>
 #include <rte_mempool.h>
 
+#include "mlx4_rxtx.h"
 #include "mlx4_utils.h"
 
 struct mlx4_check_mempool_data {
@@ -181,3 +185,49 @@ mlx4_mp2mr(struct ibv_pd *pd, struct rte_mempool *mp)
                rte_errno = errno ? errno : EINVAL;
        return mr;
 }
+
+/**
+ * Add memory region (MR) <-> memory pool (MP) association to txq->mp2mr[].
+ * If mp2mr[] is full, remove an entry first.
+ *
+ * @param txq
+ *   Pointer to Tx queue structure.
+ * @param[in] mp
+ *   Memory pool for which a memory region lkey must be added.
+ * @param[in] i
+ *   Index in memory pool (MP) where to add memory region (MR).
+ *
+ * @return
+ *   Added mr->lkey on success, (uint32_t)-1 on failure.
+ */
+uint32_t
+mlx4_txq_add_mr(struct txq *txq, struct rte_mempool *mp, uint32_t i)
+{
+       struct ibv_mr *mr;
+
+       /* Add a new entry, register MR first. */
+       DEBUG("%p: discovered new memory pool \"%s\" (%p)",
+             (void *)txq, mp->name, (void *)mp);
+       mr = mlx4_mp2mr(txq->priv->pd, mp);
+       if (unlikely(mr == NULL)) {
+               DEBUG("%p: unable to configure MR, ibv_reg_mr() failed.",
+                     (void *)txq);
+               return (uint32_t)-1;
+       }
+       if (unlikely(i == RTE_DIM(txq->mp2mr))) {
+               /* Table is full, remove oldest entry. */
+               DEBUG("%p: MR <-> MP table full, dropping oldest entry.",
+                     (void *)txq);
+               --i;
+               claim_zero(ibv_dereg_mr(txq->mp2mr[0].mr));
+               memmove(&txq->mp2mr[0], &txq->mp2mr[1],
+                       (sizeof(txq->mp2mr) - sizeof(txq->mp2mr[0])));
+       }
+       /* Store the new entry. */
+       txq->mp2mr[i].mp = mp;
+       txq->mp2mr[i].mr = mr;
+       txq->mp2mr[i].lkey = mr->lkey;
+       DEBUG("%p: new MR lkey for MP \"%s\" (%p): 0x%08" PRIu32,
+             (void *)txq, mp->name, (void *)mp, txq->mp2mr[i].lkey);
+       return txq->mp2mr[i].lkey;
+}
index 79c7fa2..f1c8dae 100644 (file)
@@ -37,7 +37,6 @@
  */
 
 #include <assert.h>
-#include <inttypes.h>
 #include <stdint.h>
 #include <string.h>
 
@@ -238,63 +237,6 @@ mlx4_txq_mb2mp(struct rte_mbuf *buf)
        return buf->pool;
 }
 
-/**
- * Get memory region (MR) <-> memory pool (MP) association from txq->mp2mr[].
- * Add MP to txq->mp2mr[] if it's not registered yet. If mp2mr[] is full,
- * remove an entry first.
- *
- * @param txq
- *   Pointer to Tx queue structure.
- * @param[in] mp
- *   Memory pool for which a memory region lkey must be returned.
- *
- * @return
- *   mr->lkey on success, (uint32_t)-1 on failure.
- */
-uint32_t
-mlx4_txq_mp2mr(struct txq *txq, struct rte_mempool *mp)
-{
-       unsigned int i;
-       struct ibv_mr *mr;
-
-       for (i = 0; (i != RTE_DIM(txq->mp2mr)); ++i) {
-               if (unlikely(txq->mp2mr[i].mp == NULL)) {
-                       /* Unknown MP, add a new MR for it. */
-                       break;
-               }
-               if (txq->mp2mr[i].mp == mp) {
-                       assert(txq->mp2mr[i].lkey != (uint32_t)-1);
-                       assert(txq->mp2mr[i].mr->lkey == txq->mp2mr[i].lkey);
-                       return txq->mp2mr[i].lkey;
-               }
-       }
-       /* Add a new entry, register MR first. */
-       DEBUG("%p: discovered new memory pool \"%s\" (%p)",
-             (void *)txq, mp->name, (void *)mp);
-       mr = mlx4_mp2mr(txq->priv->pd, mp);
-       if (unlikely(mr == NULL)) {
-               DEBUG("%p: unable to configure MR, ibv_reg_mr() failed.",
-                     (void *)txq);
-               return (uint32_t)-1;
-       }
-       if (unlikely(i == RTE_DIM(txq->mp2mr))) {
-               /* Table is full, remove oldest entry. */
-               DEBUG("%p: MR <-> MP table full, dropping oldest entry.",
-                     (void *)txq);
-               --i;
-               claim_zero(ibv_dereg_mr(txq->mp2mr[0].mr));
-               memmove(&txq->mp2mr[0], &txq->mp2mr[1],
-                       (sizeof(txq->mp2mr) - sizeof(txq->mp2mr[0])));
-       }
-       /* Store the new entry. */
-       txq->mp2mr[i].mp = mp;
-       txq->mp2mr[i].mr = mr;
-       txq->mp2mr[i].lkey = mr->lkey;
-       DEBUG("%p: new MR lkey for MP \"%s\" (%p): 0x%08" PRIu32,
-             (void *)txq, mp->name, (void *)mp, txq->mp2mr[i].lkey);
-       return txq->mp2mr[i].lkey;
-}
-
 /**
  * Posts a single work request to a send queue.
  *
index 7d67748..185dbdf 100644 (file)
@@ -165,7 +165,6 @@ void mlx4_rx_queue_release(void *dpdk_rxq);
 
 /* mlx4_rxtx.c */
 
-uint32_t mlx4_txq_mp2mr(struct txq *txq, struct rte_mempool *mp);
 uint16_t mlx4_tx_burst(void *dpdk_txq, struct rte_mbuf **pkts,
                       uint16_t pkts_n);
 uint16_t mlx4_rx_burst(void *dpdk_rxq, struct rte_mbuf **pkts,
@@ -182,4 +181,34 @@ int mlx4_tx_queue_setup(struct rte_eth_dev *dev, uint16_t idx,
                        const struct rte_eth_txconf *conf);
 void mlx4_tx_queue_release(void *dpdk_txq);
 
+/**
+ * Get memory region (MR) <-> memory pool (MP) association from txq->mp2mr[].
+ * Call mlx4_txq_add_mr() if MP is not registered yet.
+ *
+ * @param txq
+ *   Pointer to Tx queue structure.
+ * @param[in] mp
+ *   Memory pool for which a memory region lkey must be returned.
+ *
+ * @return
+ *   mr->lkey on success, (uint32_t)-1 on failure.
+ */
+static inline uint32_t
+mlx4_txq_mp2mr(struct txq *txq, struct rte_mempool *mp)
+{
+       unsigned int i;
+
+       for (i = 0; (i != RTE_DIM(txq->mp2mr)); ++i) {
+               if (unlikely(txq->mp2mr[i].mp == NULL)) {
+                       /* Unknown MP, add a new MR for it. */
+                       break;
+               }
+               if (txq->mp2mr[i].mp == mp) {
+                       /* MP found MP. */
+                       return txq->mp2mr[i].lkey;
+               }
+       }
+       return mlx4_txq_add_mr(txq, mp, i);
+}
+
 #endif /* MLX4_RXTX_H_ */