diff options
author | Leon Romanovsky <leonro@mellanox.com> | 2019-01-08 09:07:26 -0500 |
---|---|---|
committer | Jason Gunthorpe <jgg@mellanox.com> | 2019-01-08 18:41:38 -0500 |
commit | 13859d5df418ea535926e2b57c29d5161c522b9d (patch) | |
tree | 7dc6de94455552d1ee03c5861e499875c99699c2 | |
parent | 8b4d5bc5cf3f813dc4df5d69c2fcde16c40d8abd (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.c | 3 | ||||
-rw-r--r-- | drivers/infiniband/hw/mlx5/main.c | 41 | ||||
-rw-r--r-- | drivers/infiniband/hw/mlx5/mem.c | 5 | ||||
-rw-r--r-- | drivers/infiniband/hw/mlx5/mr.c | 28 | ||||
-rw-r--r-- | include/rdma/ib_umem_odp.h | 26 |
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, | |||
5722 | void mlx5_ib_stage_init_cleanup(struct mlx5_ib_dev *dev) | 5720 | void 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; |
5797 | err_mp: | 5796 | err_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 | ||
115 | static u64 umem_dma_to_mtt(dma_addr_t umem_dma) | 114 | static 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; |
1408 | error: | 1405 | error: |
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 | ||
88 | struct ib_ucontext_per_mm { | 101 | struct 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); |
108 | void ib_umem_odp_release(struct ib_umem_odp *umem_odp); | 121 | void 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 | |||
123 | int ib_umem_odp_map_dma_pages(struct ib_umem_odp *umem_odp, u64 start_offset, | 123 | int 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); |