Commit 8b4d5bc5 authored by Leon Romanovsky's avatar Leon Romanovsky Committed by Jason Gunthorpe

RDMA/mlx5: Introduce and reuse helper to identify ODP MR

Consolidate various checks if MR is ODP backed to one simple helper and
update call sites to use it.
Signed-off-by: default avatarLeon Romanovsky <leonro@mellanox.com>
Signed-off-by: default avatarJason Gunthorpe <jgg@mellanox.com>
parent e502b8b0
...@@ -36,6 +36,7 @@ ...@@ -36,6 +36,7 @@
#include <linux/kernel.h> #include <linux/kernel.h>
#include <linux/sched.h> #include <linux/sched.h>
#include <rdma/ib_verbs.h> #include <rdma/ib_verbs.h>
#include <rdma/ib_umem.h>
#include <rdma/ib_smi.h> #include <rdma/ib_smi.h>
#include <linux/mlx5/driver.h> #include <linux/mlx5/driver.h>
#include <linux/mlx5/cq.h> #include <linux/mlx5/cq.h>
...@@ -589,6 +590,12 @@ struct mlx5_ib_mr { ...@@ -589,6 +590,12 @@ struct mlx5_ib_mr {
wait_queue_head_t q_leaf_free; wait_queue_head_t q_leaf_free;
}; };
static inline bool is_odp_mr(struct mlx5_ib_mr *mr)
{
return IS_ENABLED(CONFIG_INFINIBAND_ON_DEMAND_PAGING) && mr->umem &&
mr->umem->is_odp;
}
struct mlx5_ib_mw { struct mlx5_ib_mw {
struct ib_mw ibmw; struct ib_mw ibmw;
struct mlx5_core_mkey mmkey; struct mlx5_core_mkey mmkey;
...@@ -1213,6 +1220,9 @@ mlx5_ib_advise_mr_prefetch(struct ib_pd *pd, ...@@ -1213,6 +1220,9 @@ mlx5_ib_advise_mr_prefetch(struct ib_pd *pd,
{ {
return -EOPNOTSUPP; return -EOPNOTSUPP;
} }
static inline void mlx5_ib_invalidate_range(struct ib_umem_odp *umem_odp,
unsigned long start,
unsigned long end){};
#endif /* CONFIG_INFINIBAND_ON_DEMAND_PAGING */ #endif /* CONFIG_INFINIBAND_ON_DEMAND_PAGING */
/* Needed for rep profile */ /* Needed for rep profile */
......
...@@ -95,10 +95,9 @@ static bool use_umr_mtt_update(struct mlx5_ib_mr *mr, u64 start, u64 length) ...@@ -95,10 +95,9 @@ static bool use_umr_mtt_update(struct mlx5_ib_mr *mr, u64 start, u64 length)
length + (start & (MLX5_ADAPTER_PAGE_SIZE - 1)); length + (start & (MLX5_ADAPTER_PAGE_SIZE - 1));
} }
#ifdef CONFIG_INFINIBAND_ON_DEMAND_PAGING
static void update_odp_mr(struct mlx5_ib_mr *mr) static void update_odp_mr(struct mlx5_ib_mr *mr)
{ {
if (mr->umem->is_odp) { if (is_odp_mr(mr)) {
/* /*
* This barrier prevents the compiler from moving the * This barrier prevents the compiler from moving the
* setting of umem->odp_data->private to point to our * setting of umem->odp_data->private to point to our
...@@ -121,7 +120,6 @@ static void update_odp_mr(struct mlx5_ib_mr *mr) ...@@ -121,7 +120,6 @@ static void update_odp_mr(struct mlx5_ib_mr *mr)
smp_wmb(); smp_wmb();
} }
} }
#endif
static void reg_mr_callback(int status, void *context) static void reg_mr_callback(int status, void *context)
{ {
...@@ -1386,9 +1384,7 @@ struct ib_mr *mlx5_ib_reg_user_mr(struct ib_pd *pd, u64 start, u64 length, ...@@ -1386,9 +1384,7 @@ struct ib_mr *mlx5_ib_reg_user_mr(struct ib_pd *pd, u64 start, u64 length,
mr->umem = umem; mr->umem = umem;
set_mr_fields(dev, mr, npages, length, access_flags); set_mr_fields(dev, mr, npages, length, access_flags);
#ifdef CONFIG_INFINIBAND_ON_DEMAND_PAGING
update_odp_mr(mr); update_odp_mr(mr);
#endif
if (!populate_mtts) { if (!populate_mtts) {
int update_xlt_flags = MLX5_IB_UPD_XLT_ENABLE; int update_xlt_flags = MLX5_IB_UPD_XLT_ENABLE;
...@@ -1553,9 +1549,7 @@ int mlx5_ib_rereg_user_mr(struct ib_mr *ib_mr, int flags, u64 start, ...@@ -1553,9 +1549,7 @@ int mlx5_ib_rereg_user_mr(struct ib_mr *ib_mr, int flags, u64 start,
set_mr_fields(dev, mr, npages, len, access_flags); set_mr_fields(dev, mr, npages, len, access_flags);
#ifdef CONFIG_INFINIBAND_ON_DEMAND_PAGING
update_odp_mr(mr); update_odp_mr(mr);
#endif
return 0; return 0;
err: err:
...@@ -1641,8 +1635,7 @@ static void dereg_mr(struct mlx5_ib_dev *dev, struct mlx5_ib_mr *mr) ...@@ -1641,8 +1635,7 @@ static void dereg_mr(struct mlx5_ib_dev *dev, struct mlx5_ib_mr *mr)
int npages = mr->npages; int npages = mr->npages;
struct ib_umem *umem = mr->umem; struct ib_umem *umem = mr->umem;
#ifdef CONFIG_INFINIBAND_ON_DEMAND_PAGING if (is_odp_mr(mr)) {
if (umem && umem->is_odp) {
struct ib_umem_odp *umem_odp = to_ib_umem_odp(umem); struct ib_umem_odp *umem_odp = to_ib_umem_odp(umem);
/* Prevent new page faults from succeeding */ /* Prevent new page faults from succeeding */
...@@ -1666,7 +1659,7 @@ static void dereg_mr(struct mlx5_ib_dev *dev, struct mlx5_ib_mr *mr) ...@@ -1666,7 +1659,7 @@ static void dereg_mr(struct mlx5_ib_dev *dev, struct mlx5_ib_mr *mr)
/* Avoid double-freeing the umem. */ /* Avoid double-freeing the umem. */
umem = NULL; umem = NULL;
} }
#endif
clean_mr(dev, mr); clean_mr(dev, mr);
/* /*
......
...@@ -103,7 +103,7 @@ static int check_parent(struct ib_umem_odp *odp, ...@@ -103,7 +103,7 @@ static int check_parent(struct ib_umem_odp *odp,
struct ib_ucontext_per_mm *mr_to_per_mm(struct mlx5_ib_mr *mr) struct ib_ucontext_per_mm *mr_to_per_mm(struct mlx5_ib_mr *mr)
{ {
if (WARN_ON(!mr || !mr->umem || !mr->umem->is_odp)) if (WARN_ON(!mr || !is_odp_mr(mr)))
return NULL; return NULL;
return to_ib_umem_odp(mr->umem)->per_mm; return to_ib_umem_odp(mr->umem)->per_mm;
...@@ -739,12 +739,12 @@ static int pagefault_single_data_segment(struct mlx5_ib_dev *dev, u32 key, ...@@ -739,12 +739,12 @@ static int pagefault_single_data_segment(struct mlx5_ib_dev *dev, u32 key,
goto srcu_unlock; goto srcu_unlock;
} }
if (prefetch && !mr->umem->is_odp) { if (prefetch && !is_odp_mr(mr)) {
ret = -EINVAL; ret = -EINVAL;
goto srcu_unlock; goto srcu_unlock;
} }
if (!mr->umem->is_odp) { if (!is_odp_mr(mr)) {
mlx5_ib_dbg(dev, "skipping non ODP MR (lkey=0x%06x) in page fault handler.\n", mlx5_ib_dbg(dev, "skipping non ODP MR (lkey=0x%06x) in page fault handler.\n",
key); key);
if (bytes_mapped) if (bytes_mapped)
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment