diff --git a/drivers/infiniband/hw/mlx5/mr.c b/drivers/infiniband/hw/mlx5/mr.c
index 29a9da5c6dca..5f6d91c47483 100644
--- a/drivers/infiniband/hw/mlx5/mr.c
+++ b/drivers/infiniband/hw/mlx5/mr.c
@@ -128,30 +128,6 @@ static int get_mkc_octo_size(unsigned int access_mode, unsigned int ndescs)
return ret;
}
-static int get_unchangeable_access_flags(struct mlx5_ib_dev *dev,
- int access_flags)
-{
- int ret = 0;
-
- if ((access_flags & IB_ACCESS_REMOTE_ATOMIC) &&
- MLX5_CAP_GEN(dev->mdev, atomic) &&
- MLX5_CAP_GEN(dev->mdev, umr_modify_atomic_disabled))
- ret |= IB_ACCESS_REMOTE_ATOMIC;
-
- if ((access_flags & IB_ACCESS_RELAXED_ORDERING) &&
- MLX5_CAP_GEN(dev->mdev, mkc_order_write_after_write_ro) &&
- !MLX5_CAP_GEN(dev->mdev, order_write_after_write_umr))
- ret |= IB_ACCESS_RELAXED_ORDERING;
-
- if ((access_flags & IB_ACCESS_RELAXED_ORDERING) &&
- (MLX5_CAP_GEN(dev->mdev, pci_relaxed_ordered_read) ||
- MLX5_CAP_GEN(dev->mdev, relaxed_ordering_read_pci_enabled)) &&
- !MLX5_CAP_GEN(dev->mdev, pci_relaxed_ordered_read_umr))
- ret |= IB_ACCESS_RELAXED_ORDERING;
-
- return ret;
-}
-
#define MLX5_FRMR_POOLS_KEY_ACCESS_MODE_KSM_MASK 1ULL
#define MLX5_FRMR_POOLS_KEY_VENDOR_KEY_SUPPORTED \
MLX5_FRMR_POOLS_KEY_ACCESS_MODE_KSM_MASK@@ -173,7 +149,7 @@ _mlx5_frmr_pool_alloc(struct mlx5_ib_dev *dev, struct ib_umem *umem,
mr->ibmr.frmr.key.ats = mlx5_umem_needs_ats(dev, umem, access_flags);
mr->ibmr.frmr.key.access_flags =
- get_unchangeable_access_flags(dev, access_flags);
+ mlx5r_umr_get_unchangeable_access_flags(dev, access_flags);
mr->ibmr.frmr.key.num_dma_blocks =
ib_umem_num_dma_blocks(umem, page_size);
mr->ibmr.frmr.key.vendor_key =
@@ -205,7 +181,7 @@ struct mlx5_ib_mr *mlx5_mr_cache_alloc(struct mlx5_ib_dev *dev,
{
struct ib_frmr_key key = {
.access_flags =
- get_unchangeable_access_flags(dev, access_flags),
+ mlx5r_umr_get_unchangeable_access_flags(dev, access_flags),
.vendor_key = access_mode == MLX5_MKC_ACCESS_MODE_MTT ?
0 :
MLX5_FRMR_POOLS_KEY_ACCESS_MODE_KSM_MASK,@@ -324,7 +300,7 @@ static int mlx5r_build_frmr_key(struct ib_device *device,
out->ats = in->ats;
out->access_flags =
- get_unchangeable_access_flags(dev, in->access_flags);
+ mlx5r_umr_get_unchangeable_access_flags(dev, in->access_flags);
out->vendor_key = in->vendor_key;
out->num_dma_blocks = in->num_dma_blocks;
diff --git a/drivers/infiniband/hw/mlx5/umr.h b/drivers/infiniband/hw/mlx5/umr.h
index 04dec726b267..a6c4f35b75e6 100644
--- a/drivers/infiniband/hw/mlx5/umr.h
+++ b/drivers/infiniband/hw/mlx5/umr.h
@@ -44,34 +44,39 @@ static inline bool mlx5r_umr_can_load_pas(struct mlx5_ib_dev *dev,
return true;
}
-/*
- * true if an existing MR can be reconfigured to new access_flags using UMR.
- * Older HW cannot use UMR to update certain elements of the MKC. See
- * get_umr_update_access_mask() and umr_check_mkey_mask()
- */
-static inline bool mlx5r_umr_can_reconfig(struct mlx5_ib_dev *dev,
- unsigned int current_access_flags,
- unsigned int target_access_flags)
+/* Return subset of access_flags whose mkey fields can't be updated via UMR. */
+static inline unsigned int
+mlx5r_umr_get_unchangeable_access_flags(struct mlx5_ib_dev *dev,
+ unsigned int access_flags)
{
- unsigned int diffs = current_access_flags ^ target_access_flags;
+ unsigned int ret = 0;
- if ((diffs & IB_ACCESS_REMOTE_ATOMIC) &&
+ if ((access_flags & IB_ACCESS_REMOTE_ATOMIC) &&
MLX5_CAP_GEN(dev->mdev, atomic) &&
MLX5_CAP_GEN(dev->mdev, umr_modify_atomic_disabled))
- return false;
+ ret |= IB_ACCESS_REMOTE_ATOMIC;
- if ((diffs & IB_ACCESS_RELAXED_ORDERING) &&
+ if ((access_flags & IB_ACCESS_RELAXED_ORDERING) &&
MLX5_CAP_GEN(dev->mdev, mkc_order_write_after_write_ro) &&
!MLX5_CAP_GEN(dev->mdev, order_write_after_write_umr))
- return false;
+ ret |= IB_ACCESS_RELAXED_ORDERING;
- if ((diffs & IB_ACCESS_RELAXED_ORDERING) &&
+ if ((access_flags & IB_ACCESS_RELAXED_ORDERING) &&
(MLX5_CAP_GEN(dev->mdev, pci_relaxed_ordered_read) ||
MLX5_CAP_GEN(dev->mdev, relaxed_ordering_read_pci_enabled)) &&
!MLX5_CAP_GEN(dev->mdev, pci_relaxed_ordered_read_umr))
- return false;
+ ret |= IB_ACCESS_RELAXED_ORDERING;
- return true;
+ return ret;
+}
+
+/* true if an existing MR can be reconfigured to new access_flags using UMR. */
+static inline bool mlx5r_umr_can_reconfig(struct mlx5_ib_dev *dev,
+ unsigned int current_access_flags,
+ unsigned int target_access_flags)
+{
+ return mlx5r_umr_get_unchangeable_access_flags(
+ dev, current_access_flags ^ target_access_flags) == 0;
}
static inline u64 mlx5r_umr_get_xlt_octo(u64 bytes)--
2.52.0