From c8334c0248218f73cc69fe1e8ba30b91c4c184f7 Mon Sep 17 00:00:00 2001 From: Dotan Barak Date: Wed, 22 Feb 2012 14:27:55 +0200 Subject: [PATCH] ib/mlx4: Enable usermode FMR Orabug: 21517998 Signed-off-by: Arun Kaimalettu Signed-off-by: Dotan Barak (Ported from UEK2/Mellanox OFED 1.5.5R2) Signed-off-by: Mukesh Kacker --- drivers/infiniband/hw/mlx4/main.c | 6 +++++- drivers/infiniband/hw/mlx4/mlx4_ib.h | 1 + drivers/infiniband/hw/mlx4/mr.c | 8 ++++++++ drivers/net/ethernet/mellanox/mlx4/mr.c | 13 +++++++++++++ include/linux/mlx4/device.h | 1 + 5 files changed, 28 insertions(+), 1 deletion(-) diff --git a/drivers/infiniband/hw/mlx4/main.c b/drivers/infiniband/hw/mlx4/main.c index aefe6027aaec..76afca050e0a 100644 --- a/drivers/infiniband/hw/mlx4/main.c +++ b/drivers/infiniband/hw/mlx4/main.c @@ -2297,7 +2297,10 @@ static void *mlx4_ib_add(struct mlx4_dev *dev) (1ull << IB_USER_VERBS_CMD_CREATE_XSRQ) | (1ull << IB_USER_VERBS_CMD_OPEN_QP) | (1ull << IB_USER_VERBS_CMD_ALLOC_SHPD) | - (1ull << IB_USER_VERBS_CMD_SHARE_PD); + (1ull << IB_USER_VERBS_CMD_SHARE_PD) | + (1ull << IB_USER_VERBS_CMD_REG_MR_RELAXED) | + (1ull << IB_USER_VERBS_CMD_DEREG_MR_RELAXED) | + (1ull << IB_USER_VERBS_CMD_FLUSH_RELAXED_MR); ibdev->ib_dev.query_device = mlx4_ib_query_device; ibdev->ib_dev.query_port = mlx4_ib_query_port; @@ -2344,6 +2347,7 @@ static void *mlx4_ib_add(struct mlx4_dev *dev) ibdev->ib_dev.alloc_shpd = mlx4_ib_alloc_shpd; ibdev->ib_dev.share_pd = mlx4_ib_share_pd; ibdev->ib_dev.remove_shpd = mlx4_ib_remove_shpd; + ibdev->ib_dev.set_fmr_pd = mlx4_ib_set_fmr_pd; if (!mlx4_is_slave(ibdev->dev)) { ibdev->ib_dev.alloc_fmr = mlx4_ib_fmr_alloc; diff --git a/drivers/infiniband/hw/mlx4/mlx4_ib.h b/drivers/infiniband/hw/mlx4/mlx4_ib.h index 432ef2eb9212..31ea8862c2b0 100644 --- a/drivers/infiniband/hw/mlx4/mlx4_ib.h +++ b/drivers/infiniband/hw/mlx4/mlx4_ib.h @@ -785,6 +785,7 @@ void mlx4_ib_mad_cleanup(struct mlx4_ib_dev *dev); struct ib_fmr *mlx4_ib_fmr_alloc(struct ib_pd *pd, int mr_access_flags, struct ib_fmr_attr *fmr_attr); +int mlx4_ib_set_fmr_pd(struct ib_fmr *ibfmr, struct ib_pd *pd); int mlx4_ib_map_phys_fmr(struct ib_fmr *ibfmr, u64 *page_list, int npages, u64 iova); int mlx4_ib_unmap_fmr(struct list_head *fmr_list); diff --git a/drivers/infiniband/hw/mlx4/mr.c b/drivers/infiniband/hw/mlx4/mr.c index 1cb08bd30072..d7fe76847917 100644 --- a/drivers/infiniband/hw/mlx4/mr.c +++ b/drivers/infiniband/hw/mlx4/mr.c @@ -728,6 +728,14 @@ err_free: return ERR_PTR(err); } +int mlx4_ib_set_fmr_pd(struct ib_fmr *ibfmr, struct ib_pd *pd) +{ + struct mlx4_ib_fmr *ifmr = to_mfmr(ibfmr); + u32 pdn = to_mpd(pd)->pdn; + + return mlx4_set_fmr_pd(&ifmr->mfmr, pdn); +} + int mlx4_ib_map_phys_fmr(struct ib_fmr *ibfmr, u64 *page_list, int npages, u64 iova) { diff --git a/drivers/net/ethernet/mellanox/mlx4/mr.c b/drivers/net/ethernet/mellanox/mlx4/mr.c index 23e5014f5a69..0e770fd75311 100644 --- a/drivers/net/ethernet/mellanox/mlx4/mr.c +++ b/drivers/net/ethernet/mellanox/mlx4/mr.c @@ -999,6 +999,13 @@ static inline int mlx4_check_fmr(struct mlx4_fmr *fmr, u64 *page_list, return 0; } +int mlx4_set_fmr_pd(struct mlx4_fmr *fmr, u32 pd) +{ + fmr->mr.pd = pd; + return 0; +} +EXPORT_SYMBOL_GPL(mlx4_set_fmr_pd); + int mlx4_map_phys_fmr(struct mlx4_dev *dev, struct mlx4_fmr *fmr, u64 *page_list, int npages, u64 iova, u32 *lkey, u32 *rkey) { @@ -1034,6 +1041,12 @@ int mlx4_map_phys_fmr(struct mlx4_dev *dev, struct mlx4_fmr *fmr, u64 *page_list fmr->mpt->length = cpu_to_be64(npages * (1ull << fmr->page_shift)); fmr->mpt->start = cpu_to_be64(iova); + fmr->mpt->pd_flags = cpu_to_be32(fmr->mr.pd | MLX4_MPT_PD_FLAG_EN_INV); + if (fmr->mr.mtt.order >= 0 && fmr->mr.mtt.page_shift == 0) { + fmr->mpt->pd_flags |= cpu_to_be32(MLX4_MPT_PD_FLAG_FAST_REG | + MLX4_MPT_PD_FLAG_RAE); + } + /* Make MTT entries are visible before setting MPT status */ wmb(); diff --git a/include/linux/mlx4/device.h b/include/linux/mlx4/device.h index 7a1428ae1f53..a2d538fff462 100644 --- a/include/linux/mlx4/device.h +++ b/include/linux/mlx4/device.h @@ -1327,6 +1327,7 @@ int mlx4_find_cached_vlan(struct mlx4_dev *dev, u8 port, u16 vid, int *idx); int mlx4_register_vlan(struct mlx4_dev *dev, u8 port, u16 vlan, int *index); void mlx4_unregister_vlan(struct mlx4_dev *dev, u8 port, u16 vlan); +int mlx4_set_fmr_pd(struct mlx4_fmr *fmr, u32 pd); int mlx4_map_phys_fmr(struct mlx4_dev *dev, struct mlx4_fmr *fmr, u64 *page_list, int npages, u64 iova, u32 *lkey, u32 *rkey); int mlx4_fmr_alloc(struct mlx4_dev *dev, u32 pd, u32 access, int max_pages, -- 2.50.1