summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorLeon Romanovsky <leonro@mellanox.com>2019-01-08 09:07:26 -0500
committerJason Gunthorpe <jgg@mellanox.com>2019-01-08 18:41:38 -0500
commit13859d5df418ea535926e2b57c29d5161c522b9d (patch)
tree7dc6de94455552d1ee03c5861e499875c99699c2
parent8b4d5bc5cf3f813dc4df5d69c2fcde16c40d8abd (diff)
RDMA/mlx5: Embed into the code flow the ODP config option
Convert various places to more readable code, which embeds CONFIG_INFINIBAND_ON_DEMAND_PAGING into the code flow. Signed-off-by: Leon Romanovsky <leonro@mellanox.com> Signed-off-by: Jason Gunthorpe <jgg@mellanox.com>
-rw-r--r--drivers/infiniband/core/uverbs_cmd.c3
-rw-r--r--drivers/infiniband/hw/mlx5/main.c41
-rw-r--r--drivers/infiniband/hw/mlx5/mem.c5
-rw-r--r--drivers/infiniband/hw/mlx5/mr.c28
-rw-r--r--include/rdma/ib_umem_odp.h26
5 files changed, 46 insertions, 57 deletions
diff --git a/drivers/infiniband/core/uverbs_cmd.c b/drivers/infiniband/core/uverbs_cmd.c
index 549d9eedf62e..d4f1a2ef5015 100644
--- a/drivers/infiniband/core/uverbs_cmd.c
+++ b/drivers/infiniband/core/uverbs_cmd.c
@@ -234,14 +234,11 @@ static int ib_uverbs_get_context(struct uverbs_attr_bundle *attrs)
234 ucontext->closing = false; 234 ucontext->closing = false;
235 ucontext->cleanup_retryable = false; 235 ucontext->cleanup_retryable = false;
236 236
237#ifdef CONFIG_INFINIBAND_ON_DEMAND_PAGING
238 mutex_init(&ucontext->per_mm_list_lock); 237 mutex_init(&ucontext->per_mm_list_lock);
239 INIT_LIST_HEAD(&ucontext->per_mm_list); 238 INIT_LIST_HEAD(&ucontext->per_mm_list);
240 if (!(ib_dev->attrs.device_cap_flags & IB_DEVICE_ON_DEMAND_PAGING)) 239 if (!(ib_dev->attrs.device_cap_flags & IB_DEVICE_ON_DEMAND_PAGING))
241 ucontext->invalidate_range = NULL; 240 ucontext->invalidate_range = NULL;
242 241
243#endif
244
245 resp.num_comp_vectors = file->device->num_comp_vectors; 242 resp.num_comp_vectors = file->device->num_comp_vectors;
246 243
247 ret = get_unused_fd_flags(O_CLOEXEC); 244 ret = get_unused_fd_flags(O_CLOEXEC);
diff --git a/drivers/infiniband/hw/mlx5/main.c b/drivers/infiniband/hw/mlx5/main.c
index 06ee1f0cb22d..11e9783cefcc 100644
--- a/drivers/infiniband/hw/mlx5/main.c
+++ b/drivers/infiniband/hw/mlx5/main.c
@@ -1763,9 +1763,9 @@ static struct ib_ucontext *mlx5_ib_alloc_ucontext(struct ib_device *ibdev,
1763 if (err) 1763 if (err)
1764 goto out_sys_pages; 1764 goto out_sys_pages;
1765 1765
1766#ifdef CONFIG_INFINIBAND_ON_DEMAND_PAGING 1766 if (ibdev->attrs.device_cap_flags & IB_DEVICE_ON_DEMAND_PAGING)
1767 context->ibucontext.invalidate_range = &mlx5_ib_invalidate_range; 1767 context->ibucontext.invalidate_range =
1768#endif 1768 &mlx5_ib_invalidate_range;
1769 1769
1770 if (req.flags & MLX5_IB_ALLOC_UCTX_DEVX) { 1770 if (req.flags & MLX5_IB_ALLOC_UCTX_DEVX) {
1771 err = mlx5_ib_devx_create(dev, true); 1771 err = mlx5_ib_devx_create(dev, true);
@@ -1897,12 +1897,10 @@ static int mlx5_ib_dealloc_ucontext(struct ib_ucontext *ibcontext)
1897 struct mlx5_ib_dev *dev = to_mdev(ibcontext->device); 1897 struct mlx5_ib_dev *dev = to_mdev(ibcontext->device);
1898 struct mlx5_bfreg_info *bfregi; 1898 struct mlx5_bfreg_info *bfregi;
1899 1899
1900#ifdef CONFIG_INFINIBAND_ON_DEMAND_PAGING
1901 /* All umem's must be destroyed before destroying the ucontext. */ 1900 /* All umem's must be destroyed before destroying the ucontext. */
1902 mutex_lock(&ibcontext->per_mm_list_lock); 1901 mutex_lock(&ibcontext->per_mm_list_lock);
1903 WARN_ON(!list_empty(&ibcontext->per_mm_list)); 1902 WARN_ON(!list_empty(&ibcontext->per_mm_list));
1904 mutex_unlock(&ibcontext->per_mm_list_lock); 1903 mutex_unlock(&ibcontext->per_mm_list_lock);
1905#endif
1906 1904
1907 bfregi = &context->bfregi; 1905 bfregi = &context->bfregi;
1908 mlx5_ib_dealloc_transport_domain(dev, context->tdn, context->devx_uid); 1906 mlx5_ib_dealloc_transport_domain(dev, context->tdn, context->devx_uid);
@@ -5722,11 +5720,11 @@ static struct ib_counters *mlx5_ib_create_counters(struct ib_device *device,
5722void mlx5_ib_stage_init_cleanup(struct mlx5_ib_dev *dev) 5720void mlx5_ib_stage_init_cleanup(struct mlx5_ib_dev *dev)
5723{ 5721{
5724 mlx5_ib_cleanup_multiport_master(dev); 5722 mlx5_ib_cleanup_multiport_master(dev);
5725#ifdef CONFIG_INFINIBAND_ON_DEMAND_PAGING 5723 if (IS_ENABLED(CONFIG_INFINIBAND_ON_DEMAND_PAGING)) {
5726 cleanup_srcu_struct(&dev->mr_srcu); 5724 cleanup_srcu_struct(&dev->mr_srcu);
5727 drain_workqueue(dev->advise_mr_wq); 5725 drain_workqueue(dev->advise_mr_wq);
5728 destroy_workqueue(dev->advise_mr_wq); 5726 destroy_workqueue(dev->advise_mr_wq);
5729#endif 5727 }
5730 kfree(dev->port); 5728 kfree(dev->port);
5731} 5729}
5732 5730
@@ -5779,19 +5777,20 @@ int mlx5_ib_stage_init_init(struct mlx5_ib_dev *dev)
5779 spin_lock_init(&dev->memic.memic_lock); 5777 spin_lock_init(&dev->memic.memic_lock);
5780 dev->memic.dev = mdev; 5778 dev->memic.dev = mdev;
5781 5779
5782#ifdef CONFIG_INFINIBAND_ON_DEMAND_PAGING 5780 if (IS_ENABLED(CONFIG_INFINIBAND_ON_DEMAND_PAGING)) {
5783 dev->advise_mr_wq = alloc_ordered_workqueue("mlx5_ib_advise_mr_wq", 0); 5781 dev->advise_mr_wq =
5784 if (!dev->advise_mr_wq) { 5782 alloc_ordered_workqueue("mlx5_ib_advise_mr_wq", 0);
5785 err = -ENOMEM; 5783 if (!dev->advise_mr_wq) {
5786 goto err_mp; 5784 err = -ENOMEM;
5787 } 5785 goto err_mp;
5786 }
5788 5787
5789 err = init_srcu_struct(&dev->mr_srcu); 5788 err = init_srcu_struct(&dev->mr_srcu);
5790 if (err) { 5789 if (err) {
5791 destroy_workqueue(dev->advise_mr_wq); 5790 destroy_workqueue(dev->advise_mr_wq);
5792 goto err_mp; 5791 goto err_mp;
5792 }
5793 } 5793 }
5794#endif
5795 5794
5796 return 0; 5795 return 0;
5797err_mp: 5796err_mp:
diff --git a/drivers/infiniband/hw/mlx5/mem.c b/drivers/infiniband/hw/mlx5/mem.c
index 549234988bb4..9f90be296ee0 100644
--- a/drivers/infiniband/hw/mlx5/mem.c
+++ b/drivers/infiniband/hw/mlx5/mem.c
@@ -111,7 +111,6 @@ void mlx5_ib_cont_pages(struct ib_umem *umem, u64 addr,
111 *count = i; 111 *count = i;
112} 112}
113 113
114#ifdef CONFIG_INFINIBAND_ON_DEMAND_PAGING
115static u64 umem_dma_to_mtt(dma_addr_t umem_dma) 114static u64 umem_dma_to_mtt(dma_addr_t umem_dma)
116{ 115{
117 u64 mtt_entry = umem_dma & ODP_DMA_ADDR_MASK; 116 u64 mtt_entry = umem_dma & ODP_DMA_ADDR_MASK;
@@ -123,7 +122,6 @@ static u64 umem_dma_to_mtt(dma_addr_t umem_dma)
123 122
124 return mtt_entry; 123 return mtt_entry;
125} 124}
126#endif
127 125
128/* 126/*
129 * Populate the given array with bus addresses from the umem. 127 * Populate the given array with bus addresses from the umem.
@@ -151,7 +149,7 @@ void __mlx5_ib_populate_pas(struct mlx5_ib_dev *dev, struct ib_umem *umem,
151 int len; 149 int len;
152 struct scatterlist *sg; 150 struct scatterlist *sg;
153 int entry; 151 int entry;
154#ifdef CONFIG_INFINIBAND_ON_DEMAND_PAGING 152
155 if (umem->is_odp) { 153 if (umem->is_odp) {
156 WARN_ON(shift != 0); 154 WARN_ON(shift != 0);
157 WARN_ON(access_flags != (MLX5_IB_MTT_READ | MLX5_IB_MTT_WRITE)); 155 WARN_ON(access_flags != (MLX5_IB_MTT_READ | MLX5_IB_MTT_WRITE));
@@ -164,7 +162,6 @@ void __mlx5_ib_populate_pas(struct mlx5_ib_dev *dev, struct ib_umem *umem,
164 } 162 }
165 return; 163 return;
166 } 164 }
167#endif
168 165
169 i = 0; 166 i = 0;
170 for_each_sg(umem->sg_head.sgl, sg, umem->nmap, entry) { 167 for_each_sg(umem->sg_head.sgl, sg, umem->nmap, entry) {
diff --git a/drivers/infiniband/hw/mlx5/mr.c b/drivers/infiniband/hw/mlx5/mr.c
index c389750f771e..494a90f4348c 100644
--- a/drivers/infiniband/hw/mlx5/mr.c
+++ b/drivers/infiniband/hw/mlx5/mr.c
@@ -71,10 +71,9 @@ static int destroy_mkey(struct mlx5_ib_dev *dev, struct mlx5_ib_mr *mr)
71{ 71{
72 int err = mlx5_core_destroy_mkey(dev->mdev, &mr->mmkey); 72 int err = mlx5_core_destroy_mkey(dev->mdev, &mr->mmkey);
73 73
74#ifdef CONFIG_INFINIBAND_ON_DEMAND_PAGING 74 if (IS_ENABLED(CONFIG_INFINIBAND_ON_DEMAND_PAGING))
75 /* Wait until all page fault handlers using the mr complete. */ 75 /* Wait until all page fault handlers using the mr complete. */
76 synchronize_srcu(&dev->mr_srcu); 76 synchronize_srcu(&dev->mr_srcu);
77#endif
78 77
79 return err; 78 return err;
80} 79}
@@ -254,9 +253,8 @@ static void remove_keys(struct mlx5_ib_dev *dev, int c, int num)
254 mlx5_core_destroy_mkey(dev->mdev, &mr->mmkey); 253 mlx5_core_destroy_mkey(dev->mdev, &mr->mmkey);
255 } 254 }
256 255
257#ifdef CONFIG_INFINIBAND_ON_DEMAND_PAGING 256 if (IS_ENABLED(CONFIG_INFINIBAND_ON_DEMAND_PAGING))
258 synchronize_srcu(&dev->mr_srcu); 257 synchronize_srcu(&dev->mr_srcu);
259#endif
260 258
261 list_for_each_entry_safe(mr, tmp_mr, &del_list, list) { 259 list_for_each_entry_safe(mr, tmp_mr, &del_list, list) {
262 list_del(&mr->list); 260 list_del(&mr->list);
@@ -1329,8 +1327,8 @@ struct ib_mr *mlx5_ib_reg_user_mr(struct ib_pd *pd, u64 start, u64 length,
1329 mlx5_ib_dbg(dev, "start 0x%llx, virt_addr 0x%llx, length 0x%llx, access_flags 0x%x\n", 1327 mlx5_ib_dbg(dev, "start 0x%llx, virt_addr 0x%llx, length 0x%llx, access_flags 0x%x\n",
1330 start, virt_addr, length, access_flags); 1328 start, virt_addr, length, access_flags);
1331 1329
1332#ifdef CONFIG_INFINIBAND_ON_DEMAND_PAGING 1330 if (IS_ENABLED(CONFIG_INFINIBAND_ON_DEMAND_PAGING) && !start &&
1333 if (!start && length == U64_MAX) { 1331 length == U64_MAX) {
1334 if (!(access_flags & IB_ACCESS_ON_DEMAND) || 1332 if (!(access_flags & IB_ACCESS_ON_DEMAND) ||
1335 !(dev->odp_caps.general_caps & IB_ODP_SUPPORT_IMPLICIT)) 1333 !(dev->odp_caps.general_caps & IB_ODP_SUPPORT_IMPLICIT))
1336 return ERR_PTR(-EINVAL); 1334 return ERR_PTR(-EINVAL);
@@ -1340,7 +1338,6 @@ struct ib_mr *mlx5_ib_reg_user_mr(struct ib_pd *pd, u64 start, u64 length,
1340 return ERR_CAST(mr); 1338 return ERR_CAST(mr);
1341 return &mr->ibmr; 1339 return &mr->ibmr;
1342 } 1340 }
1343#endif
1344 1341
1345 err = mr_umem_get(pd, start, length, access_flags, &umem, &npages, 1342 err = mr_umem_get(pd, start, length, access_flags, &umem, &npages,
1346 &page_shift, &ncont, &order); 1343 &page_shift, &ncont, &order);
@@ -1401,9 +1398,9 @@ struct ib_mr *mlx5_ib_reg_user_mr(struct ib_pd *pd, u64 start, u64 length,
1401 } 1398 }
1402 } 1399 }
1403 1400
1404#ifdef CONFIG_INFINIBAND_ON_DEMAND_PAGING 1401 if (IS_ENABLED(CONFIG_INFINIBAND_ON_DEMAND_PAGING))
1405 mr->live = 1; 1402 mr->live = 1;
1406#endif 1403
1407 return &mr->ibmr; 1404 return &mr->ibmr;
1408error: 1405error:
1409 ib_umem_release(umem); 1406 ib_umem_release(umem);
@@ -1518,9 +1515,8 @@ int mlx5_ib_rereg_user_mr(struct ib_mr *ib_mr, int flags, u64 start,
1518 } 1515 }
1519 1516
1520 mr->allocated_from_cache = 0; 1517 mr->allocated_from_cache = 0;
1521#ifdef CONFIG_INFINIBAND_ON_DEMAND_PAGING 1518 if (IS_ENABLED(CONFIG_INFINIBAND_ON_DEMAND_PAGING))
1522 mr->live = 1; 1519 mr->live = 1;
1523#endif
1524 } else { 1520 } else {
1525 /* 1521 /*
1526 * Send a UMR WQE 1522 * Send a UMR WQE
diff --git a/include/rdma/ib_umem_odp.h b/include/rdma/ib_umem_odp.h
index 0b1446fe2fab..d3725cf13ecd 100644
--- a/include/rdma/ib_umem_odp.h
+++ b/include/rdma/ib_umem_odp.h
@@ -83,6 +83,19 @@ static inline struct ib_umem_odp *to_ib_umem_odp(struct ib_umem *umem)
83 return container_of(umem, struct ib_umem_odp, umem); 83 return container_of(umem, struct ib_umem_odp, umem);
84} 84}
85 85
86/*
87 * The lower 2 bits of the DMA address signal the R/W permissions for
88 * the entry. To upgrade the permissions, provide the appropriate
89 * bitmask to the map_dma_pages function.
90 *
91 * Be aware that upgrading a mapped address might result in change of
92 * the DMA address for the page.
93 */
94#define ODP_READ_ALLOWED_BIT (1<<0ULL)
95#define ODP_WRITE_ALLOWED_BIT (1<<1ULL)
96
97#define ODP_DMA_ADDR_MASK (~(ODP_READ_ALLOWED_BIT | ODP_WRITE_ALLOWED_BIT))
98
86#ifdef CONFIG_INFINIBAND_ON_DEMAND_PAGING 99#ifdef CONFIG_INFINIBAND_ON_DEMAND_PAGING
87 100
88struct ib_ucontext_per_mm { 101struct ib_ucontext_per_mm {
@@ -107,19 +120,6 @@ struct ib_umem_odp *ib_alloc_odp_umem(struct ib_ucontext_per_mm *per_mm,
107 unsigned long addr, size_t size); 120 unsigned long addr, size_t size);
108void ib_umem_odp_release(struct ib_umem_odp *umem_odp); 121void ib_umem_odp_release(struct ib_umem_odp *umem_odp);
109 122
110/*
111 * The lower 2 bits of the DMA address signal the R/W permissions for
112 * the entry. To upgrade the permissions, provide the appropriate
113 * bitmask to the map_dma_pages function.
114 *
115 * Be aware that upgrading a mapped address might result in change of
116 * the DMA address for the page.
117 */
118#define ODP_READ_ALLOWED_BIT (1<<0ULL)
119#define ODP_WRITE_ALLOWED_BIT (1<<1ULL)
120
121#define ODP_DMA_ADDR_MASK (~(ODP_READ_ALLOWED_BIT | ODP_WRITE_ALLOWED_BIT))
122
123int ib_umem_odp_map_dma_pages(struct ib_umem_odp *umem_odp, u64 start_offset, 123int ib_umem_odp_map_dma_pages(struct ib_umem_odp *umem_odp, u64 start_offset,
124 u64 bcnt, u64 access_mask, 124 u64 bcnt, u64 access_mask,
125 unsigned long current_seq); 125 unsigned long current_seq);