Rely on firmware to get special mkeys
Subsystems (6)
v2 cover Rely on firmware to get special mkeys
Changelog:
v2:
* Took a liberty and rewrote net/mlx5 patches
* change logic around terminate_scatter_list_mkey
* Added capability checks to be before executing command
v1: https://lore.kernel.org/all/[email protected]
* Use already stored mkeys.terminate_scatter_list_mkey.
v0: https://lore.kernel.org/all/[email protected]
-----------------------------------------------------------------------
This series from Or extends mlx5 driver to rely on firmware to get special mkey values.
Thanks
Or Har-Toov (4):
net/mlx5: Expose bits for querying special mkeys net/mlx5: Change define name for 0x100 lkey value net/mlx5e: Use query_special_contexts for mkeys RDMA/mlx5: Use query_special_contexts for mkeys
drivers/infiniband/hw/mlx5/cmd.c | 45 +++++++++++-------- drivers/infiniband/hw/mlx5/cmd.h | 3 +- drivers/infiniband/hw/mlx5/main.c | 10 ++--- drivers/infiniband/hw/mlx5/mlx5_ib.h | 9 +++- drivers/infiniband/hw/mlx5/odp.c | 27 ++++------- drivers/infiniband/hw/mlx5/srq.c | 2 +- drivers/infiniband/hw/mlx5/wr.c | 2 +- .../net/ethernet/mellanox/mlx5/core/en_main.c | 22 ++++++++- include/linux/mlx5/mlx5_ifc.h | 10 ++++- include/linux/mlx5/qp.h | 2 +- 10 files changed, 81 insertions(+), 51 deletions(-)
Signature · 1 line
2.39.0
PATCH v2 1/4 net/mlx5: Expose bits for querying special mkeys
From: Or Har-Toov <[email protected]>
Add needed HW bits to query the values of all special mkeys.
--- include/linux/mlx5/mlx5_ifc.h | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-)
include/linux/mlx5/mlx5_ifc.h +8 -2
@@ -1480,7 +1480,9 @@ struct mlx5_ifc_cmd_hca_cap_bits {u8 relaxed_ordering_write[0x1 ];u8 relaxed_ordering_read[0x1 ];u8 log_max_mkey[0x6 ]; -u8 reserved_at_f0[0x8 ]; +u8 reserved_at_f0[0x6 ]; +u8 terminate_scatter_list_mkey[0x1 ]; +u8 repeated_mkey[0x1 ];u8 dump_fill_mkey[0x1 ];u8 reserved_at_f9[0x2 ];u8 fast_teardown[0x1 ];
@@ -5202,7 +5204,11 @@ struct mlx5_ifc_query_special_contexts_out_bits {u8 null_mkey[0x20 ]; -u8 reserved_at_a0[0x60 ]; +u8 terminate_scatter_list_mkey[0x20 ]; + +u8 repeated_mkey[0x20 ]; + +u8 reserved_at_a0[0x20 ]; };struct mlx5_ifc_query_special_contexts_in_bits {
Signature · 1 line
2.39.0
PATCH v2 2/4 net/mlx5: Change define name for 0x100 lkey value
In reply to Leon RomanovskyFrom: Or Har-Toov <[email protected]>
Change define of 0x100 lkey value from MLX5_INVALID_LKEY to be MLX5_TERMINATE_SCATTER_LIST_LKEY as 0x100 is the value of terminate_scatter_list_mkey.
--- drivers/infiniband/hw/mlx5/odp.c | 10 +++++----- drivers/infiniband/hw/mlx5/srq.c | 2 +- drivers/infiniband/hw/mlx5/wr.c | 2 +- drivers/net/ethernet/mellanox/mlx5/core/en_main.c | 3 ++- include/linux/mlx5/qp.h | 2 +- 5 files changed, 10 insertions(+), 9 deletions(-)
drivers/infiniband/hw/mlx5/odp.c +5 -5
@@ -986,7 +986,7 @@ static int pagefault_data_segments(struct mlx5_ib_dev *dev, {int ret =0 , npages =0 ;u64 io_virt; -u32 key; +__be32 key;u32 byte_count;size_t bcnt;int inline_segment;
@@ -1000,7 +1000,7 @@ static int pagefault_data_segments(struct mlx5_ib_dev *dev,struct mlx5_wqe_data_seg *dseg = wqe; io_virt =be64_to_cpu (dseg->addr); - key =be32_to_cpu (dseg->lkey); + key = dseg->lkey; byte_count =be32_to_cpu (dseg->byte_count); inline_segment = !!(byte_count &MLX5_INLINE_SEG ); bcnt = byte_count & ~MLX5_INLINE_SEG ;
@@ -1014,8 +1014,8 @@ static int pagefault_data_segments(struct mlx5_ib_dev *dev, }/* receive WQE end of sg list. */ -if (receive_queue && bcnt ==0 && key ==MLX5_INVALID_LKEY && - io_virt ==0 ) +if (receive_queue && bcnt ==0 && + key ==MLX5_TERMINATE_SCATTER_LIST_LKEY && io_virt ==0 )break ;if (!inline_segment && total_wqe_bytes) {
@@ -1034,7 +1034,7 @@ static int pagefault_data_segments(struct mlx5_ib_dev *dev,continue ; } - ret =pagefault_single_data_segment (dev,NULL , key, + ret =pagefault_single_data_segment (dev,NULL ,be32_to_cpu (key), io_virt, bcnt, &pfault->bytes_committed, bytes_mapped);
drivers/infiniband/hw/mlx5/srq.c +1 -1
@@ -447,7 +447,7 @@ int mlx5_ib_post_srq_recv(struct ib_srq *ibsrq, const struct ib_recv_wr *wr,if (i < srq->msrq.max_avail_gather) { scat[i].byte_count =0 ; - scat[i].lkey =cpu_to_be32 (MLX5_INVALID_LKEY ); + scat[i].lkey =MLX5_TERMINATE_SCATTER_LIST_LKEY ; scat[i].addr =0 ; } }
drivers/infiniband/hw/mlx5/wr.c +1 -1
@@ -1252,7 +1252,7 @@ int mlx5_ib_post_recv(struct ib_qp *ibqp, const struct ib_recv_wr *wr,if (i < qp->rq.max_gs) { scat[i].byte_count =0 ; - scat[i].lkey =cpu_to_be32 (MLX5_INVALID_LKEY ); + scat[i].lkey =MLX5_TERMINATE_SCATTER_LIST_LKEY ; scat[i].addr =0 ; }
drivers/net/ethernet/mellanox/mlx5/core/en_main.c +2 -1
@@ -825,7 +825,8 @@ static int mlx5e_alloc_rq(struct mlx5e_params *params,/* check if num_frags is not a pow of two */ if (rq->wqe.info.num_frags < (1 << rq->wqe.info.log_num_frags)) { wqe->data[f].byte_count =0 ; - wqe->data[f].lkey =cpu_to_be32 (MLX5_INVALID_LKEY ); + wqe->data[f].lkey = +MLX5_TERMINATE_SCATTER_LIST_LKEY ; wqe->data[f].addr =0 ; } }
include/linux/mlx5/qp.h +1 -1
@@ -36,7 +36,7 @@#include <linux/mlx5/device.h> #include <linux/mlx5/driver.h> -#define MLX5_INVALID_LKEY 0x100 +#define MLX5_TERMINATE_SCATTER_LIST_LKEY cpu_to_be32(0x100)/* UMR (3 WQE_BB's) + SIG (3 WQE_BB's) + PSV (mem) + PSV (wire) */ #define MLX5_SIG_WQE_SIZE (MLX5_SEND_WQE_BB * 8)#define MLX5_DIF_SIZE 8
Signature · 1 line
2.39.0
PATCH v2 3/4 net/mlx5e: Use query_special_contexts for mkeys
In reply to Leon RomanovskyFrom: Or Har-Toov <[email protected]>
Use query_sepcial_contexts in order to get the correct value of terminate_scatter_list_mkey, as FW will change it for certain configurations.
--- .../net/ethernet/mellanox/mlx5/core/en_main.c | 23 +++++++++++++++++-- 1 file changed, 21 insertions(+), 2 deletions(-)
drivers/net/ethernet/mellanox/mlx5/core/en_main.c +21 -2
@@ -661,6 +661,26 @@ static void mlx5e_rq_free_shampo(struct mlx5e_rq *rq)mlx5e_rq_shampo_hd_free (rq); } +static __be32 mlx5e_get_terminate_scatter_list_mkey (struct mlx5_core_dev *dev) +{ +u32 out[MLX5_ST_SZ_DW (query_special_contexts_out)] = {}; +u32 in[MLX5_ST_SZ_DW (query_special_contexts_in)] = {}; +int res; + +if (!MLX5_CAP_GEN (dev, terminate_scatter_list_mkey)) +return MLX5_TERMINATE_SCATTER_LIST_LKEY ; + +MLX5_SET (query_special_contexts_in, in, opcode, +MLX5_CMD_OP_QUERY_SPECIAL_CONTEXTS ); + res =mlx5_cmd_exec_inout (dev, query_special_contexts, in, out); +if (res) +return MLX5_TERMINATE_SCATTER_LIST_LKEY ; + + res =MLX5_GET (query_special_contexts_out, out, + terminate_scatter_list_mkey); +return cpu_to_be32 (res); +} + static int mlx5e_alloc_rq(struct mlx5e_params *params, struct mlx5e_xsk_param *xsk, struct mlx5e_rq_param *rqp,
@@ -825,8 +845,7 @@ static int mlx5e_alloc_rq(struct mlx5e_params *params,/* check if num_frags is not a pow of two */ if (rq->wqe.info.num_frags < (1 << rq->wqe.info.log_num_frags)) { wqe->data[f].byte_count =0 ; - wqe->data[f].lkey = -MLX5_TERMINATE_SCATTER_LIST_LKEY ; + wqe->data[f].lkey =mlx5e_get_terminate_scatter_list_mkey (mdev); wqe->data[f].addr =0 ; } }
Signature · 1 line
2.39.0
PATCH v2 4/4 RDMA/mlx5: Use query_special_contexts for mkeys
In reply to Leon RomanovskyFrom: Or Har-Toov <[email protected]>
Use query_sepcial_contexts to get the correct value of mkeys such as null_mkey, terminate_scatter_list_mkey and dump_fill_mkey, as FW will change them in certain configurations.
--- drivers/infiniband/hw/mlx5/cmd.c | 45 ++++++++++++++++------------ drivers/infiniband/hw/mlx5/cmd.h | 3 +- drivers/infiniband/hw/mlx5/main.c | 10 +++---- drivers/infiniband/hw/mlx5/mlx5_ib.h | 9 +++++- drivers/infiniband/hw/mlx5/odp.c | 21 ++++--------- drivers/infiniband/hw/mlx5/srq.c | 2 +- drivers/infiniband/hw/mlx5/wr.c | 2 +- 7 files changed, 48 insertions(+), 44 deletions(-)
drivers/infiniband/hw/mlx5/cmd.c +26 -19
@@ -5,34 +5,41 @@#include "cmd.h" -int mlx5_cmd_dump_fill_mkey (struct mlx5_core_dev *dev,u32 *mkey) +int mlx5r_cmd_query_special_mkeys (struct mlx5_ib_dev *dev) {u32 out[MLX5_ST_SZ_DW (query_special_contexts_out)] = {};u32 in[MLX5_ST_SZ_DW (query_special_contexts_in)] = {}; +bool is_terminate, is_dump, is_null;int err; -MLX5_SET (query_special_contexts_in, in, opcode, -MLX5_CMD_OP_QUERY_SPECIAL_CONTEXTS ); - err =mlx5_cmd_exec_inout (dev, query_special_contexts, in, out); -if (!err) - *mkey =MLX5_GET (query_special_contexts_out, out, - dump_fill_mkey); -return err; -} + is_terminate =MLX5_CAP_GEN (dev->mdev, terminate_scatter_list_mkey); + is_dump =MLX5_CAP_GEN (dev->mdev, dump_fill_mkey); + is_null =MLX5_CAP_GEN (dev->mdev, null_mkey); -int mlx5_cmd_null_mkey (struct mlx5_core_dev *dev,u32 *null_mkey) -{ -u32 out[MLX5_ST_SZ_DW (query_special_contexts_out)] = {}; -u32 in[MLX5_ST_SZ_DW (query_special_contexts_in)] = {}; -int err; + dev->mkeys.terminate_scatter_list_mkey =MLX5_TERMINATE_SCATTER_LIST_LKEY ; +if (!is_terminate && !is_dump && !is_null) +return 0 ;MLX5_SET (query_special_contexts_in, in, opcode,MLX5_CMD_OP_QUERY_SPECIAL_CONTEXTS ); - err =mlx5_cmd_exec_inout (dev, query_special_contexts, in, out); -if (!err) - *null_mkey =MLX5_GET (query_special_contexts_out, out, - null_mkey); -return err; + err =mlx5_cmd_exec_inout (dev->mdev, query_special_contexts, in, out); +if (err) +return err; + +if (is_dump) + dev->mkeys.dump_fill_mkey =MLX5_GET (query_special_contexts_out, + out, dump_fill_mkey); + +if (is_null) + dev->mkeys.null_mkey =cpu_to_be32 ( +MLX5_GET (query_special_contexts_out, out, null_mkey)); + +if (is_terminate) + dev->mkeys.terminate_scatter_list_mkey = +cpu_to_be32 (MLX5_GET (query_special_contexts_out, out, + terminate_scatter_list_mkey)); + +return 0 ; } int mlx5_cmd_query_cong_params(struct mlx5_core_dev *dev, int cong_point,
drivers/infiniband/hw/mlx5/cmd.h +1 -2
@@ -37,8 +37,7 @@#include <linux/kernel.h> #include <linux/mlx5/driver.h> -int mlx5_cmd_dump_fill_mkey (struct mlx5_core_dev *dev,u32 *mkey); -int mlx5_cmd_null_mkey (struct mlx5_core_dev *dev,u32 *null_mkey); +int mlx5r_cmd_query_special_mkeys (struct mlx5_ib_dev *dev);int mlx5_cmd_query_cong_params (struct mlx5_core_dev *dev,int cong_point,void *out);int mlx5_cmd_dealloc_pd (struct mlx5_core_dev *dev,u32 pdn,u16 uid);
drivers/infiniband/hw/mlx5/main.c +5 -5
@@ -1756,13 +1756,9 @@ static int set_ucontext_resp(struct ib_ucontext *uctx,struct mlx5_ib_dev *dev =to_mdev (ibdev);struct mlx5_ib_ucontext *context =to_mucontext (uctx);struct mlx5_bfreg_info *bfregi = &context->bfregi; -int err;if (MLX5_CAP_GEN (dev->mdev, dump_fill_mkey)) { - err =mlx5_cmd_dump_fill_mkey (dev->mdev, - &resp->dump_fill_mkey); -if (err) -return err; + resp->dump_fill_mkey = dev->mkeys.dump_fill_mkey; resp->comp_mask |=MLX5_IB_ALLOC_UCONTEXT_RESP_MASK_DUMP_FILL_MKEY ; }
@@ -3634,6 +3630,10 @@ static int mlx5_ib_stage_init_init(struct mlx5_ib_dev *dev) dev->port[i].roce.last_port_state =IB_PORT_DOWN ; } + err =mlx5r_cmd_query_special_mkeys (dev); +if (err) +return err; + err =mlx5_ib_init_multiport_master (dev);if (err)return err;
drivers/infiniband/hw/mlx5/mlx5_ib.h +8 -1
@@ -1051,6 +1051,13 @@ struct mlx5_port_caps {u8 ext_port_cap; }; + +struct mlx5_special_mkeys { +u32 dump_fill_mkey; +__be32 null_mkey; +__be32 terminate_scatter_list_mkey; +}; +struct mlx5_ib_dev {struct ib_device ib_dev;struct mlx5_core_dev *mdev;
@@ -1081,7 +1088,6 @@ struct mlx5_ib_dev {struct xarray odp_mkeys; -u32 null_mkey;struct mlx5_ib_flow_db *flow_db;/* protect resources needed as part of reset flow */ spinlock_t reset_flow_resource_lock;
@@ -1110,6 +1116,7 @@ struct mlx5_ib_dev {struct mlx5_port_caps port_caps[MLX5_MAX_PORTS ];u16 pkey_table_len;u8 lag_ports; +struct mlx5_special_mkeys mkeys; };static inline struct mlx5_ib_cq *to_mibcq (struct mlx5_core_cq *mcq)
drivers/infiniband/hw/mlx5/odp.c +6 -15
@@ -104,7 +104,7 @@ static void populate_klm(struct mlx5_klm *pklm, size_t idx, size_t nentries,if (flags &MLX5_IB_UPD_XLT_ZAP ) {for (; pklm != end; pklm++, idx++) { pklm->bcount =cpu_to_be32 (MLX5_IMR_MTT_SIZE ); - pklm->key =cpu_to_be32 (mr_to_mdev (imr)->null_mkey); + pklm->key =mr_to_mdev (imr)->mkeys.null_mkey; pklm->va =0 ; }return ;
@@ -137,7 +137,7 @@ static void populate_klm(struct mlx5_klm *pklm, size_t idx, size_t nentries, pklm->key =cpu_to_be32 (mtt->ibmr.lkey); pklm->va =cpu_to_be64 (idx *MLX5_IMR_MTT_SIZE ); }else { - pklm->key =cpu_to_be32 (mr_to_mdev (imr)->null_mkey); + pklm->key =mr_to_mdev (imr)->mkeys.null_mkey; pklm->va =0 ; } }
@@ -1015,7 +1015,8 @@ static int pagefault_data_segments(struct mlx5_ib_dev *dev,/* receive WQE end of sg list. */ if (receive_queue && bcnt ==0 && - key ==MLX5_TERMINATE_SCATTER_LIST_LKEY && io_virt ==0 ) + key == dev->mkeys.terminate_scatter_list_mkey && + io_virt ==0 )break ;if (!inline_segment && total_wqe_bytes) {
@@ -1615,25 +1616,15 @@ static const struct ib_device_ops mlx5_ib_dev_odp_ops = {int mlx5_ib_odp_init_one (struct mlx5_ib_dev *dev) { -int ret =0 ; -internal_fill_odp_caps (dev);if (!(dev->odp_caps.general_caps &IB_ODP_SUPPORT )) -return ret; +return 0 ;ib_set_device_ops (&dev->ib_dev, &mlx5_ib_dev_odp_ops); -if (dev->odp_caps.general_caps &IB_ODP_SUPPORT_IMPLICIT ) { - ret =mlx5_cmd_null_mkey (dev->mdev, &dev->null_mkey); -if (ret) { -mlx5_ib_err (dev,"Error getting null_mkey %d\n" , ret); -return ret; - } - } -mutex_init (&dev->odp_eq_mutex); -return ret; +return 0 ; }void mlx5_ib_odp_cleanup_one (struct mlx5_ib_dev *dev)
drivers/infiniband/hw/mlx5/srq.c +1 -1
@@ -447,7 +447,7 @@ int mlx5_ib_post_srq_recv(struct ib_srq *ibsrq, const struct ib_recv_wr *wr,if (i < srq->msrq.max_avail_gather) { scat[i].byte_count =0 ; - scat[i].lkey =MLX5_TERMINATE_SCATTER_LIST_LKEY ; + scat[i].lkey = dev->mkeys.terminate_scatter_list_mkey; scat[i].addr =0 ; } }
drivers/infiniband/hw/mlx5/wr.c +1 -1
@@ -1252,7 +1252,7 @@ int mlx5_ib_post_recv(struct ib_qp *ibqp, const struct ib_recv_wr *wr,if (i < qp->rq.max_gs) { scat[i].byte_count =0 ; - scat[i].lkey =MLX5_TERMINATE_SCATTER_LIST_LKEY ; + scat[i].lkey = dev->mkeys.terminate_scatter_list_mkey; scat[i].addr =0 ; }
Signature · 1 line
2.39.0
Jason Gunthorpe
maintainerQuoted 13 lines · Leon Romanovsky
Changelog:
v2:
* Took a liberty and rewrote net/mlx5 patches
* change logic aroundterminate_scatter_list_mkey
* Added capability checks to be before executing command
v1: https://lore.kernel.org/all/[email protected]
* Use already stored mkeys.terminate_scatter_list_mkey.
v0: https://lore.kernel.org/all/[email protected]-----------------------------------------------------------------------
This series from Or extends mlx5 driver to rely on firmware to get special mkey values.
Quoted 7 lines
Thanks
Or Har-Toov (4):
net/mlx5: Expose bits for querying special mkeys net/mlx5: Change define name for0x100lkey value net/mlx5e: Usequery_special_contextsfor mkeys RDMA/mlx5: Usequery_special_contextsfor mkeys
I pulled this into rdma, Saeed/Leon if you need these commits in the shared branch then you can fast-forward the shared branch to:
commit 1b1e4868836a4b5b375be75fd4c9583d29500517
Author: Or Har-Toov <[email protected]> Date: Tue Jan 17 15:14:51 2023 +0200
net/mlx5e: Use query_special_contexts for mkeys
Thanks,
Jason