EFA RDMA read support
Subsystems (2)
cover EFA RDMA read support
Hi,
The following series introduces RDMA read support and capabilities reporting to the EFA driver.
The first two patches aren't directly related to RDMA read, but refactor some bits in the device capabilities struct.
The last two patches add support for remote read access in MR registration and expose the RDMA read related attributes to the userspace library.
PR was sent:
https://github.com/linux-rdma/rdma-core/pull/576
Thanks,
Gal
Daniel Kranzdorf (2):
RDMA/efa: Support remote read access in MR registration RDMA/efa: Expose RDMA read related attributes
Gal Pressman (2):
RDMA/efa: Fix incorrect error print
RDMA/efa: Store network attributes in device attributes
drivers/infiniband/hw/efa/efa.h | 2 - .../infiniband/hw/efa/efa_admin_cmds_defs.h | 29 +++++++++++-- drivers/infiniband/hw/efa/efa_com_cmd.c | 41 ++++++++----------- drivers/infiniband/hw/efa/efa_com_cmd.h | 18 +++----- drivers/infiniband/hw/efa/efa_main.c | 16 -------- drivers/infiniband/hw/efa/efa_verbs.c | 15 ++++--- include/uapi/rdma/efa-abi.h | 3 ++ 7 files changed, 59 insertions(+), 65 deletions(-)
Signature · 1 line
2.23.0
PATCH 1/4 RDMA/efa: Fix incorrect error print
The error print should indicate that it failed to get the queue attributes, not network attributes.
--- drivers/infiniband/hw/efa/efa_com_cmd.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/infiniband/hw/efa/efa_com_cmd.c +1 -1
@@ -481,7 +481,7 @@ int efa_com_get_device_attr(struct efa_com_dev *edev, EFA_ADMIN_QUEUE_ATTR);if (err) {ibdev_err_ratelimited (edev->efa_dev, -"Failed to get network attributes %d\n" , +"Failed to get queue attributes %d\n" , err);return err; }
Signature · 1 line
2.23.0
Re: [PATCH for-next 1/4] RDMA/efa: Fix incorrect error print
Quoted 8 lines · Gal Pressman
The error print should indicate that it failed to get the queue attributes, not network attributes.
Reviewed-by Daniel Kranzdorf <[email protected]>Reviewed-by Firas JahJah <[email protected]>Signed-off-by Gal Pressman <[email protected]>drivers/infiniband/hw/efa/efa_com_cmd.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
Safe enough to apply to for-next, thanks
Jason
PATCH 2/4 RDMA/efa: Store network attributes in device attributes
In reply to Gal PressmanThere's no reason to separate the network attributes from all other device attributes. Embed the fields inside the device attributes and query them all in one function.
--- drivers/infiniband/hw/efa/efa.h | 2 -- drivers/infiniband/hw/efa/efa_com_cmd.c | 34 +++++++++---------------- drivers/infiniband/hw/efa/efa_com_cmd.h | 9 ++----- drivers/infiniband/hw/efa/efa_main.c | 16 ------------ drivers/infiniband/hw/efa/efa_verbs.c | 8 +++--- 5 files changed, 18 insertions(+), 51 deletions(-)
drivers/infiniband/hw/efa/efa.h +0 -2
@@ -60,8 +60,6 @@ struct efa_dev {u64 mem_bar_len;u64 db_bar_addr;u64 db_bar_len; -u8 addr[EFA_GID_SIZE ]; -u32 mtu;int admin_msix_vector_idx;struct efa_irq admin_irq;
drivers/infiniband/hw/efa/efa_com_cmd.c +12 -22
@@ -423,28 +423,6 @@ static int efa_com_get_feature(struct efa_com_dev *edev,return efa_com_get_feature_ex (edev, get_resp, feature_id,0 ,0 ); } -int efa_com_get_network_attr (struct efa_com_dev *edev, -struct efa_com_get_network_attr_result *result) -{ -struct efa_admin_get_feature_resp resp; -int err; - - err =efa_com_get_feature (edev, &resp, -EFA_ADMIN_NETWORK_ATTR ); -if (err) { -ibdev_err_ratelimited (edev->efa_dev, -"Failed to get network attributes %d\n" , - err); -return err; - } - -memcpy (result->addr, resp.u.network_attr.addr, -sizeof (resp.u.network_attr.addr)); - result->mtu = resp.u.network_attr.mtu; - -return 0 ; -} -int efa_com_get_device_attr (struct efa_com_dev *edev,struct efa_com_get_device_attr_result *result) {
@@ -501,6 +479,18 @@ int efa_com_get_device_attr(struct efa_com_dev *edev, result->max_llq_size = resp.u.queue_attr.max_llq_size; result->sub_cqs_per_cq = resp.u.queue_attr.sub_cqs_per_cq; + err =efa_com_get_feature (edev, &resp,EFA_ADMIN_NETWORK_ATTR ); +if (err) { +ibdev_err_ratelimited (edev->efa_dev, +"Failed to get network attributes %d\n" , + err); +return err; + } + +memcpy (result->addr, resp.u.network_attr.addr, +sizeof (resp.u.network_attr.addr)); + result->mtu = resp.u.network_attr.mtu; +return 0 ; }
drivers/infiniband/hw/efa/efa_com_cmd.h +2 -7
@@ -100,14 +100,11 @@ struct efa_com_destroy_ah_params {u16 pdn; }; -struct efa_com_get_network_attr_result { -u8 addr[EFA_GID_SIZE ]; -u32 mtu; -}; -struct efa_com_get_device_attr_result { +u8 addr[EFA_GID_SIZE ];u64 page_size_cap;u64 max_mr_pages; +u32 mtu;u32 fw_version;u32 admin_api_version;u32 device_version;
@@ -271,8 +268,6 @@ int efa_com_create_ah(struct efa_com_dev *edev, struct efa_com_create_ah_result *result);int efa_com_destroy_ah (struct efa_com_dev *edev,struct efa_com_destroy_ah_params *params); -int efa_com_get_network_attr (struct efa_com_dev *edev, -struct efa_com_get_network_attr_result *result);int efa_com_get_device_attr (struct efa_com_dev *edev,struct efa_com_get_device_attr_result *result); int efa_com_get_hw_hints(struct efa_com_dev *edev,
drivers/infiniband/hw/efa/efa_main.c +0 -16
@@ -30,15 +30,6 @@ MODULE_DEVICE_TABLE(pci, efa_pci_tbl); (BIT (EFA_ADMIN_FATAL_ERROR ) |BIT (EFA_ADMIN_WARNING ) | \BIT (EFA_ADMIN_NOTIFICATION ) |BIT (EFA_ADMIN_KEEP_ALIVE )) -static void efa_update_network_attr (struct efa_dev *dev, -struct efa_com_get_network_attr_result *network_attr) -{ -memcpy (dev->addr, network_attr->addr,sizeof (network_attr->addr)); - dev->mtu = network_attr->mtu; - -dev_dbg (&dev->pdev->dev,"Full address %pI6\n" , dev->addr); -} - /* This handler will called for unknown event group or unimplemented handlers */static void unimplemented_aenq_handler (void *data,struct efa_admin_aenq_entry *aenq_e)
@@ -233,7 +224,6 @@ static const struct ib_device_ops efa_dev_ops = {static int efa_ib_device_add (struct efa_dev *dev) { -struct efa_com_get_network_attr_result network_attr;struct efa_com_get_hw_hints_result hw_hints;struct pci_dev *pdev = dev->pdev;int err;
@@ -249,12 +239,6 @@ static int efa_ib_device_add(struct efa_dev *dev)if (err)return err; - err =efa_com_get_network_attr (&dev->edev, &network_attr); -if (err) - goto err_release_doorbell_bar; - -efa_update_network_attr (dev, &network_attr); - err =efa_com_get_hw_hints (&dev->edev, &hw_hints);if (err) goto err_release_doorbell_bar;
drivers/infiniband/hw/efa/efa_verbs.c +4 -4
@@ -338,9 +338,9 @@ int efa_query_port(struct ib_device *ibdev, u8 port, props->pkey_tbl_len =1 ; props->active_speed =IB_SPEED_EDR ; props->active_width =IB_WIDTH_4X ; - props->max_mtu =ib_mtu_int_to_enum (dev->mtu); - props->active_mtu =ib_mtu_int_to_enum (dev->mtu); - props->max_msg_sz = dev->mtu; + props->max_mtu =ib_mtu_int_to_enum (dev->dev_attr.mtu); + props->active_mtu =ib_mtu_int_to_enum (dev->dev_attr.mtu); + props->max_msg_sz = dev->dev_attr.mtu; props->max_vl_num =1 ;return 0 ;
@@ -401,7 +401,7 @@ int efa_query_gid(struct ib_device *ibdev, u8 port, int index, {struct efa_dev *dev =to_edev (ibdev); -memcpy (gid->raw, dev->addr,sizeof (dev->addr)); +memcpy (gid->raw, dev->dev_attr.addr,sizeof (dev->dev_attr.addr));return 0 ; }
Signature · 1 line
2.23.0
PATCH 3/4 RDMA/efa: Support remote read access in MR registration
In reply to Gal PressmanFrom: Daniel Kranzdorf <[email protected]>
Enable remote read access for memory regions in order to support RDMA operations.
--- drivers/infiniband/hw/efa/efa_admin_cmds_defs.h | 12 +++++++++--- drivers/infiniband/hw/efa/efa_com_cmd.c | 3 +-- drivers/infiniband/hw/efa/efa_com_cmd.h | 7 +------ drivers/infiniband/hw/efa/efa_verbs.c | 5 +++-- 4 files changed, 14 insertions(+), 13 deletions(-)
drivers/infiniband/hw/efa/efa_admin_cmds_defs.h +9 -3
@@ -362,9 +362,13 @@ struct efa_admin_reg_mr_cmd {/* * permissions -* 0 : local_write_enable - Write permissions: value -* of 1 needed for RQ buffers and for RDMA write -* 7:1 : reserved1 - remote access flags, etc +* 0 : local_write_enable - Local write permissions: +* must be set for RQ buffers and buffers posted for +* RDMA Read requests +* 1 : reserved1 - MBZ +* 2 : remote_read_enable - Remote read permissions: +* must be set to enable RDMA read from the region +* 7:3 : reserved2 - MBZ */ u8 permissions;
@@ -780,6 +784,8 @@ struct efa_admin_mmio_req_read_less_resp {#define EFA_ADMIN_REG_MR_CMD_MEM_ADDR_PHY_MODE_EN_SHIFT 7#define EFA_ADMIN_REG_MR_CMD_MEM_ADDR_PHY_MODE_EN_MASK BIT(7)#define EFA_ADMIN_REG_MR_CMD_LOCAL_WRITE_ENABLE_MASK BIT(0) +#define EFA_ADMIN_REG_MR_CMD_REMOTE_READ_ENABLE_SHIFT 2 +#define EFA_ADMIN_REG_MR_CMD_REMOTE_READ_ENABLE_MASK BIT(2)/* create_cq_cmd */ #define EFA_ADMIN_CREATE_CQ_CMD_INTERRUPT_MODE_ENABLED_SHIFT 5
drivers/infiniband/hw/efa/efa_com_cmd.c +1 -2
@@ -230,8 +230,7 @@ int efa_com_register_mr(struct efa_com_dev *edev, mr_cmd.flags |= params->page_shift &EFA_ADMIN_REG_MR_CMD_PHYS_PAGE_SIZE_SHIFT_MASK ; mr_cmd.iova = params->iova; - mr_cmd.permissions |= params->permissions & -EFA_ADMIN_REG_MR_CMD_LOCAL_WRITE_ENABLE_MASK ; + mr_cmd.permissions = params->permissions;if (params->inline_pbl) { memcpy(mr_cmd.pbl.inline_pbl_array,
drivers/infiniband/hw/efa/efa_com_cmd.h +1 -6
@@ -178,12 +178,7 @@ struct efa_com_reg_mr_params {* address mapping */ u8 page_shift; -/* -* permissions -* 0: local_write_enable - Write permissions: value of 1 needed -* for RQ buffers and for RDMA write:1: reserved1 - remote -* access flags, etc -*/ +/* see permissions field of struct efa_admin_reg_mr_cmd */ u8 permissions;u8 inline_pbl;u8 indirect;
drivers/infiniband/hw/efa/efa_verbs.c +3 -2
@@ -82,7 +82,8 @@ static const char *const efa_stats_names[] = {#define EFA_CHUNK_USED_SIZE \ ((EFA_PTRS_PER_CHUNK * EFA_CHUNK_PAYLOAD_PTR_SIZE) + EFA_CHUNK_PTR_SIZE) -#define EFA_SUPPORTED_ACCESS_FLAGS IB_ACCESS_LOCAL_WRITE +#define EFA_SUPPORTED_ACCESS_FLAGS \ + (IB_ACCESS_LOCAL_WRITE | IB_ACCESS_REMOTE_READ)struct pbl_chunk {dma_addr_t dma_addr;
@@ -1434,7 +1435,7 @@ struct ib_mr *efa_reg_mr(struct ib_pd *ibpd, u64 start, u64 length, params.pd =to_epd (ibpd)->pdn; params.iova = virt_addr; params.mr_length_in_bytes = length; - params.permissions = access_flags &0x1 ; + params.permissions = access_flags; pg_sz = ib_umem_find_best_pgsz(mr->umem, dev->dev_attr.page_size_cap,
Signature · 1 line
2.23.0
PATCH 4/4 RDMA/efa: Expose RDMA read related attributes
In reply to Gal PressmanFrom: Daniel Kranzdorf <[email protected]>
Query the device attributes for RDMA operations, including maximum transfer size and maximum number of SGEs per RDMA WR, and report them back to the userspace library.
--- drivers/infiniband/hw/efa/efa_admin_cmds_defs.h | 17 +++++++++++++++++ drivers/infiniband/hw/efa/efa_com_cmd.c | 2 ++ drivers/infiniband/hw/efa/efa_com_cmd.h | 2 ++ drivers/infiniband/hw/efa/efa_verbs.c | 2 ++ include/uapi/rdma/efa-abi.h | 3 +++ 5 files changed, 26 insertions(+)
drivers/infiniband/hw/efa/efa_admin_cmds_defs.h +17 -0
@@ -562,6 +562,16 @@ struct efa_admin_feature_device_attr_desc {/* Indicates how many bits are used virtual address access */ u8 virt_addr_width; + +/* +* 0 : rdma_read - If set, RDMA Read is supported on +* TX queues +* 31:1 : reserved - MBZ +*/ +u32 device_caps; + +/* Max RDMA transfer size in bytes */ +u32 max_rdma_size; };struct efa_admin_feature_queue_attr_desc {
@@ -608,6 +618,9 @@ struct efa_admin_feature_queue_attr_desc {/* The maximum size of LLQ in bytes */ u32 max_llq_size; + +/* Maximum number of SGEs for a single RDMA read WQE */ +u16 max_wr_rdma_sges; };struct efa_admin_feature_aenq_desc {
@@ -622,6 +635,7 @@ struct efa_admin_feature_network_attr_desc {/* Raw address data in network byte order */ u8 addr[16 ]; +/* max packet payload size in bytes */ u32 mtu; };
@@ -797,4 +811,7 @@ struct efa_admin_mmio_req_read_less_resp {/* get_set_feature_common_desc */ #define EFA_ADMIN_GET_SET_FEATURE_COMMON_DESC_SELECT_MASK GENMASK(1, 0) +/* feature_device_attr_desc */ +#define EFA_ADMIN_FEATURE_DEVICE_ATTR_DESC_RDMA_READ_MASK BIT(0) +#endif /* _EFA_ADMIN_CMDS_H_ */
drivers/infiniband/hw/efa/efa_com_cmd.c +2 -0
@@ -444,6 +444,7 @@ int efa_com_get_device_attr(struct efa_com_dev *edev, result->phys_addr_width = resp.u.device_attr.phys_addr_width; result->virt_addr_width = resp.u.device_attr.virt_addr_width; result->db_bar = resp.u.device_attr.db_bar; + result->max_rdma_size = resp.u.device_attr.max_rdma_size;if (result->admin_api_version <1 ) { ibdev_err_ratelimited(
@@ -477,6 +478,7 @@ int efa_com_get_device_attr(struct efa_com_dev *edev, result->max_ah = resp.u.queue_attr.max_ah; result->max_llq_size = resp.u.queue_attr.max_llq_size; result->sub_cqs_per_cq = resp.u.queue_attr.sub_cqs_per_cq; + result->max_wr_rdma_sge = resp.u.queue_attr.max_wr_rdma_sges; err =efa_com_get_feature (edev, &resp,EFA_ADMIN_NETWORK_ATTR );if (err) {
drivers/infiniband/hw/efa/efa_com_cmd.h +2 -0
@@ -121,9 +121,11 @@ struct efa_com_get_device_attr_result {u32 max_pd;u32 max_ah;u32 max_llq_size; +u32 max_rdma_size;u16 sub_cqs_per_cq;u16 max_sq_sge;u16 max_rq_sge; +u16 max_wr_rdma_sge;u8 db_bar; };
drivers/infiniband/hw/efa/efa_verbs.c +2 -0
@@ -313,6 +313,8 @@ int efa_query_device(struct ib_device *ibdev, resp.max_rq_sge = dev_attr->max_rq_sge; resp.max_sq_wr = dev_attr->max_sq_depth; resp.max_rq_wr = dev_attr->max_rq_depth; + resp.max_rdma_size = dev_attr->max_rdma_size; + resp.max_wr_rdma_sge = dev_attr->max_wr_rdma_sge; err =ib_copy_to_udata (udata, &resp,min (sizeof (resp), udata->outlen));
include/uapi/rdma/efa-abi.h +3 -0
@@ -96,6 +96,9 @@ struct efa_ibv_ex_query_device_resp {__u32 max_rq_wr;__u16 max_sq_sge;__u16 max_rq_sge; +__u32 max_rdma_size; +__u16 max_wr_rdma_sge; + __u8 reserved_b0[2]; };#endif /* EFA_ABI_USER_H */
Signature · 1 line
2.23.0
Quoted 8 lines · Gal Pressman
Hi,
The following series introduces RDMA read support and capabilities reporting to the EFA driver.
The first two patches aren't directly related to RDMA read, but refactor some bits in the device capabilities struct.
Quoted 6 lines
The last two patches add support for remote read access in MR registration and expose the RDMA read related attributes to the userspace library.
PR was sent:
https://github.com/linux-rdma/rdma-core/pull/576
Should I resubmit patches 2-4?
Quoted 9 lines · Gal Pressman
Quoted 8 lines · Gal Pressman
Hi,
The following series introduces RDMA read support and capabilities reporting to the EFA driver.
The first two patches aren't directly related to RDMA read, but refactor some bits in the device capabilities struct.
Quoted 8 lines
Quoted 6 lines
The last two patches add support for remote read access in MR registration and expose the RDMA read related attributes to the userspace library.
PR was sent:
https://github.com/linux-rdma/rdma-core/pull/576Should I resubmit patches 2-4?
No it is still on patchworks. You said not to apply your series until you said it was OK
Jason
Quoted 14 lines · Jason Gunthorpe
Quoted 13 lines · Gal Pressman
Quoted 12 lines · Gal Pressman
Hi,
The following series introduces RDMA read support and capabilities reporting to the EFA driver.
The first two patches aren't directly related to RDMA read, but refactor some bits in the device capabilities struct.
The last two patches add support for remote read access in MR registration and expose the RDMA read related attributes to the userspace library.
Quoted 7 lines
Quoted 4 lines
Quoted 2 lines
PR was sent:
https://github.com/linux-rdma/rdma-core/pull/576Should I resubmit patches 2-4?
No it is still on patchworks. You said not to apply your series until you said it was OK
Thanks, is it possible to send a mail when the series is reviewed/ready to merge and waiting to be applied?
Specifically for this feature, it seems we are going to need a capability bit for the RDMA read functionality, so I'll respin the kernel and userspace and submit again.
You can drop this one from patchworks.
Quoted 18 lines · Gal Pressman
Quoted 17 lines · Jason Gunthorpe
Quoted 16 lines · Gal Pressman
Quoted 14 lines · Gal Pressman
Hi,
The following series introduces RDMA read support and capabilities reporting to the EFA driver.
The first two patches aren't directly related to RDMA read, but refactor some bits in the device capabilities struct.
The last two patches add support for remote read access in MR registration and expose the RDMA read related attributes to the userspace library.
PR was sent:
https://github.com/linux-rdma/rdma-core/pull/576
Quoted 7 lines
Quoted 4 lines
Quoted 1 line
Should I resubmit patches 2-4?
No it is still on patchworks. You said not to apply your series until you said it was OK
Thanks, is it possible to send a mail when the series is reviewed/ready to merge and waiting to be applied?
Oh, I wasn't going to review anything until it was ready to apply
Quoted 1 line
You can drop this one from patchworks.
done
Jason