]> www.infradead.org Git - users/jedix/linux-maple.git/commitdiff
ib/mlx4: Enable usermode FMR
authorDotan Barak <dotanb@dev.mellanox.co.il>
Wed, 22 Feb 2012 12:27:55 +0000 (14:27 +0200)
committerMukesh Kacker <mukesh.kacker@oracle.com>
Fri, 11 Sep 2015 17:14:40 +0000 (10:14 -0700)
Orabug: 21517998

Signed-off-by: Arun Kaimalettu <arun.kaimalettu@oracle.com>
Signed-off-by: Dotan Barak <dotanb@dev.mellanox.co.il>
(Ported from UEK2/Mellanox OFED 1.5.5R2)

Signed-off-by: Mukesh Kacker <mukesh.kacker@oracle.com>
drivers/infiniband/hw/mlx4/main.c
drivers/infiniband/hw/mlx4/mlx4_ib.h
drivers/infiniband/hw/mlx4/mr.c
drivers/net/ethernet/mellanox/mlx4/mr.c
include/linux/mlx4/device.h

index aefe6027aaec8d71ccb58f60b42d4c0f2a41949e..76afca050e0accf0c4544158a76cb23b4a3b506e 100644 (file)
@@ -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;
index 432ef2eb9212eceeb988a65d7fc5d89add234267..31ea8862c2b06bfcdfbfa7330fcf1837360d3895 100644 (file)
@@ -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);
index 1cb08bd30072f254cfddff12f6d7480e7fd2ffb9..d7fe768479178e3448bb191087c9e3b49b9384de 100644 (file)
@@ -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)
 {
index 23e5014f5a690da31053108b7ae2902d963658d6..0e770fd753119359405d8895e445f1b71001bfc1 100644 (file)
@@ -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();
 
index 7a1428ae1f53fd6aa01c6f7d6ebb44638c375b47..a2d538fff462fad67d5e2f4b16a1f92f6f843b18 100644 (file)
@@ -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,