IB/mlx5: Add support for big MRs
authorArtemy Kovalyov <artemyko@mellanox.com>
Mon, 2 Jan 2017 09:37:43 +0000 (11:37 +0200)
committerDavid S. Miller <davem@davemloft.net>
Mon, 2 Jan 2017 20:51:20 +0000 (15:51 -0500)
Make use of extended UMR translation offset.

Signed-off-by: Artemy Kovalyov <artemyko@mellanox.com>
Signed-off-by: Leon Romanovsky <leon@kernel.org>
Signed-off-by: Saeed Mahameed <saeedm@mellanox.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
drivers/infiniband/hw/mlx5/mlx5_ib.h
drivers/infiniband/hw/mlx5/mr.c
drivers/infiniband/hw/mlx5/odp.c

index d79580dcf20f26be3e5a98b57889f12827e61dac..73bff77ab20c40f5cc1f69fd0d0310ce90534417 100644 (file)
@@ -634,6 +634,7 @@ struct mlx5_ib_dev {
        int                             fill_delay;
 #ifdef CONFIG_INFINIBAND_ON_DEMAND_PAGING
        struct ib_odp_caps      odp_caps;
+       u64                     odp_max_size;
        /*
         * Sleepable RCU that prevents destruction of MRs while they are still
         * being used by a page fault handler.
index be8d38d7ca12b5c16bb461c19dc7043edf72c36e..4d40fe0556bdf98be4e54cec8299a84fea059203 100644 (file)
@@ -1121,8 +1121,9 @@ static struct mlx5_ib_mr *reg_create(struct ib_mr *ibmr, struct ib_pd *pd,
                goto err_1;
        }
        pas = (__be64 *)MLX5_ADDR_OF(create_mkey_in, in, klm_pas_mtt);
-       mlx5_ib_populate_pas(dev, umem, page_shift, pas,
-                            pg_cap ? MLX5_IB_MTT_PRESENT : 0);
+       if (!(access_flags & IB_ACCESS_ON_DEMAND))
+               mlx5_ib_populate_pas(dev, umem, page_shift, pas,
+                                    pg_cap ? MLX5_IB_MTT_PRESENT : 0);
 
        /* The pg_access bit allows setting the access flags
         * in the page list submitted with the command. */
@@ -1210,7 +1211,8 @@ struct ib_mr *mlx5_ib_reg_user_mr(struct ib_pd *pd, u64 start, u64 length,
                        mlx5_ib_dbg(dev, "cache empty for order %d", order);
                        mr = NULL;
                }
-       } else if (access_flags & IB_ACCESS_ON_DEMAND) {
+       } else if (access_flags & IB_ACCESS_ON_DEMAND &&
+                  !MLX5_CAP_GEN(dev->mdev, umr_extended_translation_offset)) {
                err = -EINVAL;
                pr_err("Got MR registration for ODP MR > 512MB, not supported for Connect-IB");
                goto error;
index 67651eca59c525517de889ae79e88048173acbe9..1e73c127feb72f6e8775a5a2be791663a2d1268c 100644 (file)
@@ -121,6 +121,11 @@ void mlx5_ib_internal_fill_odp_caps(struct mlx5_ib_dev *dev)
 
        caps->general_caps = IB_ODP_SUPPORT;
 
+       if (MLX5_CAP_GEN(dev->mdev, umr_extended_translation_offset))
+               dev->odp_max_size = U64_MAX;
+       else
+               dev->odp_max_size = BIT_ULL(MLX5_MAX_UMR_SHIFT + PAGE_SHIFT);
+
        if (MLX5_CAP_ODP(dev->mdev, ud_odp_caps.send))
                caps->per_transport_caps.ud_odp_caps |= IB_ODP_SUPPORT_SEND;