From: Michael Guralnik <michaelgur@xxxxxxxxxx> Align the caps checked when using the log_page_size 6th bit in the mkey context to the PRM definition. The upper and lower bounds are set by max/min caps and modifying of the 6th bit by UMR is allowed only when a specific UMR cap is set. Current implementation falsely assumes all page sizes up-to 2^63 are supported when the UMR cap is set. In case the upper bound cap is lower than 63, this might result a FW syndrome on mkey creation. Previous cap enforcement is still correct for all current HW, FW and driver combinations. However, this patch aligns the code to be spec compliant in the general case. Signed-off-by: Michael Guralnik <michaelgur@xxxxxxxxxx> Reviewed-by: Yishai Hadas <yishaih@xxxxxxxxxx> Signed-off-by: Leon Romanovsky <leonro@xxxxxxxxxx> --- drivers/infiniband/hw/mlx5/mlx5_ib.h | 23 +++++++++++++++++++---- 1 file changed, 19 insertions(+), 4 deletions(-) diff --git a/drivers/infiniband/hw/mlx5/mlx5_ib.h b/drivers/infiniband/hw/mlx5/mlx5_ib.h index ace2df3e1d9f..a6ef052c4344 100644 --- a/drivers/infiniband/hw/mlx5/mlx5_ib.h +++ b/drivers/infiniband/hw/mlx5/mlx5_ib.h @@ -1753,10 +1753,25 @@ static __always_inline unsigned long mlx5_umem_mkc_find_best_pgsz(struct mlx5_ib_dev *dev, struct ib_umem *umem, u64 iova) { - int page_size_bits = - MLX5_CAP_GEN_2(dev->mdev, umr_log_entity_size_5) ? 6 : 5; - unsigned long bitmap = - __mlx5_log_page_size_to_bitmap(page_size_bits, 0); + unsigned int max_log_size, max_log_size_cap, min_log_size; + unsigned long bitmap; + + max_log_size_cap = + MLX5_CAP_GEN_2(dev->mdev, max_mkey_log_entity_size_mtt) ? + MLX5_CAP_GEN_2(dev->mdev, + max_mkey_log_entity_size_mtt) : + 31; + + max_log_size = MLX5_CAP_GEN_2(dev->mdev, umr_log_entity_size_5) ? + max_log_size_cap : + min(max_log_size_cap, 31); + + min_log_size = + MLX5_CAP_GEN_2(dev->mdev, log_min_mkey_entity_size) ? + MLX5_CAP_GEN_2(dev->mdev, log_min_mkey_entity_size) : + MLX5_ADAPTER_PAGE_SHIFT; + + bitmap = GENMASK_ULL(max_log_size, min_log_size); return ib_umem_find_best_pgsz(umem, bitmap, iova); } -- 2.48.1