Skip to contentSkip to conversation

EFA RDMA read support

PATCH In review Gal Pressman 2 participants 10 messages Sep 10, 2019 – Oct 23, 2019

Subsystems (2)
lore
Share & tools
lore
#0 lore raw

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
#1 lore raw

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
index 501dce89f275..c079f1332082 100644
@@ -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
#2 lore raw

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.

 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

#3 lore raw

PATCH 2/4 RDMA/efa: Store network attributes in device attributes

In reply to Gal Pressman

There'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
index 2283e432693e..a642e96045dc 100644
@@ -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
index c079f1332082..4713c2756ad3 100644
@@ -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
index 7f6c13052f49..6134d13ecc6f 100644
@@ -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
index 83858f7e83d0..086f7302b870 100644
@@ -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
index 4edae89e8e3c..fe79351334f3 100644
@@ -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
#4 lore raw

PATCH 3/4 RDMA/efa: Support remote read access in MR registration

In reply to Gal Pressman

From: 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
index 2be0469d545f..7fa9d532db61 100644
@@ -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
index 4713c2756ad3..520c9d920f9e 100644
@@ -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
index 6134d13ecc6f..d119186c41d0 100644
@@ -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
index fe79351334f3..0011e2c1c8a6 100644
@@ -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
#5 lore raw

PATCH 4/4 RDMA/efa: Expose RDMA read related attributes

In reply to Gal Pressman

From: 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
index 7fa9d532db61..e96bcb16bd2b 100644
@@ -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
index 520c9d920f9e..0e6796f11e52 100644
@@ -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
index d119186c41d0..4dd3452d0b41 100644
@@ -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
index 0011e2c1c8a6..188fcb41218d 100644
@@ -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
index 9599a2a62be8..269424c2a8a7 100644
@@ -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
#6 lore raw
In reply to 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 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?

#7 lore raw
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/576

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

Jason

#8 lore raw
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/576

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?

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.

#9 lore raw
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