Expand ODP MR to support implicit registration
Subsystems (3)
cover Expand ODP MR to support implicit registration
Hi Doug,
This patchset comes from Artemy Kovalyov who proposed to expand current ODP feature to register memory with simplified and enhanced semantics.
In existing ODP implementation applications still register memory buffers for communication, though registered memory regions need not have valid mappings at registration time.
This patchset adds implicit ODP sematics, where applications are provided with a special memory key that represents their complete address space.
Thus all IO accesses referencing this key (subject to the access rights associated with the key) won't need register any virtual address range.
Thanks,
Artemy, Ilya and Leon
---
CC: Artemy Kovalyov <artemyko-VPRAkNaXOzVWk0Htik3J/[email protected]>
CC: Ilya Lesokhin <ilyal-VPRAkNaXOzVWk0Htik3J/[email protected]>
---
This patchset was generated against commitf502d834950a ("net/mlx5: Activate support for 4K UARs") and it applies cleanly on k.o/for-4.11 branch.
This series has merge conflict with "IB/mlx5: Remove deprecated module parameter" commit which was sent earlier.
The conflict fix can be found at the following merge commit:
https://git.kernel.org/cgit/linux/kernel/git/leon/linux-rdma.git/commit/?h=rdma-next&id=ff2fc3dcef94ff36cdcac32afaef1e2ee2120755
Available in the "topic/odp-ksm" topic branch of this git repo:git://git.kernel.org/pub/scm/linux/kernel/git/leon/linux-rdma.git
Or for browsing:
https://git.kernel.org/cgit/linux/kernel/git/leon/linux-rdma.git/log/?h=topic/odp-ksm
Artemy Kovalyov (6):
IB/core: Add implicit MR flag
IB/umem: Update on demand page (ODP) support IB/umem: Indicate that process is being terminated IB/mlx5: Add null_mkey access
IB/mlx5: Expose MR cache for mlx5_ib IB/mlx5: Add implicit MR support
drivers/infiniband/core/umem.c | 3 - drivers/infiniband/core/umem_odp.c | 92 ++++++- drivers/infiniband/core/umem_rbtree.c | 21 +- drivers/infiniband/hw/mlx5/Makefile | 2 +- drivers/infiniband/hw/mlx5/cmd.c | 48 ++++ drivers/infiniband/hw/mlx5/cmd.h | 40 +++ drivers/infiniband/hw/mlx5/main.c | 2 + drivers/infiniband/hw/mlx5/mlx5_ib.h | 29 +- drivers/infiniband/hw/mlx5/mr.c | 128 +++++++-- drivers/infiniband/hw/mlx5/odp.c | 505 +++++++++++++++++++++++++++++++--- include/linux/mlx5/driver.h | 5 +- include/rdma/ib_umem_odp.h | 21 +- include/rdma/ib_verbs.h | 3 +- 13 files changed, 800 insertions(+), 99 deletions(-) create mode 100644 drivers/infiniband/hw/mlx5/cmd.c create mode 100644 drivers/infiniband/hw/mlx5/cmd.h
--
2.10.2
--
To unsubscribe from this list: send the line "unsubscribe linux-rdma" in the body of a message to [email protected] More majordomo info at http://vger.kernel.org/majordomo-info.html
A message that is not in the archive (sent off-list or not yet received): 20170118145811.9136-1-leon-DgEjT+Ai2ygdnm+yROfE0A@public.gmane.org
PATCH 1/6 IB/core: Add implicit MR flag
From: Artemy Kovalyov <artemyko-VPRAkNaXOzVWk0Htik3J/[email protected]>
Add flag IB_ODP_SUPPORT_IMPLICIT indicating implicit MR supported.
--- include/rdma/ib_verbs.h | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-)
include/rdma/ib_verbs.h +2 -1
@@ -241,7 +241,8 @@ enum ib_atomic_cap { };enum ib_odp_general_cap_bits { -IB_ODP_SUPPORT =1 <<0 , +IB_ODP_SUPPORT =1 <<0 , +IB_ODP_SUPPORT_IMPLICIT =1 <<1 , };enum ib_odp_transport_cap_bits {
Signature · 6 lines
2.10.2 -- To unsubscribe from this list: send the line "unsubscribe linux-rdma" in the body of a message to [email protected] More majordomo info at http://vger.kernel.org/majordomo-info.html
PATCH 2/6 IB/umem: Update on demand page (ODP) support
In reply to a message not in the archiveFrom: Artemy Kovalyov <artemyko-VPRAkNaXOzVWk0Htik3J/[email protected]>
Currently ODP MR may explicitly register virtual address space area of limited length.
This change allows MR to cover entire process virtual address space dynamicaly adding/removing translation entries to device MTT.
Add following changes to support implicit MR:
* Allow umem to be zero size to back-up implicit MR.
* Add new function ib_alloc_odp_umem() to add virtual memory regions to implicit MR dynamically on demand.
* Add new function rbt_ib_umem_lookup() to find dynamically added virtual memory regions.
* Expose function rbt_ib_umem_for_each_in_range() to other modules and make it safe
--- drivers/infiniband/core/umem.c | 3 -- drivers/infiniband/core/umem_odp.c | 87 +++++++++++++++++++++++++++++++---- drivers/infiniband/core/umem_rbtree.c | 21 +++++++-- include/rdma/ib_umem_odp.h | 21 +++++++-- 4 files changed, 113 insertions(+), 19 deletions(-)
drivers/infiniband/core/umem.c +0 -3
@@ -99,9 +99,6 @@ struct ib_umem *ib_umem_get(struct ib_ucontext *context, unsigned long addr,if (dmasync) dma_attrs |=DMA_ATTR_WRITE_BARRIER ; -if (!size) -return ERR_PTR (-EINVAL ); -/* * If the combination of the addr and size requested for this memory * region causes an integer overflow, return error.
drivers/infiniband/core/umem_odp.c +78 -9
114 lines not on this page · raw message
drivers/infiniband/core/umem_rbtree.c +18 -3
@@ -78,17 +78,32 @@ int rbt_ib_umem_for_each_in_range(struct rb_root *root, void *cookie) {int ret_val =0 ; -struct umem_odp_node *node; +struct umem_odp_node *node, *next;struct ib_umem_odp *umem;if (unlikely (start == last))return ret_val; -for (node =rbt_ib_umem_iter_first (root, start, last -1 ); node; - node =rbt_ib_umem_iter_next (node, start, last -1 )) { +for (node =rbt_ib_umem_iter_first (root, start, last -1 ); + node; node = next) { + next =rbt_ib_umem_iter_next (node, start, last -1 ); umem = container_of(node, struct ib_umem_odp, interval_tree); ret_val =cb (umem->umem, start, last, cookie) || ret_val; }return ret_val; } +EXPORT_SYMBOL (rbt_ib_umem_for_each_in_range); + +struct ib_umem_odp *rbt_ib_umem_lookup (struct rb_root *root, +u64 addr,u64 length) +{ +struct umem_odp_node *node; + + node =rbt_ib_umem_iter_first (root, addr, addr + length -1 ); +if (node) + return container_of(node, struct ib_umem_odp, interval_tree); +return NULL ; + +} +EXPORT_SYMBOL (rbt_ib_umem_lookup);
include/rdma/ib_umem_odp.h +17 -4
@@ -79,11 +79,15 @@ struct ib_umem_odp {struct completion notifier_completion;int dying; +struct work_struct work; };#ifdef CONFIG_INFINIBAND_ON_DEMAND_PAGING int ib_umem_odp_get (struct ib_ucontext *context,struct ib_umem *umem); +struct ib_umem *ib_alloc_odp_umem (struct ib_ucontext *context, +unsigned long addr, +size_t size);void ib_umem_odp_release (struct ib_umem *umem);
@@ -117,10 +121,12 @@ typedef int (*umem_call_back)(struct ib_umem *item, u64 start, u64 end,int rbt_ib_umem_for_each_in_range (struct rb_root *root,u64 start,u64 end,umem_call_back cb,void *cookie); -struct umem_odp_node *rbt_ib_umem_iter_first (struct rb_root *root, -u64 start,u64 last); -struct umem_odp_node *rbt_ib_umem_iter_next (struct umem_odp_node *node, -u64 start,u64 last); +/* +* Find first region intersecting with address range. +* Return NULL if not found +*/ +struct ib_umem_odp *rbt_ib_umem_lookup (struct rb_root *root, +u64 addr,u64 length);static inline int ib_umem_mmu_notifier_retry (struct ib_umem *item,unsigned long mmu_seq)
@@ -153,6 +159,13 @@ static inline int ib_umem_odp_get(struct ib_ucontext *context, return -EINVAL; } +static inline struct ib_umem *ib_alloc_odp_umem (struct ib_ucontext *context, +unsigned long addr, +size_t size) +{ +return ERR_PTR (-EINVAL ); +} +static inline void ib_umem_odp_release (struct ib_umem *umem) {}#endif /* CONFIG_INFINIBAND_ON_DEMAND_PAGING */
Signature · 6 lines
2.10.2 -- To unsubscribe from this list: send the line "unsubscribe linux-rdma" in the body of a message to [email protected] More majordomo info at http://vger.kernel.org/majordomo-info.html
PATCH 3/6 IB/umem: Indicate that process is being terminated
In reply to a message not in the archiveFrom: Artemy Kovalyov <artemyko-VPRAkNaXOzVWk0Htik3J/[email protected]>
When process is killed while pagefault operation still in progress - function will fail. In this specific case we don't want any warnings in dmesg to avoid log analyzers false alerts. So we need distinct error code for this case.
--- drivers/infiniband/core/umem_odp.c | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-)
drivers/infiniband/core/umem_odp.c +3 -2
@@ -573,7 +573,8 @@ static int ib_umem_odp_map_dma_single_page(* for failure. * An -EAGAIN error code is returned when a concurrent mmu notifier prevents * the function from completing its task. -* +* An -ENOENT error code indicates that userspace process is being terminated +* and mm was already destroyed. * @umem: the umem to map and pin * @user_virt: the address from which we need to map. * @bcnt: the minimal number of bytes to pin and map. The mapping might be
@@ -621,7 +622,7 @@ int ib_umem_odp_map_dma_pages(struct ib_umem *umem, u64 user_virt, u64 bcnt, owning_mm =get_task_mm (owning_process);if (owning_mm ==NULL ) { - ret = -EINVAL ; + ret = -ENOENT ; goto out_put_task; }
Signature · 6 lines
2.10.2 -- To unsubscribe from this list: send the line "unsubscribe linux-rdma" in the body of a message to [email protected] More majordomo info at http://vger.kernel.org/majordomo-info.html
PATCH 4/6 IB/mlx5: Add null_mkey access
In reply to a message not in the archiveFrom: Artemy Kovalyov <artemyko-VPRAkNaXOzVWk0Htik3J/[email protected]>
Add mlx5_cmd_null_mkey() function to access null_mkey information from firmware.
--- drivers/infiniband/hw/mlx5/Makefile | 2 +- drivers/infiniband/hw/mlx5/cmd.c | 48 +++++++++++++++++++++++++++++++++++++ drivers/infiniband/hw/mlx5/cmd.h | 40 +++++++++++++++++++++++++++++++ 3 files changed, 89 insertions(+), 1 deletion(-) create mode 100644 drivers/infiniband/hw/mlx5/cmd.c create mode 100644 drivers/infiniband/hw/mlx5/cmd.h
drivers/infiniband/hw/mlx5/Makefile +1 -1
@@ -1,4 +1,4 @@ obj-$(CONFIG_MLX5_INFINIBAND) += mlx5_ib.o -mlx5_ib-y := main.o cq.o doorbell.o qp.o mem.o srq.o mr.o ah.o mad.o gsi.o ib_virt.o +mlx5_ib-y := main.o cq.o doorbell.o qp.o mem.o srq.o mr.o ah.o mad.o gsi.o ib_virt.o cmd.o mlx5_ib-$(CONFIG_INFINIBAND_ON_DEMAND_PAGING) += odp.o
drivers/infiniband/hw/mlx5/cmd.c new file +48 -0
48 lines not on this page · raw message
drivers/infiniband/hw/mlx5/cmd.h new file +40 -0
@@ -0,0 +1,40 @@ +/* +* Copyright (c) 2017, Mellanox Technologies. All rights reserved. +* +* This software is available to you under a choice of one of two +* licenses. You may choose to be licensed under the terms of the GNU +* General Public License (GPL) Version 2, available from the file +* COPYING in the main directory of this source tree, or the +* OpenIB.org BSD license below: +* +* Redistribution and use in source and binary forms, with or +* without modification, are permitted provided that the following +* conditions are met: +* +* - Redistributions of source code must retain the above +* copyright notice, this list of conditions and the following +* disclaimer. +* +* - Redistributions in binary form must reproduce the above +* copyright notice, this list of conditions and the following +* disclaimer in the documentation and/or other materials +* provided with the distribution. +* +* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +* NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS +* BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN +* ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +* CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +* SOFTWARE. +*/ + +#ifndef MLX5_IB_CMD_H +#define MLX5_IB_CMD_H + +#include <linux/kernel.h> +#include <linux/mlx5/driver.h> + +int mlx5_cmd_null_mkey (struct mlx5_core_dev *dev,u32 *null_mkey); +#endif /* MLX5_IB_CMD_H */
Signature · 6 lines
2.10.2 -- To unsubscribe from this list: send the line "unsubscribe linux-rdma" in the body of a message to [email protected] More majordomo info at http://vger.kernel.org/majordomo-info.html
PATCH 5/6 IB/mlx5: Expose MR cache for mlx5_ib
In reply to a message not in the archiveFrom: Artemy Kovalyov <artemyko-VPRAkNaXOzVWk0Htik3J/[email protected]>
Allow other parts of mlx5_ib to use MR cache mechanism.
* Add new functions mlx5_mr_cache_alloc and mlx5_mr_cache_free
* Traditional MTT MKey buckets are limited by MAX_UMR_CACHE_ENTRY Additinal buckets may be added above.
--- drivers/infiniband/hw/mlx5/mlx5_ib.h | 9 +++- drivers/infiniband/hw/mlx5/mr.c | 99 ++++++++++++++++++++++++++---------- include/linux/mlx5/driver.h | 3 +- 3 files changed, 82 insertions(+), 29 deletions(-)
drivers/infiniband/hw/mlx5/mlx5_ib.h +8 -1
@@ -535,6 +535,10 @@ struct mlx5_cache_ent {struct dentry *dir;char name[4 ];u32 order; +u32 xlt; +u32 access_mode; +u32 page; +u32 size;u32 cur;u32 miss;
@@ -549,6 +553,7 @@ struct mlx5_cache_ent {struct work_struct work;struct delayed_work dwork;int pending; +struct completion compl; };struct mlx5_mr_cache {
@@ -824,7 +829,9 @@ void mlx5_ib_copy_pas(u64 *old, u64 *new, int step, int num);int mlx5_ib_get_cqe_size (struct mlx5_ib_dev *dev,struct ib_cq *ibcq);int mlx5_mr_cache_init (struct mlx5_ib_dev *dev);int mlx5_mr_cache_cleanup (struct mlx5_ib_dev *dev); -int mlx5_mr_ib_cont_pages (struct ib_umem *umem,u64 addr,int *count,int *shift); + +struct mlx5_ib_mr *mlx5_mr_cache_alloc (struct mlx5_ib_dev *dev,int entry); +void mlx5_mr_cache_free (struct mlx5_ib_dev *dev,struct mlx5_ib_mr *mr);int mlx5_ib_check_mr_status (struct ib_mr *ibmr,u32 check_mask,struct ib_mr_status *mr_status); struct ib_wq *mlx5_ib_create_wq(struct ib_pd *pd,
drivers/infiniband/hw/mlx5/mr.c +72 -27
198 lines not on this page · raw message
include/linux/mlx5/driver.h +2 -1
@@ -1052,7 +1052,8 @@ enum { };enum { -MAX_MR_CACHE_ENTRIES =21 , +MAX_UMR_CACHE_ENTRY =20 , +MAX_MR_CACHE_ENTRIES };enum {
Signature · 6 lines
2.10.2 -- To unsubscribe from this list: send the line "unsubscribe linux-rdma" in the body of a message to [email protected] More majordomo info at http://vger.kernel.org/majordomo-info.html
PATCH 6/6 IB/mlx5: Add implicit MR support
In reply to a message not in the archiveFrom: Artemy Kovalyov <artemyko-VPRAkNaXOzVWk0Htik3J/[email protected]>
Add implicit MR, covering entire user address space. The MR is implemented as an indirect KSM MR consisting of 1GB direct MRs.
Pages and direct MRs are added/removed to MR by ODP.
--- drivers/infiniband/hw/mlx5/main.c | 2 + drivers/infiniband/hw/mlx5/mlx5_ib.h | 20 +- drivers/infiniband/hw/mlx5/mr.c | 33 ++- drivers/infiniband/hw/mlx5/odp.c | 505 ++++++++++++++++++++++++++++++++--- include/linux/mlx5/driver.h | 2 + 5 files changed, 513 insertions(+), 49 deletions(-)
drivers/infiniband/hw/mlx5/main.c +2 -0
@@ -3424,6 +3424,8 @@ static int __init mlx5_ib_init(void)if (deprecated_prof_sel !=2 )pr_warn ("prof_sel is deprecated for mlx5_ib, set it for mlx5_core\n" ); +mlx5_ib_odp_init (); + err =mlx5_register_interface (&mlx5_ib_interface);return err;
drivers/infiniband/hw/mlx5/mlx5_ib.h +18 -2
@@ -202,6 +202,7 @@ struct mlx5_ib_flow_db {#define MLX5_IB_UPD_XLT_ADDR BIT(3)#define MLX5_IB_UPD_XLT_PD BIT(4)#define MLX5_IB_UPD_XLT_ACCESS BIT(5) +#define MLX5_IB_UPD_XLT_INDIRECT BIT(6)/* Private QP creation flags to be passed in ib_qp_init_attr.create_flags. *
@@ -497,6 +498,10 @@ struct mlx5_ib_mr {int live;void *descs_alloc;int access_flags;/* Needed for rereg MR */ + +struct mlx5_ib_mr *parent; +atomic_t num_leaf_free; +wait_queue_head_t q_leaf_free; };struct mlx5_ib_mw {
@@ -624,6 +629,7 @@ struct mlx5_ib_dev {* being used by a page fault handler. */ struct srcu_struct mr_srcu; +u32 null_mkey;#endif struct mlx5_ib_flow_db flow_db;/* protect resources needed as part of reset flow */
@@ -776,6 +782,9 @@ struct ib_mw *mlx5_ib_alloc_mw(struct ib_pd *pd, enum ib_mw_type type,int mlx5_ib_dealloc_mw (struct ib_mw *mw);int mlx5_ib_update_xlt (struct mlx5_ib_mr *mr,u64 idx,int npages,int page_shift,int flags); +struct mlx5_ib_mr *mlx5_ib_alloc_implicit_mr (struct mlx5_ib_pd *pd, +int access_flags); +void mlx5_ib_free_implicit_mr (struct mlx5_ib_mr *mr);int mlx5_ib_rereg_user_mr (struct ib_mr *ib_mr,int flags,u64 start,u64 length,u64 virt_addr,int access_flags,struct ib_pd *pd,struct ib_udata *udata);
@@ -855,6 +864,9 @@ int __init mlx5_ib_odp_init(void);void mlx5_ib_odp_cleanup (void );void mlx5_ib_invalidate_range (struct ib_umem *umem,unsigned long start,unsigned long end); +void mlx5_odp_init_mr_cache_entry (struct mlx5_cache_ent *ent); +void mlx5_odp_populate_klm (struct mlx5_klm *pklm,size_t offset, +size_t nentries,struct mlx5_ib_mr *mr,int flags);#else /* CONFIG_INFINIBAND_ON_DEMAND_PAGING */ static inline void mlx5_ib_internal_fill_odp_caps (struct mlx5_ib_dev *dev) {
@@ -862,9 +874,13 @@ static inline void mlx5_ib_internal_fill_odp_caps(struct mlx5_ib_dev *dev) }static inline int mlx5_ib_odp_init_one (struct mlx5_ib_dev *ibdev) {return 0 ; } -static inline void mlx5_ib_odp_remove_one (struct mlx5_ib_dev *ibdev) {} +static inline void mlx5_ib_odp_remove_one (struct mlx5_ib_dev *ibdev) {}static inline int mlx5_ib_odp_init (void ) {return 0 ; } -static inline void mlx5_ib_odp_cleanup (void ) {} +static inline void mlx5_ib_odp_cleanup (void ) {} +static inline void mlx5_odp_init_mr_cache_entry (struct mlx5_cache_ent *ent) {} +static inline void mlx5_odp_populate_klm (struct mlx5_klm *pklm,size_t offset, +size_t nentries,struct mlx5_ib_mr *mr, +int flags) {}#endif /* CONFIG_INFINIBAND_ON_DEMAND_PAGING */
drivers/infiniband/hw/mlx5/mr.c +28 -5
@@ -469,7 +469,7 @@ struct mlx5_ib_mr *mlx5_mr_cache_alloc(struct mlx5_ib_dev *dev, int entry)spin_unlock_irq (&ent->lock); err =add_keys (dev, entry,1 ); -if (err) +if (err && err != -EAGAIN )return ERR_PTR (err);wait_for_completion (&ent->compl);
@@ -669,8 +669,10 @@ int mlx5_mr_cache_init(struct mlx5_ib_dev *dev)INIT_DELAYED_WORK (&ent->dwork, delayed_cache_work_func);queue_work (cache->wq, &ent->work); -if (i >MAX_UMR_CACHE_ENTRY ) +if (i >MAX_UMR_CACHE_ENTRY ) { +mlx5_odp_init_mr_cache_entry (ent);continue ; + }if (!use_umr (dev, ent->order))continue ;
@@ -935,6 +937,10 @@ static inline int populate_xlt(struct mlx5_ib_mr *mr, int idx, int npages, {struct mlx5_ib_dev *dev = mr->dev;struct ib_umem *umem = mr->umem; +if (flags &MLX5_IB_UPD_XLT_INDIRECT ) { +mlx5_odp_populate_klm (xlt, idx, npages, mr, flags); +return npages; + } npages =min_t (size_t, npages,ib_umem_num_pages (umem) - idx);
@@ -968,7 +974,9 @@ int mlx5_ib_update_xlt(struct mlx5_ib_mr *mr, u64 idx, int npages,struct mlx5_umr_wr wr;struct ib_sge sg;int err =0 ; -int desc_size =sizeof (struct mlx5_mtt ); +int desc_size = (flags &MLX5_IB_UPD_XLT_INDIRECT ) + ?sizeof (struct mlx5_klm ) + :sizeof (struct mlx5_mtt );const int page_align =MLX5_UMR_MTT_ALIGNMENT / desc_size;const int page_mask = page_align -1 ;size_t pages_mapped =0 ;
@@ -1186,6 +1194,18 @@ struct ib_mr *mlx5_ib_reg_user_mr(struct ib_pd *pd, u64 start, u64 length,mlx5_ib_dbg (dev,"start 0x%llx, virt_addr 0x%llx, length 0x%llx, access_flags 0x%x\n" , start, virt_addr, length, access_flags); + +#ifdef CONFIG_INFINIBAND_ON_DEMAND_PAGING +if (!start && length ==U64_MAX ) { +if (!(access_flags &IB_ACCESS_ON_DEMAND ) || + !(dev->odp_caps.general_caps &IB_ODP_SUPPORT_IMPLICIT )) +return ERR_PTR (-EINVAL ); + + mr =mlx5_ib_alloc_implicit_mr (to_mpd (pd), access_flags); +return &mr->ibmr; + } +#endif + err =mr_umem_get (pd, start, length, access_flags, &umem, &npages, &page_shift, &ncont, &order);
@@ -1471,8 +1491,11 @@ int mlx5_ib_dereg_mr(struct ib_mr *ibmr)/* Wait for all running page-fault handlers to finish. */ synchronize_srcu (&dev->mr_srcu);/* Destroy all page mappings */ -mlx5_ib_invalidate_range (umem,ib_umem_start (umem), -ib_umem_end (umem)); +if (umem->odp_data->page_list) +mlx5_ib_invalidate_range (umem,ib_umem_start (umem), +ib_umem_end (umem)); +else +mlx5_ib_free_implicit_mr (mr);/* * We kill the umem before the MR for ODP, * so that there will not be any invalidations in
drivers/infiniband/hw/mlx5/odp.c +463 -42
647 lines not on this page · raw message
include/linux/mlx5/driver.h +2 -0
@@ -1053,6 +1053,8 @@ enum {enum {MAX_UMR_CACHE_ENTRY =20 , +MLX5_IMR_MTT_CACHE_ENTRY , +MLX5_IMR_KSM_CACHE_ENTRY ,MAX_MR_CACHE_ENTRIES };
Signature · 6 lines
2.10.2 -- To unsubscribe from this list: send the line "unsubscribe linux-rdma" in the body of a message to [email protected] More majordomo info at http://vger.kernel.org/majordomo-info.html
Quoted 15 lines · Leon Romanovsky
Hi Doug,
This patchset comes from Artemy Kovalyov who proposed to expand current ODP feature to register memory with simplified and enhanced semantics.
In existing ODP implementation applications still register memory buffers for communication, though registered memory regions need not have valid mappings at registration time.
This patchset adds implicit ODP sematics, where applications are provided
with a special memory key that represents their complete address space.
Quoted 7 lines
Thus all IO accesses referencing this key (subject to the access rights
associated with the key) won't need register any virtual address range.Thanks,
Artemy, Ilya and Leon
Thanks, series applied.
Signature · 4 lines
Doug Ledford <[email protected]> GPG KeyID: B826A3330E572FDD Key fingerprint = AE6B 1BDA 122B 23B4 265B 1274 B826 A333 0E57 2FDD