mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
synced 2025-01-17 18:36:00 +00:00
RDMA/mlx5: Extend advice MR to support non faulting mode
Extend advice MR to support non faulting mode, this can improve performance by increasing the populated page tables in the device. Link: https://lore.kernel.org/r/20200930163828.1336747-4-leon@kernel.org Signed-off-by: Yishai Hadas <yishaih@nvidia.com> Signed-off-by: Leon Romanovsky <leonro@nvidia.com> Signed-off-by: Jason Gunthorpe <jgg@nvidia.com>
This commit is contained in:
parent
8bfafde086
commit
677cf51f71
@ -1312,7 +1312,8 @@ int mlx5_ib_advise_mr(struct ib_pd *pd,
|
||||
struct uverbs_attr_bundle *attrs)
|
||||
{
|
||||
if (advice != IB_UVERBS_ADVISE_MR_ADVICE_PREFETCH &&
|
||||
advice != IB_UVERBS_ADVISE_MR_ADVICE_PREFETCH_WRITE)
|
||||
advice != IB_UVERBS_ADVISE_MR_ADVICE_PREFETCH_WRITE &&
|
||||
advice != IB_UVERBS_ADVISE_MR_ADVICE_PREFETCH_NO_FAULT)
|
||||
return -EOPNOTSUPP;
|
||||
|
||||
return mlx5_ib_advise_mr_prefetch(pd, advice, flags,
|
||||
|
@ -665,6 +665,7 @@ void mlx5_ib_fence_odp_mr(struct mlx5_ib_mr *mr)
|
||||
}
|
||||
|
||||
#define MLX5_PF_FLAGS_DOWNGRADE BIT(1)
|
||||
#define MLX5_PF_FLAGS_SNAPSHOT BIT(2)
|
||||
static int pagefault_real_mr(struct mlx5_ib_mr *mr, struct ib_umem_odp *odp,
|
||||
u64 user_va, size_t bcnt, u32 *bytes_mapped,
|
||||
u32 flags)
|
||||
@ -673,6 +674,7 @@ static int pagefault_real_mr(struct mlx5_ib_mr *mr, struct ib_umem_odp *odp,
|
||||
bool downgrade = flags & MLX5_PF_FLAGS_DOWNGRADE;
|
||||
u64 access_mask;
|
||||
u64 start_idx;
|
||||
bool fault = !(flags & MLX5_PF_FLAGS_SNAPSHOT);
|
||||
|
||||
page_shift = odp->page_shift;
|
||||
start_idx = (user_va - ib_umem_start(odp)) >> page_shift;
|
||||
@ -681,7 +683,7 @@ static int pagefault_real_mr(struct mlx5_ib_mr *mr, struct ib_umem_odp *odp,
|
||||
if (odp->umem.writable && !downgrade)
|
||||
access_mask |= ODP_WRITE_ALLOWED_BIT;
|
||||
|
||||
np = ib_umem_odp_map_dma_and_lock(odp, user_va, bcnt, access_mask, true);
|
||||
np = ib_umem_odp_map_dma_and_lock(odp, user_va, bcnt, access_mask, fault);
|
||||
if (np < 0)
|
||||
return np;
|
||||
|
||||
@ -1851,6 +1853,9 @@ int mlx5_ib_advise_mr_prefetch(struct ib_pd *pd,
|
||||
if (advice == IB_UVERBS_ADVISE_MR_ADVICE_PREFETCH)
|
||||
pf_flags |= MLX5_PF_FLAGS_DOWNGRADE;
|
||||
|
||||
if (advice == IB_UVERBS_ADVISE_MR_ADVICE_PREFETCH_NO_FAULT)
|
||||
pf_flags |= MLX5_PF_FLAGS_SNAPSHOT;
|
||||
|
||||
if (flags & IB_UVERBS_ADVISE_MR_FLAG_FLUSH)
|
||||
return mlx5_ib_prefetch_sg_list(pd, advice, pf_flags, sg_list,
|
||||
num_sge);
|
||||
|
@ -208,6 +208,7 @@ enum ib_uverbs_read_counters_flags {
|
||||
enum ib_uverbs_advise_mr_advice {
|
||||
IB_UVERBS_ADVISE_MR_ADVICE_PREFETCH,
|
||||
IB_UVERBS_ADVISE_MR_ADVICE_PREFETCH_WRITE,
|
||||
IB_UVERBS_ADVISE_MR_ADVICE_PREFETCH_NO_FAULT,
|
||||
};
|
||||
|
||||
enum ib_uverbs_advise_mr_flag {
|
||||
|
Loading…
x
Reference in New Issue
Block a user