Introducing Multi-Path DMA Support for mlx5 RDMA Driver
Subsystems (9)
cover Introducing Multi-Path DMA Support for mlx5 RDMA Driver
From: Leon Romanovsky <[email protected]>
From Yishai,
Overview
--------
This patch series aims to enable multi-path DMA support, allowing an mlx5 RDMA device to issue DMA commands through multiple paths. This feature is critical for improving performance and reaching line rate in certain environments where issuing PCI transactions over one path may be significantly faster than over another. These differences can arise from various PCI generations in the system or the specific system topology.
To achieve this functionality, we introduced a data direct DMA device that can serve the RDMA device by issuing DMA transactions on its behalf.
The main key features and changes are described below.
Multi-Path Discovery
--------------------
API Implementation:
* Introduced an API to discover multiple paths for a given mlx5 RDMA device.
IOCTL Command:
* Added a new IOCTL command, MLX5_IB_METHOD_GET_DATA_DIRECT_SYSFS_PATH, to the DEVICE object. When an affiliated Data-Direct/DMA device is present, its sysfs path is returned.
Feature Activation by mlx5 RDMA Application
-------------------------------------------
UVERBS Extension:
* Extended UVERBS_METHOD_REG_DMABUF_MR over UVERBS_OBJECT_MR to include mlx5 extended flags.
Access Flag:
* Introduced the MLX5_IB_UAPI_REG_DMABUF_ACCESS_DATA_DIRECT flag, allowing applications to request the use of the affiliated DMA device for DMABUF registration.
Data-Direct/DMA Device
----------------------
New Driver:
* Introduced a new driver to manage the new DMA PF device ID (0x2100). Its registration/un-registration is handled as part of the mlx5_ib init/exit flows, with mlx5 IB devices as its clients.
Functionality:
* The driver does not interface directly with the firmware (no command interface, no caps, etc.) but works over PCI to activate its DMA functionality. It serves as the DMA device for efficiently accessing other PCI devices (e.g., GPU PF) and reads its VUID over PCI to handle NICs registrations with the same VUID.
mlx5 IB RDMA Device
---------------------------
VUID Query:
* Reads its affiliated DMA PF VUID via the QUERY_VUID command with the data_direct bit set.
Driver Registration:
* Registers with the DMA PF driver to be notified upon bind/unbind.
Application Request Handling:
* Uses the DMA PF device upon application request as described above.
DMABUF over Umem
----------------
Introduced an option to obtain a DMABUF UMEM using a different DMA device instead of the IB device, allowing the device to register over IOMMU with the expected DMA device for a given buffer registration.
Further details are provided in the commit logs of the patches in this series.
Thanks
Yishai Hadas (8):
net/mlx5: Add IFC related stuff for data direct RDMA/mlx5: Introduce the 'data direct' driver
RDMA/mlx5: Add the initialization flow to utilize the 'data direct'
device
RDMA/umem: Add support for creating pinned DMABUF umem with a given
dma device
RDMA/umem: Introduce an option to revoke DMABUF umem
RDMA: Pass uverbs_attr_bundle as part of '.reg_user_mr_dmabuf' API RDMA/mlx5: Add support for DMABUF MR registrations with Data-direct RDMA/mlx5: Introduce GET_DATA_DIRECT_SYSFS_PATH ioctl
drivers/infiniband/core/umem_dmabuf.c | 66 +++- drivers/infiniband/core/uverbs_std_types_mr.c | 2 +- drivers/infiniband/hw/bnxt_re/ib_verbs.c | 3 +- drivers/infiniband/hw/bnxt_re/ib_verbs.h | 2 +- drivers/infiniband/hw/efa/efa.h | 2 +- drivers/infiniband/hw/efa/efa_verbs.c | 4 +- drivers/infiniband/hw/irdma/verbs.c | 2 +- drivers/infiniband/hw/mlx5/Makefile | 1 + drivers/infiniband/hw/mlx5/cmd.c | 21 ++ drivers/infiniband/hw/mlx5/cmd.h | 2 + drivers/infiniband/hw/mlx5/data_direct.c | 227 +++++++++++++ drivers/infiniband/hw/mlx5/data_direct.h | 23 ++ drivers/infiniband/hw/mlx5/main.c | 125 +++++++ drivers/infiniband/hw/mlx5/mlx5_ib.h | 22 +- drivers/infiniband/hw/mlx5/mr.c | 304 +++++++++++++++--- drivers/infiniband/hw/mlx5/odp.c | 5 +- drivers/infiniband/hw/mlx5/std_types.c | 55 +++- drivers/infiniband/hw/mlx5/umr.c | 93 ++++-- drivers/infiniband/hw/mlx5/umr.h | 1 + include/linux/mlx5/mlx5_ifc.h | 51 ++- include/rdma/ib_umem.h | 18 ++ include/rdma/ib_verbs.h | 2 +- include/uapi/rdma/mlx5_user_ioctl_cmds.h | 9 + include/uapi/rdma/mlx5_user_ioctl_verbs.h | 4 + 24 files changed, 944 insertions(+), 100 deletions(-) create mode 100644 drivers/infiniband/hw/mlx5/data_direct.c create mode 100644 drivers/infiniband/hw/mlx5/data_direct.h
Signature · 1 line
2.45.2
PATCH 1/8 net/mlx5: Add IFC related stuff for data direct
From: Yishai Hadas <[email protected]>
Add IFC related stuff for data direct.
--- include/linux/mlx5/mlx5_ifc.h | 51 +++++++++++++++++++++++++++++++---- 1 file changed, 46 insertions(+), 5 deletions(-)
include/linux/mlx5/mlx5_ifc.h +46 -5
@@ -313,6 +313,7 @@ enum {MLX5_CMD_OP_MODIFY_VHCA_STATE =0xb0e ,MLX5_CMD_OP_SYNC_CRYPTO =0xb12 ,MLX5_CMD_OP_ALLOW_OTHER_VHCA_ACCESS =0xb16 , +MLX5_CMD_OPCODE_QUERY_VUID =0xb22 , MLX5_CMD_OP_MAX };
@@ -1885,7 +1886,8 @@ struct mlx5_ifc_cmd_hca_cap_bits {u8 reserved_at_5a0[0x10 ];u8 enhanced_cqe_compression[0x1 ]; -u8 reserved_at_5b1[0x2 ]; +u8 reserved_at_5b1[0x1 ]; +u8 crossing_vhca_mkey[0x1 ];u8 log_max_dek[0x5 ];u8 reserved_at_5b8[0x4 ];u8 mini_cqe_resp_stride_index[0x1 ];
@@ -1954,7 +1956,9 @@ struct mlx5_ifc_cmd_hca_cap_bits {u8 dynamic_msix_table_size[0xc ];u8 reserved_at_740[0xc ];u8 min_dynamic_vf_msix_table_size[0x4 ]; -u8 reserved_at_750[0x4 ]; +u8 reserved_at_750[0x2 ]; +u8 data_direct[0x1 ]; +u8 reserved_at_753[0x1 ];u8 max_dynamic_vf_msix_table_size[0xc ];u8 reserved_at_760[0x3 ];
@@ -1982,7 +1986,9 @@ struct mlx5_ifc_cmd_hca_cap_2_bits {u8 reserved_at_0[0x80 ];u8 migratable[0x1 ]; -u8 reserved_at_81[0x1f ]; +u8 reserved_at_81[0x11 ]; +u8 query_vuid[0x1 ]; +u8 reserved_at_93[0xd ];u8 max_reformat_insert_size[0x8 ];u8 max_reformat_insert_offset[0x8 ];
@@ -4154,6 +4160,7 @@ enum {MLX5_MKC_ACCESS_MODE_KSM =0x3 ,MLX5_MKC_ACCESS_MODE_SW_ICM =0x4 ,MLX5_MKC_ACCESS_MODE_MEMIC =0x5 , + MLX5_MKC_ACCESS_MODE_CROSSING = 0x6, }; struct mlx5_ifc_mkc_bits {
@@ -4196,7 +4203,10 @@ struct mlx5_ifc_mkc_bits {u8 bsf_octword_size[0x20 ]; -u8 reserved_at_120[0x80 ]; +u8 reserved_at_120[0x60 ]; + +u8 crossing_target_vhca_id[0x10 ]; +u8 reserved_at_190[0x10 ];u8 translations_octword_size[0x20 ];
@@ -5124,6 +5134,36 @@ struct mlx5_ifc_query_vport_state_out_bits {u8 state[0x4 ]; }; +struct mlx5_ifc_array1024_auto_bits { +u8 array1024_auto[32 ][0x20 ]; +}; + +struct mlx5_ifc_query_vuid_in_bits { +u8 opcode[0x10 ]; +u8 uid[0x10 ]; + +u8 reserved_at_20[0x40 ]; + +u8 query_vfs_vuid[0x1 ]; +u8 data_direct[0x1 ]; +u8 reserved_at_62[0xe ]; +u8 vhca_id[0x10 ]; +}; + +struct mlx5_ifc_query_vuid_out_bits { +u8 status[0x8 ]; +u8 reserved_at_8[0x18 ]; + +u8 syndrome[0x20 ]; + +u8 reserved_at_40[0x1a0 ]; + +u8 reserved_at_1e0[0x10 ]; +u8 num_of_entries[0x10 ]; + +struct mlx5_ifc_array1024_auto_bits vuid[]; +}; +enum {MLX5_VPORT_STATE_OP_MOD_VNIC_VPORT =0x0 ,MLX5_VPORT_STATE_OP_MOD_ESW_VPORT =0x1 ,
@@ -8989,7 +9029,8 @@ struct mlx5_ifc_create_mkey_in_bits {u8 pg_access[0x1 ];u8 mkey_umem_valid[0x1 ]; -u8 reserved_at_62[0x1e ]; +u8 data_direct[0x1 ]; +u8 reserved_at_63[0x1d ];struct mlx5_ifc_mkc_bits memory_key_mkey_entry;
Signature · 1 line
2.45.2
PATCH 2/8 RDMA/mlx5: Introduce the 'data direct' driver
In reply to Leon RomanovskyFrom: Yishai Hadas <[email protected]>
Introduce the 'data direct' driver for a ConnectX-8 Data Direct device.
The 'data direct' driver functions as the affiliated DMA device for one or more capable mlx5_ib devices. This DMA device, as the name suggests, is used exclusively for DMA operations. It can be considered a DMA engine managed by a PF/VF, lacking network capabilities and having minimal overall capabilities.
Consequently, the DMA NIC PF will not be exposed to or directly used by software applications. The driver will not have any direct interface or interaction with the firmware (no command interface, no capabilities, etc.). It will operate solely over PCI to enable its DMA functionality.
Registration and un-registration of the driver are handled as part of the mlx5_ib initialization and exit processes, as the mlx5_ib devices will effectively be its clients.
The driver will serve as the DMA device for accessing another PCI device to achieve optimal performance (both on the same NUMA node, P2P access, etc.).
Upon probing, it will read its VUID over PCI to handle mlx5_ib device registrations with the same VUID.
Upon removal, it will notify its clients to allow them to clean up the resources that were mmaped with its DMA device.
--- drivers/infiniband/hw/mlx5/Makefile | 1 + drivers/infiniband/hw/mlx5/data_direct.c | 227 +++++++++++++++++++++++ drivers/infiniband/hw/mlx5/data_direct.h | 23 +++ drivers/infiniband/hw/mlx5/main.c | 24 +++ drivers/infiniband/hw/mlx5/mlx5_ib.h | 6 + 5 files changed, 281 insertions(+) create mode 100644 drivers/infiniband/hw/mlx5/data_direct.c create mode 100644 drivers/infiniband/hw/mlx5/data_direct.h
drivers/infiniband/hw/mlx5/Makefile +1 -0
@@ -6,6 +6,7 @@ mlx5_ib-y := ah.o \ cong.o \ counters.o \ cq.o \ + data_direct.o \ dm.o \ doorbell.o \ gsi.o \
drivers/infiniband/hw/mlx5/data_direct.c new file +227 -0
227 lines not on this page · raw message
drivers/infiniband/hw/mlx5/data_direct.h new file +23 -0
@@ -0,0 +1,23 @@ +/* SPDX-License-Identifier: GPL-2.0 OR Linux-OpenIB */ +/* +* Copyright (c) 2024, NVIDIA CORPORATION & AFFILIATES. All rights reserved +*/ + +#ifndef _MLX5_IB_DATA_DIRECT_H +#define _MLX5_IB_DATA_DIRECT_H + +struct mlx5_ib_dev ; + +struct mlx5_data_direct_dev { +struct device *device; +struct pci_dev *pdev; +char *vuid; +struct list_head list; +}; + +int mlx5_data_direct_ib_reg (struct mlx5_ib_dev *ibdev,char *vuid); +void mlx5_data_direct_ib_unreg (struct mlx5_ib_dev *ibdev); +int mlx5_data_direct_driver_register (void ); +void mlx5_data_direct_driver_unregister (void ); + +#endif
drivers/infiniband/hw/mlx5/main.c +24 -0
@@ -48,6 +48,7 @@#include <rdma/mlx5_user_ioctl_verbs.h> #include <rdma/mlx5_user_ioctl_cmds.h> #include "macsec.h" +#include "data_direct.h" #define UVERBS_MODULE_NAME mlx5_ib#include <rdma/uverbs_named_ioctl.h>
@@ -3866,6 +3867,7 @@ static int mlx5_ib_stage_init_init(struct mlx5_ib_dev *dev) dev->ib_dev.num_comp_vectors =mlx5_comp_vectors_max (mdev);mutex_init (&dev->cap_mask_mutex); +mutex_init (&dev->data_direct_lock);INIT_LIST_HEAD (&dev->qp_list);spin_lock_init (&dev->reset_flow_resource_lock);xa_init (&dev->odp_mkeys);
@@ -4293,6 +4295,21 @@ static void mlx5_ib_stage_dev_notifier_cleanup(struct mlx5_ib_dev *dev)mlx5_notifier_unregister (dev->mdev, &dev->mdev_events); } +void mlx5_ib_data_direct_bind (struct mlx5_ib_dev *ibdev, +struct mlx5_data_direct_dev *dev) +{ +mutex_lock (&ibdev->data_direct_lock); + ibdev->data_direct_dev = dev; +mutex_unlock (&ibdev->data_direct_lock); +} + +void mlx5_ib_data_direct_unbind (struct mlx5_ib_dev *ibdev) +{ +mutex_lock (&ibdev->data_direct_lock); + ibdev->data_direct_dev =NULL ; +mutex_unlock (&ibdev->data_direct_lock); +} +void __mlx5_ib_remove (struct mlx5_ib_dev *dev,const struct mlx5_ib_profile *profile,int stage)
@@ -4715,17 +4732,23 @@ static int __init mlx5_ib_init(void) ret =mlx5r_rep_init ();if (ret) goto rep_err; + ret =mlx5_data_direct_driver_register (); +if (ret) + goto dd_err; ret =auxiliary_driver_register (&mlx5r_mp_driver);if (ret) goto mp_err; ret =auxiliary_driver_register (&mlx5r_driver);if (ret) goto drv_err; +return 0 ; drv_err:auxiliary_driver_unregister (&mlx5r_mp_driver); mp_err: +mlx5_data_direct_driver_unregister (); +dd_err:mlx5r_rep_cleanup (); rep_err:mlx5_ib_qp_event_cleanup ();
@@ -4737,6 +4760,7 @@ static int __init mlx5_ib_init(void) static void __exit mlx5_ib_cleanup(void) { +mlx5_data_direct_driver_unregister ();auxiliary_driver_unregister (&mlx5r_driver);auxiliary_driver_unregister (&mlx5r_mp_driver);mlx5r_rep_cleanup ();
drivers/infiniband/hw/mlx5/mlx5_ib.h +6 -0
@@ -1131,6 +1131,9 @@ struct mlx5_macsec {struct mlx5_ib_dev {struct ib_device ib_dev;struct mlx5_core_dev *mdev; +struct mlx5_data_direct_dev *data_direct_dev; +/* protect accessing data_direct_dev */ +struct mutex data_direct_lock;struct notifier_block mdev_events;int num_ports;/* serialize update of capability mask
@@ -1425,6 +1428,9 @@ int mlx5_ib_destroy_rwq_ind_table(struct ib_rwq_ind_table *wq_ind_table);struct ib_mr *mlx5_ib_reg_dm_mr (struct ib_pd *pd,struct ib_dm *dm,struct ib_dm_mr_attr *attr,struct uverbs_attr_bundle *attrs); +void mlx5_ib_data_direct_bind (struct mlx5_ib_dev *ibdev, +struct mlx5_data_direct_dev *dev); +void mlx5_ib_data_direct_unbind (struct mlx5_ib_dev *ibdev);#ifdef CONFIG_INFINIBAND_ON_DEMAND_PAGING int mlx5_ib_odp_init_one (struct mlx5_ib_dev *ibdev);
Signature · 1 line
2.45.2
PATCH 3/8 RDMA/mlx5: Add the initialization flow to utilize the 'data direct' device
In reply to Leon RomanovskyFrom: Yishai Hadas <[email protected]>
Add the NET device initialization flow to utilize the 'data direct' device.
When a NET mlx5_ib device is capable of 'data direct', the following sequence of actions will occur:
- Find its affiliated 'data direct' VUID via a firmware command.
- Create its own private PD and 'data direct' mkey.
- Register to be notified when its 'data direct' driver is probed or removed.
The DMA device of the affiliated 'data direct' device, including the private PD and the 'data direct' mkey, will be used later during MR registrations that request the data direct functionality.
--- drivers/infiniband/hw/mlx5/cmd.c | 21 +++++++ drivers/infiniband/hw/mlx5/cmd.h | 2 + drivers/infiniband/hw/mlx5/main.c | 90 ++++++++++++++++++++++++++++ drivers/infiniband/hw/mlx5/mlx5_ib.h | 6 ++ 4 files changed, 119 insertions(+)
drivers/infiniband/hw/mlx5/cmd.c +21 -0
@@ -245,3 +245,24 @@ int mlx5_cmd_uar_dealloc(struct mlx5_core_dev *dev, u32 uarn, u16 uid)MLX5_SET (dealloc_uar_in, in, uid, uid);return mlx5_cmd_exec_in (dev, dealloc_uar, in); } + +int mlx5_cmd_query_vuid (struct mlx5_core_dev *dev,bool data_direct, +char *out_vuid) +{ +u8 out[MLX5_ST_SZ_BYTES (query_vuid_out) + +MLX5_ST_SZ_BYTES (array1024_auto)] = {}; +u8 in[MLX5_ST_SZ_BYTES (query_vuid_in)] = {}; +char *vuid; +int err; + +MLX5_SET (query_vuid_in, in, opcode,MLX5_CMD_OPCODE_QUERY_VUID ); +MLX5_SET (query_vuid_in, in, vhca_id,MLX5_CAP_GEN (dev, vhca_id)); +MLX5_SET (query_vuid_in, in, data_direct, data_direct); + err =mlx5_cmd_exec (dev, in,sizeof (in), out,sizeof (out)); +if (err) +return err; + + vuid =MLX5_ADDR_OF (query_vuid_out, out, vuid); +memcpy (out_vuid, vuid,MLX5_ST_SZ_BYTES (array1024_auto)); +return 0 ; +}
drivers/infiniband/hw/mlx5/cmd.h +2 -0
@@ -58,4 +58,6 @@ int mlx5_cmd_mad_ifc(struct mlx5_ib_dev *dev, const void *inb, void *outb, u16 opmod, u8 port);int mlx5_cmd_uar_alloc (struct mlx5_core_dev *dev,u32 *uarn,u16 uid);int mlx5_cmd_uar_dealloc (struct mlx5_core_dev *dev,u32 uarn,u16 uid); +int mlx5_cmd_query_vuid (struct mlx5_core_dev *dev,bool data_direct, +char *out_vuid);#endif /* MLX5_IB_CMD_H */
drivers/infiniband/hw/mlx5/main.c +90 -0
114 lines not on this page · raw message
drivers/infiniband/hw/mlx5/mlx5_ib.h +6 -0
@@ -835,6 +835,11 @@ struct mlx5_ib_port_resources {struct work_struct pkey_change_work; }; +struct mlx5_data_direct_resources { +u32 pdn; +u32 mkey; +}; +struct mlx5_ib_resources {struct ib_cq *c0;struct mutex cq_lock;
@@ -1188,6 +1193,7 @@ struct mlx5_ib_dev {u16 pkey_table_len;u8 lag_ports;struct mlx5_special_mkeys mkeys; +struct mlx5_data_direct_resources ddr;#ifdef CONFIG_MLX5_MACSEC struct mlx5_macsec macsec;
Signature · 1 line
2.45.2
PATCH 4/8 RDMA/umem: Add support for creating pinned DMABUF umem with a given dma device
In reply to Leon RomanovskyFrom: Yishai Hadas <[email protected]>
Add support for creating pinned DMABUF umem with a specified DMA device instead of the DMA device of the given IB device.
This API will be utilized in the upcoming patches of the series when multiple path DMAs are implemented.
--- drivers/infiniband/core/umem_dmabuf.c | 45 ++++++++++++++++++++------- include/rdma/ib_umem.h | 15 +++++++++ 2 files changed, 49 insertions(+), 11 deletions(-)
drivers/infiniband/core/umem_dmabuf.c +34 -11
@@ -110,10 +110,12 @@ void ib_umem_dmabuf_unmap_pages(struct ib_umem_dmabuf *umem_dmabuf) }EXPORT_SYMBOL (ib_umem_dmabuf_unmap_pages); -struct ib_umem_dmabuf *ib_umem_dmabuf_get (struct ib_device *device, -unsigned long offset,size_t size, -int fd,int access, -const struct dma_buf_attach_ops *ops) +static struct ib_umem_dmabuf * +ib_umem_dmabuf_get_with_dma_device (struct ib_device *device, +struct device *dma_device, +unsigned long offset,size_t size, +int fd,int access, +const struct dma_buf_attach_ops *ops) {struct dma_buf *dmabuf;struct ib_umem_dmabuf *umem_dmabuf;
@@ -152,7 +154,7 @@ struct ib_umem_dmabuf *ib_umem_dmabuf_get(struct ib_device *device, umem_dmabuf->attach =dma_buf_dynamic_attach ( dmabuf, - device->dma_device, + dma_device, ops, umem_dmabuf);if (IS_ERR (umem_dmabuf->attach)) {
@@ -168,6 +170,15 @@ struct ib_umem_dmabuf *ib_umem_dmabuf_get(struct ib_device *device,dma_buf_put (dmabuf);return ret; } + +struct ib_umem_dmabuf *ib_umem_dmabuf_get (struct ib_device *device, +unsigned long offset,size_t size, +int fd,int access, +const struct dma_buf_attach_ops *ops) +{ +return ib_umem_dmabuf_get_with_dma_device (device, device->dma_device, + offset, size, fd, access, ops); +}EXPORT_SYMBOL (ib_umem_dmabuf_get); static void
@@ -184,16 +195,18 @@ static struct dma_buf_attach_ops ib_umem_dmabuf_attach_pinned_ops = { .move_notify = ib_umem_dmabuf_unsupported_move_notify, }; -struct ib_umem_dmabuf *ib_umem_dmabuf_get_pinned (struct ib_device *device, -unsigned long offset, -size_t size,int fd, -int access) +struct ib_umem_dmabuf * +ib_umem_dmabuf_get_pinned_with_dma_device (struct ib_device *device, +struct device *dma_device, +unsigned long offset,size_t size, +int fd,int access) {struct ib_umem_dmabuf *umem_dmabuf;int err; - umem_dmabuf =ib_umem_dmabuf_get (device, offset, size, fd, access, - &ib_umem_dmabuf_attach_pinned_ops); + umem_dmabuf =ib_umem_dmabuf_get_with_dma_device (device, dma_device, offset, + size, fd, access, + &ib_umem_dmabuf_attach_pinned_ops);if (IS_ERR (umem_dmabuf))return umem_dmabuf;
@@ -217,6 +230,16 @@ struct ib_umem_dmabuf *ib_umem_dmabuf_get_pinned(struct ib_device *device,ib_umem_release (&umem_dmabuf->umem);return ERR_PTR (err); } +EXPORT_SYMBOL (ib_umem_dmabuf_get_pinned_with_dma_device); + +struct ib_umem_dmabuf *ib_umem_dmabuf_get_pinned (struct ib_device *device, +unsigned long offset, +size_t size,int fd, +int access) +{ +return ib_umem_dmabuf_get_pinned_with_dma_device (device, device->dma_device, + offset, size, fd, access); +}EXPORT_SYMBOL (ib_umem_dmabuf_get_pinned);void ib_umem_dmabuf_release (struct ib_umem_dmabuf *umem_dmabuf)
include/rdma/ib_umem.h +15 -0
@@ -150,6 +150,11 @@ struct ib_umem_dmabuf *ib_umem_dmabuf_get_pinned(struct ib_device *device,unsigned long offset, size_t size, int fd, int access); +struct ib_umem_dmabuf * +ib_umem_dmabuf_get_pinned_with_dma_device (struct ib_device *device, +struct device *dma_device, +unsigned long offset,size_t size, +int fd,int access);int ib_umem_dmabuf_map_pages (struct ib_umem_dmabuf *umem_dmabuf);void ib_umem_dmabuf_unmap_pages (struct ib_umem_dmabuf *umem_dmabuf);void ib_umem_dmabuf_release (struct ib_umem_dmabuf *umem_dmabuf);
@@ -196,6 +201,16 @@ ib_umem_dmabuf_get_pinned(struct ib_device *device, unsigned long offset, {return ERR_PTR (-EOPNOTSUPP ); } + +static inline struct ib_umem_dmabuf * +ib_umem_dmabuf_get_pinned_with_dma_device (struct ib_device *device, +struct device *dma_device, +unsigned long offset,size_t size, +int fd,int access) +{ +return ERR_PTR (-EOPNOTSUPP ); +} +static inline int ib_umem_dmabuf_map_pages (struct ib_umem_dmabuf *umem_dmabuf) {return -EOPNOTSUPP ;
Signature · 1 line
2.45.2
PATCH 5/8 RDMA/umem: Introduce an option to revoke DMABUF umem
In reply to Leon RomanovskyFrom: Yishai Hadas <[email protected]>
Introduce an option to revoke DMABUF umem.
This option will retain the umem allocation while revoking its DMA mapping. Furthermore, any subsequent attempts to map the pages should fail once the umem has been revoked.
This functionality will be utilized in the upcoming patches in the series, where we aim to delay umem deallocation until the mkey deregistration. However, we must unmap its pages immediately.
--- drivers/infiniband/core/umem_dmabuf.c | 21 +++++++++++++++++++-- include/rdma/ib_umem.h | 3 +++ 2 files changed, 22 insertions(+), 2 deletions(-)
drivers/infiniband/core/umem_dmabuf.c +19 -2
@@ -23,6 +23,9 @@ int ib_umem_dmabuf_map_pages(struct ib_umem_dmabuf *umem_dmabuf)dma_resv_assert_held (umem_dmabuf->attach->dmabuf->resv); +if (umem_dmabuf->revoked) +return -EINVAL ; +if (umem_dmabuf->sgt) goto wait_fence;
@@ -242,15 +245,29 @@ struct ib_umem_dmabuf *ib_umem_dmabuf_get_pinned(struct ib_device *device, }EXPORT_SYMBOL (ib_umem_dmabuf_get_pinned); -void ib_umem_dmabuf_release (struct ib_umem_dmabuf *umem_dmabuf) +void ib_umem_dmabuf_revoke (struct ib_umem_dmabuf *umem_dmabuf) {struct dma_buf *dmabuf = umem_dmabuf->attach->dmabuf;dma_resv_lock (dmabuf->resv,NULL ); +if (umem_dmabuf->revoked) + goto end;ib_umem_dmabuf_unmap_pages (umem_dmabuf); -if (umem_dmabuf->pinned) +if (umem_dmabuf->pinned) {dma_buf_unpin (umem_dmabuf->attach); + umem_dmabuf->pinned =0 ; + } + umem_dmabuf->revoked =1 ; +end:dma_resv_unlock (dmabuf->resv); +} +EXPORT_SYMBOL (ib_umem_dmabuf_revoke); + +void ib_umem_dmabuf_release (struct ib_umem_dmabuf *umem_dmabuf) +{ +struct dma_buf *dmabuf = umem_dmabuf->attach->dmabuf; + +ib_umem_dmabuf_revoke (umem_dmabuf);dma_buf_detach (dmabuf, umem_dmabuf->attach);dma_buf_put (dmabuf);
include/rdma/ib_umem.h +3 -0
@@ -38,6 +38,7 @@ struct ib_umem_dmabuf {unsigned long last_sg_trim;void *private; u8 pinned : 1; + u8 revoked : 1; };static inline struct ib_umem_dmabuf *to_ib_umem_dmabuf (struct ib_umem *umem)
@@ -158,6 +159,7 @@ ib_umem_dmabuf_get_pinned_with_dma_device(struct ib_device *device,int ib_umem_dmabuf_map_pages (struct ib_umem_dmabuf *umem_dmabuf);void ib_umem_dmabuf_unmap_pages (struct ib_umem_dmabuf *umem_dmabuf);void ib_umem_dmabuf_release (struct ib_umem_dmabuf *umem_dmabuf); +void ib_umem_dmabuf_revoke (struct ib_umem_dmabuf *umem_dmabuf);#else /* CONFIG_INFINIBAND_USER_MEM */
@@ -217,6 +219,7 @@ static inline int ib_umem_dmabuf_map_pages(struct ib_umem_dmabuf *umem_dmabuf) }static inline void ib_umem_dmabuf_unmap_pages (struct ib_umem_dmabuf *umem_dmabuf) { }static inline void ib_umem_dmabuf_release (struct ib_umem_dmabuf *umem_dmabuf) { } +static inline void ib_umem_dmabuf_revoke (struct ib_umem_dmabuf *umem_dmabuf) {}#endif /* CONFIG_INFINIBAND_USER_MEM */ #endif /* IB_UMEM_H */
Signature · 1 line
2.45.2
PATCH 6/8 RDMA: Pass uverbs_attr_bundle as part of '.reg_user_mr_dmabuf' API
In reply to Leon RomanovskyFrom: Yishai Hadas <[email protected]>
Pass uverbs_attr_bundle as part of '.reg_user_mr_dmabuf' API instead of udata.
This enables passing some new ioctl attributes to the drivers, as will be introduced in the next patches for mlx5 driver.
Change the involved drivers accordingly.
--- drivers/infiniband/core/uverbs_std_types_mr.c | 2 +- drivers/infiniband/hw/bnxt_re/ib_verbs.c | 3 ++- drivers/infiniband/hw/bnxt_re/ib_verbs.h | 2 +- drivers/infiniband/hw/efa/efa.h | 2 +- drivers/infiniband/hw/efa/efa_verbs.c | 4 ++-- drivers/infiniband/hw/irdma/verbs.c | 2 +- drivers/infiniband/hw/mlx5/mlx5_ib.h | 2 +- drivers/infiniband/hw/mlx5/mr.c | 2 +- include/rdma/ib_verbs.h | 2 +- 9 files changed, 11 insertions(+), 10 deletions(-)
drivers/infiniband/core/uverbs_std_types_mr.c +1 -1
@@ -239,7 +239,7 @@ static int UVERBS_HANDLER(UVERBS_METHOD_REG_DMABUF_MR)( mr = pd->device->ops.reg_user_mr_dmabuf (pd, offset, length, iova, fd, access_flags, - &attrs->driver_udata); + attrs);if (IS_ERR (mr))return PTR_ERR (mr);
drivers/infiniband/hw/bnxt_re/ib_verbs.c +2 -1
@@ -4122,7 +4122,8 @@ struct ib_mr *bnxt_re_reg_user_mr(struct ib_pd *ib_pd, u64 start, u64 length,struct ib_mr *bnxt_re_reg_user_mr_dmabuf (struct ib_pd *ib_pd,u64 start,u64 length,u64 virt_addr,int fd, -int mr_access_flags,struct ib_udata *udata) +int mr_access_flags, +struct uverbs_attr_bundle *attrs) { struct bnxt_re_pd *pd = container_of(ib_pd, struct bnxt_re_pd, ib_pd);struct bnxt_re_dev *rdev = pd->rdev;
drivers/infiniband/hw/bnxt_re/ib_verbs.h +1 -1
@@ -242,7 +242,7 @@ struct ib_mr *bnxt_re_reg_user_mr(struct ib_pd *pd, u64 start, u64 length,struct ib_mr *bnxt_re_reg_user_mr_dmabuf (struct ib_pd *ib_pd,u64 start,u64 length,u64 virt_addr,int fd,int mr_access_flags, -struct ib_udata *udata); +struct uverbs_attr_bundle *attrs);int bnxt_re_alloc_ucontext (struct ib_ucontext *ctx,struct ib_udata *udata);void bnxt_re_dealloc_ucontext (struct ib_ucontext *context);int bnxt_re_mmap (struct ib_ucontext *context,struct vm_area_struct *vma);
drivers/infiniband/hw/efa/efa.h +1 -1
@@ -168,7 +168,7 @@ struct ib_mr *efa_reg_mr(struct ib_pd *ibpd, u64 start, u64 length,struct ib_mr *efa_reg_user_mr_dmabuf (struct ib_pd *ibpd,u64 start,u64 length,u64 virt_addr,int fd,int access_flags, -struct ib_udata *udata); +struct uverbs_attr_bundle *attrs);int efa_dereg_mr (struct ib_mr *ibmr,struct ib_udata *udata);int efa_get_port_immutable (struct ib_device *ibdev,u32 port_num,struct ib_port_immutable *immutable);
drivers/infiniband/hw/efa/efa_verbs.c +2 -2
@@ -1684,14 +1684,14 @@ static int efa_register_mr(struct ib_pd *ibpd, struct efa_mr *mr, u64 start,struct ib_mr *efa_reg_user_mr_dmabuf (struct ib_pd *ibpd,u64 start,u64 length,u64 virt_addr,int fd,int access_flags, -struct ib_udata *udata) +struct uverbs_attr_bundle *attrs) {struct efa_dev *dev =to_edev (ibpd->device);struct ib_umem_dmabuf *umem_dmabuf;struct efa_mr *mr;int err; - mr =efa_alloc_mr (ibpd, access_flags, udata); + mr =efa_alloc_mr (ibpd, access_flags, &attrs->driver_udata);if (IS_ERR (mr)) { err =PTR_ERR (mr); goto err_out;
drivers/infiniband/hw/irdma/verbs.c +1 -1
@@ -3085,7 +3085,7 @@ static struct ib_mr *irdma_reg_user_mr(struct ib_pd *pd, u64 start, u64 len,static struct ib_mr *irdma_reg_user_mr_dmabuf (struct ib_pd *pd,u64 start,u64 len,u64 virt,int fd,int access, -struct ib_udata *udata) +struct uverbs_attr_bundle *attrs) {struct irdma_device *iwdev =to_iwdev (pd->device);struct ib_umem_dmabuf *umem_dmabuf;
drivers/infiniband/hw/mlx5/mlx5_ib.h +1 -1
@@ -1354,7 +1354,7 @@ struct ib_mr *mlx5_ib_reg_user_mr(struct ib_pd *pd, u64 start, u64 length,struct ib_mr *mlx5_ib_reg_user_mr_dmabuf (struct ib_pd *pd,u64 start,u64 length,u64 virt_addr,int fd,int access_flags, -struct ib_udata *udata); +struct uverbs_attr_bundle *attrs); int mlx5_ib_advise_mr(struct ib_pd *pd, enum ib_uverbs_advise_mr_advice advice, u32 flags,
drivers/infiniband/hw/mlx5/mr.c +1 -1
@@ -1513,7 +1513,7 @@ static struct dma_buf_attach_ops mlx5_ib_dmabuf_attach_ops = {struct ib_mr *mlx5_ib_reg_user_mr_dmabuf (struct ib_pd *pd,u64 offset,u64 length,u64 virt_addr,int fd,int access_flags, -struct ib_udata *udata) +struct uverbs_attr_bundle *attrs) {struct mlx5_ib_dev *dev =to_mdev (pd->device);struct mlx5_ib_mr *mr =NULL ;
include/rdma/ib_verbs.h +1 -1
@@ -2476,7 +2476,7 @@ struct ib_device_ops {struct ib_mr *(*reg_user_mr_dmabuf)(struct ib_pd *pd,u64 offset,u64 length,u64 virt_addr,int fd,int mr_access_flags, -struct ib_udata *udata); +struct uverbs_attr_bundle *attrs); struct ib_mr *(*rereg_user_mr)(struct ib_mr *mr, int flags, u64 start, u64 length, u64 virt_addr, int mr_access_flags, struct ib_pd *pd,
Signature · 1 line
2.45.2
PATCH 7/8 RDMA/mlx5: Add support for DMABUF MR registrations with Data-direct
In reply to Leon RomanovskyFrom: Yishai Hadas <[email protected]>
Add support for DMABUF MR registrations with Data-direct device.
Upon userspace calling to register a DMABUF MR with the data direct bit set, the below algorithm will be followed.
1) Obtain a pinned DMABUF umem from the IB core using the user input parameters (FD, offset, length) and the DMA PF device. The DMA PF device is needed to allow the IOMMU to enable the DMA PF to access the user buffer over PCI.
2) Create a KSM MKEY by setting its entries according to the user buffer VA to IOVA mapping, with the MKEY being the data direct device-crossed MKEY. This KSM MKEY is umrable and will be used as part of the MR cache. The PD for creating it is the internal device 'data direct' kernel one.
3) Create a crossing MKEY that points to the KSM MKEY using the crossing access mode.
4) Manage the KSM MKEY by adding it to a list of 'data direct' MKEYs managed on the mlx5_ib device.
5) Return the crossing MKEY to the user, created with its supplied PD.
Upon DMA PF unbind flow, the driver will revoke the KSM entries. The final deregistration will occur under the hood once the application deregisters its MKEY.
Notes:
- This version supports only the PINNED UMEM mode, so there is no dependency on ODP.
- The IOVA supplied by the application must be system page aligned due to HW translations of KSM.
- The crossing MKEY will not be umrable or part of the MR cache, as we cannot change its crossed (i.e. KSM) MKEY over UMR.
--- drivers/infiniband/hw/mlx5/main.c | 11 + drivers/infiniband/hw/mlx5/mlx5_ib.h | 8 + drivers/infiniband/hw/mlx5/mr.c | 304 +++++++++++++++++++--- drivers/infiniband/hw/mlx5/odp.c | 5 +- drivers/infiniband/hw/mlx5/umr.c | 93 ++++--- drivers/infiniband/hw/mlx5/umr.h | 1 + include/uapi/rdma/mlx5_user_ioctl_cmds.h | 4 + include/uapi/rdma/mlx5_user_ioctl_verbs.h | 4 + 8 files changed, 358 insertions(+), 72 deletions(-)
drivers/infiniband/hw/mlx5/main.c +11 -0
@@ -3490,6 +3490,7 @@ static int mlx5_ib_data_direct_init(struct mlx5_ib_dev *dev)if (ret)return ret; +INIT_LIST_HEAD (&dev->data_direct_mr_list); ret =mlx5_data_direct_ib_reg (dev, vuid);if (ret)mlx5_ib_free_data_direct_resources (dev);
@@ -3882,6 +3883,14 @@ ADD_UVERBS_ATTRIBUTES_SIMPLE( dump_fill_mkey), UA_MANDATORY)); +ADD_UVERBS_ATTRIBUTES_SIMPLE ( + mlx5_ib_reg_dmabuf_mr, +UVERBS_OBJECT_MR , +UVERBS_METHOD_REG_DMABUF_MR , +UVERBS_ATTR_FLAGS_IN (MLX5_IB_ATTR_REG_DMABUF_MR_ACCESS_FLAGS , + enum mlx5_ib_uapi_reg_dmabuf_flags, +UA_OPTIONAL )); +static const struct uapi_definition mlx5_ib_defs[] = {UAPI_DEF_CHAIN (mlx5_ib_devx_defs),UAPI_DEF_CHAIN (mlx5_ib_flow_defs),
@@ -3891,6 +3900,7 @@ static const struct uapi_definition mlx5_ib_defs[] = {UAPI_DEF_CHAIN (mlx5_ib_create_cq_defs),UAPI_DEF_CHAIN_OBJ_TREE (UVERBS_OBJECT_DEVICE , &mlx5_ib_query_context), +UAPI_DEF_CHAIN_OBJ_TREE (UVERBS_OBJECT_MR , &mlx5_ib_reg_dmabuf_mr),UAPI_DEF_CHAIN_OBJ_TREE_NAMED (MLX5_IB_OBJECT_VAR ,UAPI_DEF_IS_OBJ_SUPPORTED (var_is_supported)), UAPI_DEF_CHAIN_OBJ_TREE_NAMED(MLX5_IB_OBJECT_UAR),
@@ -4396,6 +4406,7 @@ void mlx5_ib_data_direct_bind(struct mlx5_ib_dev *ibdev,void mlx5_ib_data_direct_unbind (struct mlx5_ib_dev *ibdev) {mutex_lock (&ibdev->data_direct_lock); +mlx5_ib_revoke_data_direct_mrs (ibdev); ibdev->data_direct_dev =NULL ;mutex_unlock (&ibdev->data_direct_lock); }
drivers/infiniband/hw/mlx5/mlx5_ib.h +8 -0
@@ -682,6 +682,8 @@ struct mlx5_ib_mr {struct mlx5_ib_mkey mmkey;struct ib_umem *umem; +/* The mr is data direct related */ + u8 data_direct :1;union {/* Used only by kernel MRs (umem == NULL) */
@@ -719,6 +721,10 @@ struct mlx5_ib_mr { } odp_destroy;struct ib_odp_counters odp_stats;bool is_odp_implicit; +/* The affilated data direct crossed mr */ +struct mlx5_ib_mr *dd_crossed_mr; +struct list_head dd_node; + u8 revoked :1; }; }; };
@@ -1169,6 +1175,7 @@ struct mlx5_ib_dev {/* protect resources needed as part of reset flow */ spinlock_t reset_flow_resource_lock;struct list_head qp_list; +struct list_head data_direct_mr_list;/* Array with num_ports elements */ struct mlx5_ib_port *port;struct mlx5_sq_bfreg bfreg;
@@ -1437,6 +1444,7 @@ struct ib_mr *mlx5_ib_reg_dm_mr(struct ib_pd *pd, struct ib_dm *dm,void mlx5_ib_data_direct_bind (struct mlx5_ib_dev *ibdev,struct mlx5_data_direct_dev *dev);void mlx5_ib_data_direct_unbind (struct mlx5_ib_dev *ibdev); +void mlx5_ib_revoke_data_direct_mrs (struct mlx5_ib_dev *dev);#ifdef CONFIG_INFINIBAND_ON_DEMAND_PAGING int mlx5_ib_odp_init_one (struct mlx5_ib_dev *ibdev);
drivers/infiniband/hw/mlx5/mr.c +263 -41
456 lines not on this page · raw message
drivers/infiniband/hw/mlx5/odp.c +4 -1
@@ -710,7 +710,10 @@ static int pagefault_dmabuf_mr(struct mlx5_ib_mr *mr, size_t bcnt,ib_umem_dmabuf_unmap_pages (umem_dmabuf); err = -EINVAL ; }else { - err =mlx5r_umr_update_mr_pas (mr, xlt_flags); +if (mr->data_direct) + err =mlx5r_umr_update_data_direct_ksm_pas (mr, xlt_flags); +else + err =mlx5r_umr_update_mr_pas (mr, xlt_flags); }dma_resv_unlock (umem_dmabuf->attach->dmabuf->resv);
drivers/infiniband/hw/mlx5/umr.c +63 -30
140 lines not on this page · raw message
drivers/infiniband/hw/mlx5/umr.h +1 -0
@@ -95,6 +95,7 @@ int mlx5r_umr_revoke_mr(struct mlx5_ib_mr *mr);int mlx5r_umr_rereg_pd_access (struct mlx5_ib_mr *mr,struct ib_pd *pd,int access_flags);int mlx5r_umr_update_mr_pas (struct mlx5_ib_mr *mr,unsigned int flags); +int mlx5r_umr_update_data_direct_ksm_pas (struct mlx5_ib_mr *mr,unsigned int flags);int mlx5r_umr_update_xlt (struct mlx5_ib_mr *mr,u64 idx,int npages,int page_shift,int flags);
include/uapi/rdma/mlx5_user_ioctl_cmds.h +4 -0
@@ -274,6 +274,10 @@ enum mlx5_ib_create_cq_attrs { MLX5_IB_ATTR_CREATE_CQ_UAR_INDEX = UVERBS_ID_DRIVER_NS_WITH_UHW, }; +enum mlx5_ib_reg_dmabuf_mr_attrs { +MLX5_IB_ATTR_REG_DMABUF_MR_ACCESS_FLAGS = (1U <<UVERBS_ID_NS_SHIFT ), +}; +#define MLX5_IB_DW_MATCH_PARAM 0xA0struct mlx5_ib_match_params {
include/uapi/rdma/mlx5_user_ioctl_verbs.h +4 -0
@@ -54,6 +54,10 @@ enum mlx5_ib_uapi_flow_action_packet_reformat_type { MLX5_IB_UAPI_FLOW_ACTION_PACKET_REFORMAT_TYPE_L2_TO_L3_TUNNEL = 0x3, }; +enum mlx5_ib_uapi_reg_dmabuf_flags { +MLX5_IB_UAPI_REG_DMABUF_ACCESS_DATA_DIRECT =1 <<0 , +}; +struct mlx5_ib_uapi_devx_async_cmd_hdr {__aligned_u64 wr_id;__u8 out_data[];
Signature · 1 line
2.45.2
PATCH 8/8 RDMA/mlx5: Introduce GET_DATA_DIRECT_SYSFS_PATH ioctl
In reply to Leon RomanovskyFrom: Yishai Hadas <[email protected]>
Introduce the 'GET_DATA_DIRECT_SYSFS_PATH' ioctl to return the sysfs path of the affiliated 'data direct' device for a given device.
--- drivers/infiniband/hw/mlx5/std_types.c | 55 +++++++++++++++++++++++- include/uapi/rdma/mlx5_user_ioctl_cmds.h | 5 +++ 2 files changed, 59 insertions(+), 1 deletion(-)
drivers/infiniband/hw/mlx5/std_types.c +54 -1
@@ -10,6 +10,7 @@#include <linux/mlx5/eswitch.h> #include <linux/mlx5/vport.h> #include "mlx5_ib.h" +#include "data_direct.h" #define UVERBS_MODULE_NAME mlx5_ib#include <rdma/uverbs_named_ioctl.h>
@@ -183,6 +184,50 @@ static int UVERBS_HANDLER(MLX5_IB_METHOD_QUERY_PORT)( sizeof(info)); } +static int UVERBS_HANDLER (MLX5_IB_METHOD_GET_DATA_DIRECT_SYSFS_PATH )( +struct uverbs_attr_bundle *attrs) +{ +struct mlx5_data_direct_dev *data_direct_dev; +struct mlx5_ib_ucontext *c; +struct mlx5_ib_dev *dev; +int out_len =uverbs_attr_get_len (attrs, +MLX5_IB_ATTR_GET_DATA_DIRECT_SYSFS_PATH ); +u32 dev_path_len; +char *dev_path; +int ret; + + c =to_mucontext (ib_uverbs_get_ucontext (attrs)); +if (IS_ERR (c)) +return PTR_ERR (c); + dev =to_mdev (c->ibucontext.device); +mutex_lock (&dev->data_direct_lock); + data_direct_dev = dev->data_direct_dev; +if (!data_direct_dev) { + ret = -ENODEV ; + goto end; + } + + dev_path =kobject_get_path (&data_direct_dev->device->kobj,GFP_KERNEL ); +if (!dev_path) { + ret = -ENOMEM ; + goto end; + } + + dev_path_len =strlen (dev_path) +1 ; +if (dev_path_len > out_len) { + ret = -ENOSPC ; + goto end; + } + + ret =uverbs_copy_to (attrs,MLX5_IB_ATTR_GET_DATA_DIRECT_SYSFS_PATH , dev_path, + dev_path_len); +kfree (dev_path); + +end: +mutex_unlock (&dev->data_direct_lock); +return ret; +} + DECLARE_UVERBS_NAMED_METHOD( MLX5_IB_METHOD_QUERY_PORT, UVERBS_ATTR_PTR_IN(MLX5_IB_ATTR_QUERY_PORT_PORT_NUM,
@@ -193,9 +238,17 @@ DECLARE_UVERBS_NAMED_METHOD( reg_c0), UA_MANDATORY)); +DECLARE_UVERBS_NAMED_METHOD ( +MLX5_IB_METHOD_GET_DATA_DIRECT_SYSFS_PATH , +UVERBS_ATTR_PTR_OUT ( +MLX5_IB_ATTR_GET_DATA_DIRECT_SYSFS_PATH , +UVERBS_ATTR_MIN_SIZE (0 ), +UA_MANDATORY )); +ADD_UVERBS_METHODS (mlx5_ib_device,UVERBS_OBJECT_DEVICE , - &UVERBS_METHOD (MLX5_IB_METHOD_QUERY_PORT )); + &UVERBS_METHOD (MLX5_IB_METHOD_QUERY_PORT ), + &UVERBS_METHOD (MLX5_IB_METHOD_GET_DATA_DIRECT_SYSFS_PATH )); DECLARE_UVERBS_NAMED_METHOD( MLX5_IB_METHOD_PD_QUERY,
include/uapi/rdma/mlx5_user_ioctl_cmds.h +5 -0
@@ -348,6 +348,7 @@ enum mlx5_ib_pd_methods {enum mlx5_ib_device_methods {MLX5_IB_METHOD_QUERY_PORT = (1U <<UVERBS_ID_NS_SHIFT ), +MLX5_IB_METHOD_GET_DATA_DIRECT_SYSFS_PATH , };enum mlx5_ib_query_port_attrs {
@@ -355,4 +356,8 @@ enum mlx5_ib_query_port_attrs { MLX5_IB_ATTR_QUERY_PORT, }; +enum mlx5_ib_get_data_direct_sysfs_path_attrs { +MLX5_IB_ATTR_GET_DATA_DIRECT_SYSFS_PATH = (1U <<UVERBS_ID_NS_SHIFT ), +}; +#endif
Signature · 1 line
2.45.2
Leon Romanovsky
AppliedRe: (subset) [PATCH rdma-next 0/8] Introducing Multi-Path DMA Support for mlx5 RDMA Driver
In reply to Leon RomanovskyQuoted 14 lines · Leon Romanovsky
From: Leon Romanovsky <[email protected]>
From Yishai,
Overview
--------
This patch series aims to enable multi-path DMA support, allowing an mlx5 RDMA device to issue DMA commands through multiple paths. This feature is critical for improving performance and reaching line rate in certain environments where issuing PCI transactions over one path may be significantly faster than over another. These differences can arise from various PCI generations in the system or the specific system topology.
Quoted 1 line
[...]
Applied, thanks!
[2/8] RDMA/mlx5: Introduce the 'data direct' driver
https://git.kernel.org/rdma/rdma/c/281658bd04e7b9 [3/8] RDMA/mlx5: Add the initialization flow to utilize the 'data direct' device https://git.kernel.org/rdma/rdma/c/302b01afc28b1e [4/8] RDMA/umem: Add support for creating pinned DMABUF umem with a given dma device https://git.kernel.org/rdma/rdma/c/b047ecbd7672d2 [5/8] RDMA/umem: Introduce an option to revoke DMABUF umem https://git.kernel.org/rdma/rdma/c/bc9be75e01373c [6/8] RDMA: Pass uverbs_attr_bundle as part of '.reg_user_mr_dmabuf' API https://git.kernel.org/rdma/rdma/c/83f44068da564d [7/8] RDMA/mlx5: Add support for DMABUF MR registrations with Data-direct https://git.kernel.org/rdma/rdma/c/19ae08911f8be1 [8/8] RDMA/mlx5: Introduce GET_DATA_DIRECT_SYSFS_PATH ioctl https://git.kernel.org/rdma/rdma/c/d222b19c595f63
Best regards,
Signature · 1 line
Leon Romanovsky <[email protected]>