shenango-bsd/mlx5_18_11.patch

151 lines
4.8 KiB
Diff

From 970312d4e39fad07a67683e24b0870efd9d7b3e1 Mon Sep 17 00:00:00 2001
From: Josh Fried <joshuafried@gmail.com>
Date: Thu, 31 Jan 2019 12:53:00 -0500
Subject: [PATCH] MLX5 support for the iokernel
---
config/common_base | 2 +-
drivers/net/mlx5/Makefile | 2 ++
drivers/net/mlx5/mlx5_custom.h | 8 ++++++++
drivers/net/mlx5/mlx5_mr.c | 17 +++++++++++++++++
drivers/net/mlx5/mlx5_mr.h | 2 ++
drivers/net/mlx5/mlx5_rxtx.h | 22 +++++++---------------
drivers/net/mlx5/rte_pmd_mlx5_version.map | 4 ++++
7 files changed, 41 insertions(+), 16 deletions(-)
create mode 100644 drivers/net/mlx5/mlx5_custom.h
diff --git a/config/common_base b/config/common_base
index d12ae98bc..616b15fed 100644
--- a/config/common_base
+++ b/config/common_base
@@ -317,7 +317,7 @@ CONFIG_RTE_LIBRTE_MLX4_DLOPEN_DEPS=n
# Compile burst-oriented Mellanox ConnectX-4, ConnectX-5 & Bluefield
# (MLX5) PMD
#
-CONFIG_RTE_LIBRTE_MLX5_PMD=n
+CONFIG_RTE_LIBRTE_MLX5_PMD=y
CONFIG_RTE_LIBRTE_MLX5_DEBUG=n
CONFIG_RTE_LIBRTE_MLX5_DLOPEN_DEPS=n
diff --git a/drivers/net/mlx5/Makefile b/drivers/net/mlx5/Makefile
index 895cdfeed..a9f25ff5c 100644
--- a/drivers/net/mlx5/Makefile
+++ b/drivers/net/mlx5/Makefile
@@ -10,6 +10,8 @@ LIB_GLUE = $(LIB_GLUE_BASE).$(LIB_GLUE_VERSION)
LIB_GLUE_BASE = librte_pmd_mlx5_glue.so
LIB_GLUE_VERSION = 18.11.0
+SYMLINK-$(CONFIG_RTE_LIBRTE_MLX5_PMD)-include += mlx5_custom.h
+
# Sources.
SRCS-$(CONFIG_RTE_LIBRTE_MLX5_PMD) += mlx5.c
ifneq ($(CONFIG_RTE_LIBRTE_MLX5_DLOPEN_DEPS),y)
diff --git a/drivers/net/mlx5/mlx5_custom.h b/drivers/net/mlx5/mlx5_custom.h
new file mode 100644
index 000000000..925721de9
--- /dev/null
+++ b/drivers/net/mlx5/mlx5_custom.h
@@ -0,0 +1,8 @@
+
+#ifndef RTE_PMD_MLX5_CUSTOM_H
+#define RTE_PMD_MLX5_CUSTOM_H
+
+void *mlx5_manual_reg_mr(uint8_t port_id, void *addr, size_t length, uint32_t *lkey_out);
+void mlx5_manual_dereg_mr(void *ibv_mr);
+
+#endif /* RTE_PMD_MLX5_CUSTOM_H */
diff --git a/drivers/net/mlx5/mlx5_mr.c b/drivers/net/mlx5/mlx5_mr.c
index 442b2d232..00ef98ab6 100644
--- a/drivers/net/mlx5/mlx5_mr.c
+++ b/drivers/net/mlx5/mlx5_mr.c
@@ -1368,3 +1368,20 @@ mlx5_mr_release(struct rte_eth_dev *dev)
/* Free all remaining MRs. */
mlx5_mr_garbage_collect(dev);
}
+
+void *
+mlx5_manual_reg_mr(uint8_t port_id, void *addr, size_t length, uint32_t *lkey_out)
+{
+ struct rte_eth_dev *dev = &rte_eth_devices[port_id];
+ struct priv *priv = dev->data->dev_private;
+ struct ibv_mr *ibv_mr = mlx5_glue->reg_mr(priv->pd, addr, length, IBV_ACCESS_LOCAL_WRITE);
+ if (ibv_mr && lkey_out) *lkey_out = rte_cpu_to_be_32(ibv_mr->lkey);
+
+ return ibv_mr;
+}
+
+void
+mlx5_manual_dereg_mr(void *ibv_mr)
+{
+ mlx5_glue->dereg_mr(ibv_mr);
+}
diff --git a/drivers/net/mlx5/mlx5_mr.h b/drivers/net/mlx5/mlx5_mr.h
index a57003fe9..9db10045e 100644
--- a/drivers/net/mlx5/mlx5_mr.h
+++ b/drivers/net/mlx5/mlx5_mr.h
@@ -26,6 +26,8 @@
#include <rte_rwlock.h>
#include <rte_bitmap.h>
+#include "mlx5_custom.h"
+
/* Memory Region object. */
struct mlx5_mr {
LIST_ENTRY(mlx5_mr) mr; /**< Pointer to the prev/next entry. */
diff --git a/drivers/net/mlx5/mlx5_rxtx.h b/drivers/net/mlx5/mlx5_rxtx.h
index f47d327cf..18612cc2d 100644
--- a/drivers/net/mlx5/mlx5_rxtx.h
+++ b/drivers/net/mlx5/mlx5_rxtx.h
@@ -656,6 +656,10 @@ mlx5_rx_addr2mr(struct mlx5_rxq_data *rxq, uintptr_t addr)
#define mlx5_rx_mb2mr(rxq, mb) mlx5_rx_addr2mr(rxq, (uintptr_t)((mb)->buf_addr))
+struct mem_info {
+ uint32_t lkey;
+};
+
/**
* Query LKey from a packet buffer for Tx. If not found, add the mempool.
*
@@ -668,22 +672,10 @@ mlx5_rx_addr2mr(struct mlx5_rxq_data *rxq, uintptr_t addr)
* Searched LKey on success, UINT32_MAX on no match.
*/
static __rte_always_inline uint32_t
-mlx5_tx_mb2mr(struct mlx5_txq_data *txq, struct rte_mbuf *mb)
+mlx5_tx_mb2mr(struct mlx5_txq_data *txq __rte_unused, struct rte_mbuf *mb)
{
- struct mlx5_mr_ctrl *mr_ctrl = &txq->mr_ctrl;
- uintptr_t addr = (uintptr_t)mb->buf_addr;
- uint32_t lkey;
-
- /* Check generation bit to see if there's any change on existing MRs. */
- if (unlikely(*mr_ctrl->dev_gen_ptr != mr_ctrl->cur_gen))
- mlx5_mr_flush_local_cache(mr_ctrl);
- /* Linear search on MR cache array. */
- lkey = mlx5_mr_lookup_cache(mr_ctrl->cache, &mr_ctrl->mru,
- MLX5_MR_CACHE_N, addr);
- if (likely(lkey != UINT32_MAX))
- return lkey;
- /* Take slower bottom-half on miss. */
- return mlx5_tx_mb2mr_bh(txq, mb);
+ struct mem_info *m = (struct mem_info *)(((char *) mb) + sizeof(struct rte_mbuf));
+ return m->lkey;
}
/**
diff --git a/drivers/net/mlx5/rte_pmd_mlx5_version.map b/drivers/net/mlx5/rte_pmd_mlx5_version.map
index ad607bbed..eb819010c 100644
--- a/drivers/net/mlx5/rte_pmd_mlx5_version.map
+++ b/drivers/net/mlx5/rte_pmd_mlx5_version.map
@@ -1,3 +1,7 @@
DPDK_2.2 {
local: *;
+
+ global:
+ mlx5_manual_reg_mr;
+ mlx5_manual_dereg_mr;
};
--
2.17.1