linux-rdma.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* [PATCH for-next 0/2] Retrieve HW GID context from ib_gid_attr
@ 2019-12-12 10:22 Selvin Xavier
  2019-12-12 10:22 ` [PATCH for-next 1/2] IB/core: Add option to retrieve driver gid " Selvin Xavier
  2019-12-12 10:22 ` [PATCH for-next 2/2] RDMA/bnxt_re: Retrieve the driver gid context from gid_attr Selvin Xavier
  0 siblings, 2 replies; 5+ messages in thread
From: Selvin Xavier @ 2019-12-12 10:22 UTC (permalink / raw)
  To: dledford, jgg; +Cc: linux-rdma, Selvin Xavier

Provide an option for vendor drivers to get the HW GID context
from the ib_gid_attr during modify_qp and create_ah. Required
for drivers/HW that maintains HW gid index different than the
host sgid_index.

Please review.

Thanks,
Selvin Xavier

Selvin Xavier (2):
  IB/core: Add option to retrieve driver gid context from ib_gid_attr
  RDMA/bnxt_re: Retrieve the driver gid context from gid_attr

 drivers/infiniband/core/cache.c          | 79 ++++++++++++++++++--------------
 drivers/infiniband/hw/bnxt_re/ib_verbs.c | 28 +++++------
 include/rdma/ib_verbs.h                  |  5 ++
 3 files changed, 65 insertions(+), 47 deletions(-)

-- 
2.5.5


^ permalink raw reply	[flat|nested] 5+ messages in thread

* [PATCH for-next 1/2] IB/core: Add option to retrieve driver gid context from ib_gid_attr
  2019-12-12 10:22 [PATCH for-next 0/2] Retrieve HW GID context from ib_gid_attr Selvin Xavier
@ 2019-12-12 10:22 ` Selvin Xavier
  2019-12-13 23:17   ` Parav Pandit
  2019-12-12 10:22 ` [PATCH for-next 2/2] RDMA/bnxt_re: Retrieve the driver gid context from gid_attr Selvin Xavier
  1 sibling, 1 reply; 5+ messages in thread
From: Selvin Xavier @ 2019-12-12 10:22 UTC (permalink / raw)
  To: dledford, jgg; +Cc: linux-rdma, Selvin Xavier, Devesh Sharma

Provide an option to retrieve the driver gid context from ib_gid_attr
structure. Introduce ib_gid_attr_info structure which include both
gid_attr and the GID's HW context. Replace the attr and context
members of ib_gid_table_entry with the new ib_gid_attr_info
structure. Vendor drivers can refer to its own HW gid context
using the container_of macro.

Suggested-by: Jason Gunthorpe <jgg@mellanox.com>
Signed-off-by: Devesh Sharma <devesh.sharma@broadcom.com>
Signed-off-by: Selvin Xavier <selvin.xavier@broadcom.com>
---
 drivers/infiniband/core/cache.c | 79 +++++++++++++++++++++++------------------
 include/rdma/ib_verbs.h         |  5 +++
 2 files changed, 50 insertions(+), 34 deletions(-)

diff --git a/drivers/infiniband/core/cache.c b/drivers/infiniband/core/cache.c
index d535995..54ed25d 100644
--- a/drivers/infiniband/core/cache.c
+++ b/drivers/infiniband/core/cache.c
@@ -86,8 +86,7 @@ struct roce_gid_ndev_storage {
 struct ib_gid_table_entry {
 	struct kref			kref;
 	struct work_struct		del_work;
-	struct ib_gid_attr		attr;
-	void				*context;
+	struct ib_gid_attr_info		attr_info;
 	/* Store the ndev pointer to release reference later on in
 	 * call_rcu context because by that time gid_table_entry
 	 * and attr might be already freed. So keep a copy of it.
@@ -233,12 +232,13 @@ static void put_gid_ndev(struct rcu_head *head)
 
 static void free_gid_entry_locked(struct ib_gid_table_entry *entry)
 {
-	struct ib_device *device = entry->attr.device;
-	u8 port_num = entry->attr.port_num;
+	struct ib_device *device = entry->attr_info.attr.device;
+	u8 port_num = entry->attr_info.attr.port_num;
 	struct ib_gid_table *table = rdma_gid_table(device, port_num);
 
 	dev_dbg(&device->dev, "%s port=%d index=%d gid %pI6\n", __func__,
-		port_num, entry->attr.index, entry->attr.gid.raw);
+		port_num, entry->attr_info.attr.index,
+		entry->attr_info.attr.gid.raw);
 
 	write_lock_irq(&table->rwlock);
 
@@ -248,8 +248,8 @@ static void free_gid_entry_locked(struct ib_gid_table_entry *entry)
 	 * If new entry in table is added by the time we free here,
 	 * don't overwrite the table entry.
 	 */
-	if (entry == table->data_vec[entry->attr.index])
-		table->data_vec[entry->attr.index] = NULL;
+	if (entry == table->data_vec[entry->attr_info.attr.index])
+		table->data_vec[entry->attr_info.attr.index] = NULL;
 	/* Now this index is ready to be allocated */
 	write_unlock_irq(&table->rwlock);
 
@@ -278,8 +278,8 @@ static void free_gid_work(struct work_struct *work)
 {
 	struct ib_gid_table_entry *entry =
 		container_of(work, struct ib_gid_table_entry, del_work);
-	struct ib_device *device = entry->attr.device;
-	u8 port_num = entry->attr.port_num;
+	struct ib_device *device = entry->attr_info.attr.device;
+	u8 port_num = entry->attr_info.attr.port_num;
 	struct ib_gid_table *table = rdma_gid_table(device, port_num);
 
 	mutex_lock(&table->lock);
@@ -309,7 +309,7 @@ alloc_gid_entry(const struct ib_gid_attr *attr)
 		entry->ndev_storage->ndev = ndev;
 	}
 	kref_init(&entry->kref);
-	memcpy(&entry->attr, attr, sizeof(*attr));
+	memcpy(&entry->attr_info.attr, attr, sizeof(*attr));
 	INIT_WORK(&entry->del_work, free_gid_work);
 	entry->state = GID_TABLE_ENTRY_INVALID;
 	return entry;
@@ -320,13 +320,15 @@ static void store_gid_entry(struct ib_gid_table *table,
 {
 	entry->state = GID_TABLE_ENTRY_VALID;
 
-	dev_dbg(&entry->attr.device->dev, "%s port=%d index=%d gid %pI6\n",
-		__func__, entry->attr.port_num, entry->attr.index,
-		entry->attr.gid.raw);
+	dev_dbg(&entry->attr_info.attr.device->dev,
+		"%s port=%d index=%d gid %pI6\n",
+		__func__, entry->attr_info.attr.port_num,
+		entry->attr_info.attr.index,
+		entry->attr_info.attr.gid.raw);
 
 	lockdep_assert_held(&table->lock);
 	write_lock_irq(&table->rwlock);
-	table->data_vec[entry->attr.index] = entry;
+	table->data_vec[entry->attr_info.attr.index] = entry;
 	write_unlock_irq(&table->rwlock);
 }
 
@@ -347,7 +349,7 @@ static void put_gid_entry_locked(struct ib_gid_table_entry *entry)
 
 static int add_roce_gid(struct ib_gid_table_entry *entry)
 {
-	const struct ib_gid_attr *attr = &entry->attr;
+	const struct ib_gid_attr *attr = &entry->attr_info.attr;
 	int ret;
 
 	if (!attr->ndev) {
@@ -356,7 +358,8 @@ static int add_roce_gid(struct ib_gid_table_entry *entry)
 		return -EINVAL;
 	}
 	if (rdma_cap_roce_gid_table(attr->device, attr->port_num)) {
-		ret = attr->device->ops.add_gid(attr, &entry->context);
+		ret = attr->device->ops.add_gid(attr,
+						&entry->attr_info.context);
 		if (ret) {
 			dev_err(&attr->device->dev,
 				"%s GID add failed port=%d index=%d\n",
@@ -385,7 +388,7 @@ static void del_gid(struct ib_device *ib_dev, u8 port,
 	lockdep_assert_held(&table->lock);
 
 	dev_dbg(&ib_dev->dev, "%s port=%d index=%d gid %pI6\n", __func__, port,
-		ix, table->data_vec[ix]->attr.gid.raw);
+		ix, table->data_vec[ix]->attr_info.attr.gid.raw);
 
 	write_lock_irq(&table->rwlock);
 	entry = table->data_vec[ix];
@@ -400,12 +403,13 @@ static void del_gid(struct ib_device *ib_dev, u8 port,
 	ndev_storage = entry->ndev_storage;
 	if (ndev_storage) {
 		entry->ndev_storage = NULL;
-		rcu_assign_pointer(entry->attr.ndev, NULL);
+		rcu_assign_pointer(entry->attr_info.attr.ndev, NULL);
 		call_rcu(&ndev_storage->rcu_head, put_gid_ndev);
 	}
 
 	if (rdma_cap_roce_gid_table(ib_dev, port))
-		ib_dev->ops.del_gid(&entry->attr, &entry->context);
+		ib_dev->ops.del_gid(&entry->attr_info.attr,
+				    &entry->attr_info.context);
 
 	put_gid_entry_locked(entry);
 }
@@ -508,13 +512,13 @@ static int find_gid(struct ib_gid_table *table, const union ib_gid *gid,
 		if (found >= 0)
 			continue;
 
-		attr = &data->attr;
+		attr = &data->attr_info.attr;
 		if (mask & GID_ATTR_FIND_MASK_GID_TYPE &&
 		    attr->gid_type != val->gid_type)
 			continue;
 
 		if (mask & GID_ATTR_FIND_MASK_GID &&
-		    memcmp(gid, &data->attr.gid, sizeof(*gid)))
+		    memcmp(gid, &data->attr_info.attr.gid, sizeof(*gid)))
 			continue;
 
 		if (mask & GID_ATTR_FIND_MASK_NETDEV &&
@@ -648,7 +652,7 @@ int ib_cache_gid_del_all_netdev_gids(struct ib_device *ib_dev, u8 port,
 
 	for (ix = 0; ix < table->sz; ix++) {
 		if (is_gid_entry_valid(table->data_vec[ix]) &&
-		    table->data_vec[ix]->attr.ndev == ndev) {
+		    table->data_vec[ix]->attr_info.attr.ndev == ndev) {
 			del_gid(ib_dev, port, table, ix);
 			deleted = true;
 		}
@@ -703,7 +707,7 @@ rdma_find_gid_by_port(struct ib_device *ib_dev,
 	local_index = find_gid(table, gid, &val, false, mask, NULL);
 	if (local_index >= 0) {
 		get_gid_entry(table->data_vec[local_index]);
-		attr = &table->data_vec[local_index]->attr;
+		attr = &table->data_vec[local_index]->attr_info.attr;
 		read_unlock_irqrestore(&table->rwlock, flags);
 		return attr;
 	}
@@ -753,12 +757,12 @@ const struct ib_gid_attr *rdma_find_gid_by_filter(
 		if (!is_gid_entry_valid(entry))
 			continue;
 
-		if (memcmp(gid, &entry->attr.gid, sizeof(*gid)))
+		if (memcmp(gid, &entry->attr_info.attr.gid, sizeof(*gid)))
 			continue;
 
-		if (filter(gid, &entry->attr, context)) {
+		if (filter(gid, &entry->attr_info.attr, context)) {
 			get_gid_entry(entry);
-			res = &entry->attr;
+			res = &entry->attr_info.attr;
 			break;
 		}
 	}
@@ -964,7 +968,7 @@ int rdma_query_gid(struct ib_device *device, u8 port_num,
 	    !is_gid_entry_valid(table->data_vec[index]))
 		goto done;
 
-	memcpy(gid, &table->data_vec[index]->attr.gid, sizeof(*gid));
+	memcpy(gid, &table->data_vec[index]->attr_info.attr.gid, sizeof(*gid));
 	res = 0;
 
 done:
@@ -1011,7 +1015,7 @@ const struct ib_gid_attr *rdma_find_gid(struct ib_device *device,
 			const struct ib_gid_attr *attr;
 
 			get_gid_entry(table->data_vec[index]);
-			attr = &table->data_vec[index]->attr;
+			attr = &table->data_vec[index]->attr_info.attr;
 			read_unlock_irqrestore(&table->rwlock, flags);
 			return attr;
 		}
@@ -1210,7 +1214,7 @@ rdma_get_gid_attr(struct ib_device *device, u8 port_num, int index)
 		goto done;
 
 	get_gid_entry(table->data_vec[index]);
-	attr = &table->data_vec[index]->attr;
+	attr = &table->data_vec[index]->attr_info.attr;
 done:
 	read_unlock_irqrestore(&table->rwlock, flags);
 	return attr;
@@ -1230,8 +1234,10 @@ EXPORT_SYMBOL(rdma_get_gid_attr);
  */
 void rdma_put_gid_attr(const struct ib_gid_attr *attr)
 {
+	struct ib_gid_attr_info *info =
+		container_of(attr, struct ib_gid_attr_info, attr);
 	struct ib_gid_table_entry *entry =
-		container_of(attr, struct ib_gid_table_entry, attr);
+		container_of(info, struct ib_gid_table_entry, attr_info);
 
 	put_gid_entry(entry);
 }
@@ -1249,8 +1255,10 @@ EXPORT_SYMBOL(rdma_put_gid_attr);
  */
 void rdma_hold_gid_attr(const struct ib_gid_attr *attr)
 {
+	struct ib_gid_attr_info *info =
+		container_of(attr, struct ib_gid_attr_info, attr);
 	struct ib_gid_table_entry *entry =
-		container_of(attr, struct ib_gid_table_entry, attr);
+		container_of(info, struct ib_gid_table_entry, attr_info);
 
 	get_gid_entry(entry);
 }
@@ -1270,11 +1278,14 @@ EXPORT_SYMBOL(rdma_hold_gid_attr);
  */
 struct net_device *rdma_read_gid_attr_ndev_rcu(const struct ib_gid_attr *attr)
 {
+	struct ib_gid_attr_info *info =
+		container_of(attr, struct ib_gid_attr_info, attr);
 	struct ib_gid_table_entry *entry =
-			container_of(attr, struct ib_gid_table_entry, attr);
-	struct ib_device *device = entry->attr.device;
+			container_of(info, struct ib_gid_table_entry,
+				     attr_info);
+	struct ib_device *device = entry->attr_info.attr.device;
 	struct net_device *ndev = ERR_PTR(-ENODEV);
-	u8 port_num = entry->attr.port_num;
+	u8 port_num = entry->attr_info.attr.port_num;
 	struct ib_gid_table *table;
 	unsigned long flags;
 	bool valid;
diff --git a/include/rdma/ib_verbs.h b/include/rdma/ib_verbs.h
index 9d8d7fd..272b8f8 100644
--- a/include/rdma/ib_verbs.h
+++ b/include/rdma/ib_verbs.h
@@ -174,6 +174,11 @@ struct ib_gid_attr {
 	u8			port_num;
 };
 
+struct ib_gid_attr_info {
+	struct ib_gid_attr		attr;
+	void				*context;
+};
+
 enum {
 	/* set the local administered indication */
 	IB_SA_WELL_KNOWN_GUID	= BIT_ULL(57) | 2,
-- 
2.5.5


^ permalink raw reply related	[flat|nested] 5+ messages in thread

* [PATCH for-next 2/2] RDMA/bnxt_re: Retrieve the driver gid context from gid_attr
  2019-12-12 10:22 [PATCH for-next 0/2] Retrieve HW GID context from ib_gid_attr Selvin Xavier
  2019-12-12 10:22 ` [PATCH for-next 1/2] IB/core: Add option to retrieve driver gid " Selvin Xavier
@ 2019-12-12 10:22 ` Selvin Xavier
  2019-12-13 23:21   ` Parav Pandit
  1 sibling, 1 reply; 5+ messages in thread
From: Selvin Xavier @ 2019-12-12 10:22 UTC (permalink / raw)
  To: dledford, jgg; +Cc: linux-rdma, Selvin Xavier, Devesh Sharma

Use the container_of macro to retrieve the driver gid
context.

Signed-off-by: Devesh Sharma <devesh.sharma@broadcom.com>
Signed-off-by: Selvin Xavier <selvin.xavier@broadcom.com>
---
 drivers/infiniband/hw/bnxt_re/ib_verbs.c | 28 +++++++++++++++-------------
 1 file changed, 15 insertions(+), 13 deletions(-)

diff --git a/drivers/infiniband/hw/bnxt_re/ib_verbs.c b/drivers/infiniband/hw/bnxt_re/ib_verbs.c
index ad5112a..bd657fb 100644
--- a/drivers/infiniband/hw/bnxt_re/ib_verbs.c
+++ b/drivers/infiniband/hw/bnxt_re/ib_verbs.c
@@ -640,6 +640,8 @@ int bnxt_re_create_ah(struct ib_ah *ib_ah, struct rdma_ah_attr *ah_attr,
 	struct bnxt_re_dev *rdev = pd->rdev;
 	const struct ib_gid_attr *sgid_attr;
 	struct bnxt_re_ah *ah = container_of(ib_ah, struct bnxt_re_ah, ib_ah);
+	struct ib_gid_attr_info *info;
+	struct bnxt_re_gid_ctx *ctx = NULL;
 	u8 nw_type;
 	int rc;
 
@@ -651,22 +653,21 @@ int bnxt_re_create_ah(struct ib_ah *ib_ah, struct rdma_ah_attr *ah_attr,
 	ah->rdev = rdev;
 	ah->qplib_ah.pd = &pd->qplib_pd;
 
+	sgid_attr = grh->sgid_attr;
+
+	info = container_of(sgid_attr, struct ib_gid_attr_info, attr);
+	ctx = info->context;
+
 	/* Supply the configuration for the HW */
 	memcpy(ah->qplib_ah.dgid.data, grh->dgid.raw,
 	       sizeof(union ib_gid));
-	/*
-	 * If RoCE V2 is enabled, stack will have two entries for
-	 * each GID entry. Avoiding this duplicte entry in HW. Dividing
-	 * the GID index by 2 for RoCE V2
-	 */
-	ah->qplib_ah.sgid_index = grh->sgid_index / 2;
+	ah->qplib_ah.sgid_index = ctx->idx;
 	ah->qplib_ah.host_sgid_index = grh->sgid_index;
 	ah->qplib_ah.traffic_class = grh->traffic_class;
 	ah->qplib_ah.flow_label = grh->flow_label;
 	ah->qplib_ah.hop_limit = grh->hop_limit;
 	ah->qplib_ah.sl = rdma_ah_get_sl(ah_attr);
 
-	sgid_attr = grh->sgid_attr;
 	/* Get network header type for this GID */
 	nw_type = rdma_gid_attr_network_type(sgid_attr);
 	ah->qplib_ah.nw_type = bnxt_re_stack_to_dev_nw_type(nw_type);
@@ -1521,6 +1522,8 @@ int bnxt_re_modify_qp(struct ib_qp *ib_qp, struct ib_qp_attr *qp_attr,
 	struct bnxt_re_dev *rdev = qp->rdev;
 	struct bnxt_qplib_dev_attr *dev_attr = &rdev->dev_attr;
 	enum ib_qp_state curr_qp_state, new_qp_state;
+	struct ib_gid_attr_info *info;
+	struct bnxt_re_gid_ctx *ctx = NULL;
 	int rc, entries;
 	unsigned int flags;
 	u8 nw_type;
@@ -1592,6 +1595,10 @@ int bnxt_re_modify_qp(struct ib_qp *ib_qp, struct ib_qp_attr *qp_attr,
 			rdma_ah_read_grh(&qp_attr->ah_attr);
 		const struct ib_gid_attr *sgid_attr;
 
+		sgid_attr = qp_attr->ah_attr.grh.sgid_attr;
+		info = container_of(sgid_attr, struct ib_gid_attr_info, attr);
+		ctx = info->context;
+
 		qp->qplib_qp.modify_flags |= CMDQ_MODIFY_QP_MODIFY_MASK_DGID |
 				     CMDQ_MODIFY_QP_MODIFY_MASK_FLOW_LABEL |
 				     CMDQ_MODIFY_QP_MODIFY_MASK_SGID_INDEX |
@@ -1602,11 +1609,7 @@ int bnxt_re_modify_qp(struct ib_qp *ib_qp, struct ib_qp_attr *qp_attr,
 		memcpy(qp->qplib_qp.ah.dgid.data, grh->dgid.raw,
 		       sizeof(qp->qplib_qp.ah.dgid.data));
 		qp->qplib_qp.ah.flow_label = grh->flow_label;
-		/* If RoCE V2 is enabled, stack will have two entries for
-		 * each GID entry. Avoiding this duplicte entry in HW. Dividing
-		 * the GID index by 2 for RoCE V2
-		 */
-		qp->qplib_qp.ah.sgid_index = grh->sgid_index / 2;
+		qp->qplib_qp.ah.sgid_index = ctx->idx;
 		qp->qplib_qp.ah.host_sgid_index = grh->sgid_index;
 		qp->qplib_qp.ah.hop_limit = grh->hop_limit;
 		qp->qplib_qp.ah.traffic_class = grh->traffic_class;
@@ -1614,7 +1617,6 @@ int bnxt_re_modify_qp(struct ib_qp *ib_qp, struct ib_qp_attr *qp_attr,
 		ether_addr_copy(qp->qplib_qp.ah.dmac,
 				qp_attr->ah_attr.roce.dmac);
 
-		sgid_attr = qp_attr->ah_attr.grh.sgid_attr;
 		rc = rdma_read_gid_l2_fields(sgid_attr, NULL,
 					     &qp->qplib_qp.smac[0]);
 		if (rc)
-- 
2.5.5


^ permalink raw reply related	[flat|nested] 5+ messages in thread

* Re: [PATCH for-next 1/2] IB/core: Add option to retrieve driver gid context from ib_gid_attr
  2019-12-12 10:22 ` [PATCH for-next 1/2] IB/core: Add option to retrieve driver gid " Selvin Xavier
@ 2019-12-13 23:17   ` Parav Pandit
  0 siblings, 0 replies; 5+ messages in thread
From: Parav Pandit @ 2019-12-13 23:17 UTC (permalink / raw)
  To: Selvin Xavier, dledford, jgg; +Cc: linux-rdma, Devesh Sharma

On 12/12/2019 3:52 PM, Selvin Xavier wrote:
> Provide an option to retrieve the driver gid context from ib_gid_attr
> structure. Introduce ib_gid_attr_info structure which include both
> gid_attr and the GID's HW context. Replace the attr and context
> members of ib_gid_table_entry with the new ib_gid_attr_info
> structure. Vendor drivers can refer to its own HW gid context
> using the container_of macro.
> 
> Suggested-by: Jason Gunthorpe <jgg@mellanox.com>
> Signed-off-by: Devesh Sharma <devesh.sharma@broadcom.com>
> Signed-off-by: Selvin Xavier <selvin.xavier@broadcom.com>
> ---
>  drivers/infiniband/core/cache.c | 79 +++++++++++++++++++++++------------------
>  include/rdma/ib_verbs.h         |  5 +++
>  2 files changed, 50 insertions(+), 34 deletions(-)
> 
> diff --git a/drivers/infiniband/core/cache.c b/drivers/infiniband/core/cache.c
> index d535995..54ed25d 100644
> --- a/drivers/infiniband/core/cache.c
> +++ b/drivers/infiniband/core/cache.c
> @@ -86,8 +86,7 @@ struct roce_gid_ndev_storage {
>  struct ib_gid_table_entry {
>  	struct kref			kref;
>  	struct work_struct		del_work;
> -	struct ib_gid_attr		attr;
> -	void				*context;
> +	struct ib_gid_attr_info		attr_info;
>  	/* Store the ndev pointer to release reference later on in
>  	 * call_rcu context because by that time gid_table_entry
>  	 * and attr might be already freed. So keep a copy of it.
> @@ -233,12 +232,13 @@ static void put_gid_ndev(struct rcu_head *head)
>  
>  static void free_gid_entry_locked(struct ib_gid_table_entry *entry)
>  {
> -	struct ib_device *device = entry->attr.device;
> -	u8 port_num = entry->attr.port_num;
> +	struct ib_device *device = entry->attr_info.attr.device;
> +	u8 port_num = entry->attr_info.attr.port_num;
>  	struct ib_gid_table *table = rdma_gid_table(device, port_num);
>  
>  	dev_dbg(&device->dev, "%s port=%d index=%d gid %pI6\n", __func__,
> -		port_num, entry->attr.index, entry->attr.gid.raw);
> +		port_num, entry->attr_info.attr.index,
> +		entry->attr_info.attr.gid.raw);
>  
>  	write_lock_irq(&table->rwlock);
>  
> @@ -248,8 +248,8 @@ static void free_gid_entry_locked(struct ib_gid_table_entry *entry)
>  	 * If new entry in table is added by the time we free here,
>  	 * don't overwrite the table entry.
>  	 */
> -	if (entry == table->data_vec[entry->attr.index])
> -		table->data_vec[entry->attr.index] = NULL;
> +	if (entry == table->data_vec[entry->attr_info.attr.index])
> +		table->data_vec[entry->attr_info.attr.index] = NULL;
>  	/* Now this index is ready to be allocated */
>  	write_unlock_irq(&table->rwlock);
>  
> @@ -278,8 +278,8 @@ static void free_gid_work(struct work_struct *work)
>  {
>  	struct ib_gid_table_entry *entry =
>  		container_of(work, struct ib_gid_table_entry, del_work);
> -	struct ib_device *device = entry->attr.device;
> -	u8 port_num = entry->attr.port_num;
> +	struct ib_device *device = entry->attr_info.attr.device;
> +	u8 port_num = entry->attr_info.attr.port_num;
>  	struct ib_gid_table *table = rdma_gid_table(device, port_num);
>  
>  	mutex_lock(&table->lock);
> @@ -309,7 +309,7 @@ alloc_gid_entry(const struct ib_gid_attr *attr)
>  		entry->ndev_storage->ndev = ndev;
>  	}
>  	kref_init(&entry->kref);
> -	memcpy(&entry->attr, attr, sizeof(*attr));
> +	memcpy(&entry->attr_info.attr, attr, sizeof(*attr));
>  	INIT_WORK(&entry->del_work, free_gid_work);
>  	entry->state = GID_TABLE_ENTRY_INVALID;
>  	return entry;
> @@ -320,13 +320,15 @@ static void store_gid_entry(struct ib_gid_table *table,
>  {
>  	entry->state = GID_TABLE_ENTRY_VALID;
>  
> -	dev_dbg(&entry->attr.device->dev, "%s port=%d index=%d gid %pI6\n",
> -		__func__, entry->attr.port_num, entry->attr.index,
> -		entry->attr.gid.raw);
> +	dev_dbg(&entry->attr_info.attr.device->dev,
> +		"%s port=%d index=%d gid %pI6\n",
> +		__func__, entry->attr_info.attr.port_num,
> +		entry->attr_info.attr.index,
> +		entry->attr_info.attr.gid.raw);
>  
>  	lockdep_assert_held(&table->lock);
>  	write_lock_irq(&table->rwlock);
> -	table->data_vec[entry->attr.index] = entry;
> +	table->data_vec[entry->attr_info.attr.index] = entry;
>  	write_unlock_irq(&table->rwlock);
>  }
>  
> @@ -347,7 +349,7 @@ static void put_gid_entry_locked(struct ib_gid_table_entry *entry)
>  
>  static int add_roce_gid(struct ib_gid_table_entry *entry)
>  {
> -	const struct ib_gid_attr *attr = &entry->attr;
> +	const struct ib_gid_attr *attr = &entry->attr_info.attr;
>  	int ret;
>  
>  	if (!attr->ndev) {
> @@ -356,7 +358,8 @@ static int add_roce_gid(struct ib_gid_table_entry *entry)
>  		return -EINVAL;
>  	}
>  	if (rdma_cap_roce_gid_table(attr->device, attr->port_num)) {
> -		ret = attr->device->ops.add_gid(attr, &entry->context);
> +		ret = attr->device->ops.add_gid(attr,
> +						&entry->attr_info.context);
>  		if (ret) {
>  			dev_err(&attr->device->dev,
>  				"%s GID add failed port=%d index=%d\n",
> @@ -385,7 +388,7 @@ static void del_gid(struct ib_device *ib_dev, u8 port,
>  	lockdep_assert_held(&table->lock);
>  
>  	dev_dbg(&ib_dev->dev, "%s port=%d index=%d gid %pI6\n", __func__, port,
> -		ix, table->data_vec[ix]->attr.gid.raw);
> +		ix, table->data_vec[ix]->attr_info.attr.gid.raw);
>  
>  	write_lock_irq(&table->rwlock);
>  	entry = table->data_vec[ix];
> @@ -400,12 +403,13 @@ static void del_gid(struct ib_device *ib_dev, u8 port,
>  	ndev_storage = entry->ndev_storage;
>  	if (ndev_storage) {
>  		entry->ndev_storage = NULL;
> -		rcu_assign_pointer(entry->attr.ndev, NULL);
> +		rcu_assign_pointer(entry->attr_info.attr.ndev, NULL);
>  		call_rcu(&ndev_storage->rcu_head, put_gid_ndev);
>  	}
>  
>  	if (rdma_cap_roce_gid_table(ib_dev, port))
> -		ib_dev->ops.del_gid(&entry->attr, &entry->context);
> +		ib_dev->ops.del_gid(&entry->attr_info.attr,
> +				    &entry->attr_info.context);
>  
>  	put_gid_entry_locked(entry);
>  }
> @@ -508,13 +512,13 @@ static int find_gid(struct ib_gid_table *table, const union ib_gid *gid,
>  		if (found >= 0)
>  			continue;
>  
> -		attr = &data->attr;
> +		attr = &data->attr_info.attr;
>  		if (mask & GID_ATTR_FIND_MASK_GID_TYPE &&
>  		    attr->gid_type != val->gid_type)
>  			continue;
>  
>  		if (mask & GID_ATTR_FIND_MASK_GID &&
> -		    memcmp(gid, &data->attr.gid, sizeof(*gid)))
> +		    memcmp(gid, &data->attr_info.attr.gid, sizeof(*gid)))
>  			continue;
>  
>  		if (mask & GID_ATTR_FIND_MASK_NETDEV &&
> @@ -648,7 +652,7 @@ int ib_cache_gid_del_all_netdev_gids(struct ib_device *ib_dev, u8 port,
>  
>  	for (ix = 0; ix < table->sz; ix++) {
>  		if (is_gid_entry_valid(table->data_vec[ix]) &&
> -		    table->data_vec[ix]->attr.ndev == ndev) {
> +		    table->data_vec[ix]->attr_info.attr.ndev == ndev) {
>  			del_gid(ib_dev, port, table, ix);
>  			deleted = true;
>  		}
> @@ -703,7 +707,7 @@ rdma_find_gid_by_port(struct ib_device *ib_dev,
>  	local_index = find_gid(table, gid, &val, false, mask, NULL);
>  	if (local_index >= 0) {
>  		get_gid_entry(table->data_vec[local_index]);
> -		attr = &table->data_vec[local_index]->attr;
> +		attr = &table->data_vec[local_index]->attr_info.attr;
>  		read_unlock_irqrestore(&table->rwlock, flags);
>  		return attr;
>  	}
> @@ -753,12 +757,12 @@ const struct ib_gid_attr *rdma_find_gid_by_filter(
>  		if (!is_gid_entry_valid(entry))
>  			continue;
>  
> -		if (memcmp(gid, &entry->attr.gid, sizeof(*gid)))
> +		if (memcmp(gid, &entry->attr_info.attr.gid, sizeof(*gid)))
>  			continue;
>  
> -		if (filter(gid, &entry->attr, context)) {
> +		if (filter(gid, &entry->attr_info.attr, context)) {
>  			get_gid_entry(entry);
> -			res = &entry->attr;
> +			res = &entry->attr_info.attr;
>  			break;
>  		}
>  	}
> @@ -964,7 +968,7 @@ int rdma_query_gid(struct ib_device *device, u8 port_num,
>  	    !is_gid_entry_valid(table->data_vec[index]))
>  		goto done;
>  
> -	memcpy(gid, &table->data_vec[index]->attr.gid, sizeof(*gid));
> +	memcpy(gid, &table->data_vec[index]->attr_info.attr.gid, sizeof(*gid));
>  	res = 0;
>  
>  done:
> @@ -1011,7 +1015,7 @@ const struct ib_gid_attr *rdma_find_gid(struct ib_device *device,
>  			const struct ib_gid_attr *attr;
>  
>  			get_gid_entry(table->data_vec[index]);
> -			attr = &table->data_vec[index]->attr;
> +			attr = &table->data_vec[index]->attr_info.attr;
>  			read_unlock_irqrestore(&table->rwlock, flags);
>  			return attr;
>  		}
> @@ -1210,7 +1214,7 @@ rdma_get_gid_attr(struct ib_device *device, u8 port_num, int index)
>  		goto done;
>  
>  	get_gid_entry(table->data_vec[index]);
> -	attr = &table->data_vec[index]->attr;
> +	attr = &table->data_vec[index]->attr_info.attr;
>  done:
>  	read_unlock_irqrestore(&table->rwlock, flags);
>  	return attr;
> @@ -1230,8 +1234,10 @@ EXPORT_SYMBOL(rdma_get_gid_attr);
>   */
>  void rdma_put_gid_attr(const struct ib_gid_attr *attr)
>  {
> +	struct ib_gid_attr_info *info =
> +		container_of(attr, struct ib_gid_attr_info, attr);
>  	struct ib_gid_table_entry *entry =
> -		container_of(attr, struct ib_gid_table_entry, attr);
> +		container_of(info, struct ib_gid_table_entry, attr_info);
>  
>  	put_gid_entry(entry);
>  }
> @@ -1249,8 +1255,10 @@ EXPORT_SYMBOL(rdma_put_gid_attr);
>   */
>  void rdma_hold_gid_attr(const struct ib_gid_attr *attr)
>  {
> +	struct ib_gid_attr_info *info =
> +		container_of(attr, struct ib_gid_attr_info, attr);
>  	struct ib_gid_table_entry *entry =
> -		container_of(attr, struct ib_gid_table_entry, attr);
> +		container_of(info, struct ib_gid_table_entry, attr_info);
>  
>  	get_gid_entry(entry);
>  }
> @@ -1270,11 +1278,14 @@ EXPORT_SYMBOL(rdma_hold_gid_attr);
>   */
>  struct net_device *rdma_read_gid_attr_ndev_rcu(const struct ib_gid_attr *attr)
>  {
> +	struct ib_gid_attr_info *info =
> +		container_of(attr, struct ib_gid_attr_info, attr);
>  	struct ib_gid_table_entry *entry =
> -			container_of(attr, struct ib_gid_table_entry, attr);
> -	struct ib_device *device = entry->attr.device;
> +			container_of(info, struct ib_gid_table_entry,
> +				     attr_info);
> +	struct ib_device *device = entry->attr_info.attr.device;
>  	struct net_device *ndev = ERR_PTR(-ENODEV);
> -	u8 port_num = entry->attr.port_num;
> +	u8 port_num = entry->attr_info.attr.port_num;
>  	struct ib_gid_table *table;
>  	unsigned long flags;
>  	bool valid;
> diff --git a/include/rdma/ib_verbs.h b/include/rdma/ib_verbs.h
> index 9d8d7fd..272b8f8 100644
> --- a/include/rdma/ib_verbs.h
> +++ b/include/rdma/ib_verbs.h
> @@ -174,6 +174,11 @@ struct ib_gid_attr {
>  	u8			port_num;
>  };
>  
> +struct ib_gid_attr_info {
> +	struct ib_gid_attr		attr;
> +	void				*context;
No need for tabs in newsly added struct.
	struct ib_gid_attr attr;
..
is fine.

> +};
> +
>  enum {
>  	/* set the local administered indication */
>  	IB_SA_WELL_KNOWN_GUID	= BIT_ULL(57) | 2,
> 
With above nit change.
Reviewed-by: Parav Pandit <parav@mellanox.com>

^ permalink raw reply	[flat|nested] 5+ messages in thread

* Re: [PATCH for-next 2/2] RDMA/bnxt_re: Retrieve the driver gid context from gid_attr
  2019-12-12 10:22 ` [PATCH for-next 2/2] RDMA/bnxt_re: Retrieve the driver gid context from gid_attr Selvin Xavier
@ 2019-12-13 23:21   ` Parav Pandit
  0 siblings, 0 replies; 5+ messages in thread
From: Parav Pandit @ 2019-12-13 23:21 UTC (permalink / raw)
  To: Selvin Xavier, dledford, jgg; +Cc: linux-rdma, Devesh Sharma

On 12/12/2019 3:52 PM, Selvin Xavier wrote:
> Use the container_of macro to retrieve the driver gid
> context.
> 
> Signed-off-by: Devesh Sharma <devesh.sharma@broadcom.com>
> Signed-off-by: Selvin Xavier <selvin.xavier@broadcom.com>
> ---
>  drivers/infiniband/hw/bnxt_re/ib_verbs.c | 28 +++++++++++++++-------------
>  1 file changed, 15 insertions(+), 13 deletions(-)
> 
> diff --git a/drivers/infiniband/hw/bnxt_re/ib_verbs.c b/drivers/infiniband/hw/bnxt_re/ib_verbs.c
> index ad5112a..bd657fb 100644
> --- a/drivers/infiniband/hw/bnxt_re/ib_verbs.c
> +++ b/drivers/infiniband/hw/bnxt_re/ib_verbs.c
> @@ -640,6 +640,8 @@ int bnxt_re_create_ah(struct ib_ah *ib_ah, struct rdma_ah_attr *ah_attr,
>  	struct bnxt_re_dev *rdev = pd->rdev;
>  	const struct ib_gid_attr *sgid_attr;
>  	struct bnxt_re_ah *ah = container_of(ib_ah, struct bnxt_re_ah, ib_ah);
> +	struct ib_gid_attr_info *info;
> +	struct bnxt_re_gid_ctx *ctx = NULL;
ctx is alwyas asigned without any condition from info.
So no need for null initialzation.

>  	u8 nw_type;
>  	int rc;
>  
> @@ -651,22 +653,21 @@ int bnxt_re_create_ah(struct ib_ah *ib_ah, struct rdma_ah_attr *ah_attr,
>  	ah->rdev = rdev;
>  	ah->qplib_ah.pd = &pd->qplib_pd;
>  
> +	sgid_attr = grh->sgid_attr;
> +
> +	info = container_of(sgid_attr, struct ib_gid_attr_info, attr);
> +	ctx = info->context;
> +
>  	/* Supply the configuration for the HW */
>  	memcpy(ah->qplib_ah.dgid.data, grh->dgid.raw,
>  	       sizeof(union ib_gid));
> -	/*
> -	 * If RoCE V2 is enabled, stack will have two entries for
> -	 * each GID entry. Avoiding this duplicte entry in HW. Dividing
> -	 * the GID index by 2 for RoCE V2
> -	 */
> -	ah->qplib_ah.sgid_index = grh->sgid_index / 2;
> +	ah->qplib_ah.sgid_index = ctx->idx;
>  	ah->qplib_ah.host_sgid_index = grh->sgid_index;
>  	ah->qplib_ah.traffic_class = grh->traffic_class;
>  	ah->qplib_ah.flow_label = grh->flow_label;
>  	ah->qplib_ah.hop_limit = grh->hop_limit;
>  	ah->qplib_ah.sl = rdma_ah_get_sl(ah_attr);
>  
> -	sgid_attr = grh->sgid_attr;
>  	/* Get network header type for this GID */
>  	nw_type = rdma_gid_attr_network_type(sgid_attr);
>  	ah->qplib_ah.nw_type = bnxt_re_stack_to_dev_nw_type(nw_type);
> @@ -1521,6 +1522,8 @@ int bnxt_re_modify_qp(struct ib_qp *ib_qp, struct ib_qp_attr *qp_attr,
>  	struct bnxt_re_dev *rdev = qp->rdev;
>  	struct bnxt_qplib_dev_attr *dev_attr = &rdev->dev_attr;
>  	enum ib_qp_state curr_qp_state, new_qp_state;
> +	struct ib_gid_attr_info *info;
> +	struct bnxt_re_gid_ctx *ctx = NULL;
>  	int rc, entries;
>  	unsigned int flags;
>  	u8 nw_type;
> @@ -1592,6 +1595,10 @@ int bnxt_re_modify_qp(struct ib_qp *ib_qp, struct ib_qp_attr *qp_attr,
>  			rdma_ah_read_grh(&qp_attr->ah_attr);
>  		const struct ib_gid_attr *sgid_attr;
>  
> +		sgid_attr = qp_attr->ah_attr.grh.sgid_attr;
> +		info = container_of(sgid_attr, struct ib_gid_attr_info, attr);
> +		ctx = info->context;
> +
>  		qp->qplib_qp.modify_flags |= CMDQ_MODIFY_QP_MODIFY_MASK_DGID |
>  				     CMDQ_MODIFY_QP_MODIFY_MASK_FLOW_LABEL |
>  				     CMDQ_MODIFY_QP_MODIFY_MASK_SGID_INDEX |
> @@ -1602,11 +1609,7 @@ int bnxt_re_modify_qp(struct ib_qp *ib_qp, struct ib_qp_attr *qp_attr,
>  		memcpy(qp->qplib_qp.ah.dgid.data, grh->dgid.raw,
>  		       sizeof(qp->qplib_qp.ah.dgid.data));
>  		qp->qplib_qp.ah.flow_label = grh->flow_label;
> -		/* If RoCE V2 is enabled, stack will have two entries for
> -		 * each GID entry. Avoiding this duplicte entry in HW. Dividing
> -		 * the GID index by 2 for RoCE V2
> -		 */
> -		qp->qplib_qp.ah.sgid_index = grh->sgid_index / 2;
> +		qp->qplib_qp.ah.sgid_index = ctx->idx;
>  		qp->qplib_qp.ah.host_sgid_index = grh->sgid_index;
>  		qp->qplib_qp.ah.hop_limit = grh->hop_limit;
>  		qp->qplib_qp.ah.traffic_class = grh->traffic_class;
> @@ -1614,7 +1617,6 @@ int bnxt_re_modify_qp(struct ib_qp *ib_qp, struct ib_qp_attr *qp_attr,
>  		ether_addr_copy(qp->qplib_qp.ah.dmac,
>  				qp_attr->ah_attr.roce.dmac);
>  
> -		sgid_attr = qp_attr->ah_attr.grh.sgid_attr;
>  		rc = rdma_read_gid_l2_fields(sgid_attr, NULL,
>  					     &qp->qplib_qp.smac[0]);
>  		if (rc)
> 


^ permalink raw reply	[flat|nested] 5+ messages in thread

end of thread, other threads:[~2019-12-13 23:21 UTC | newest]

Thread overview: 5+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2019-12-12 10:22 [PATCH for-next 0/2] Retrieve HW GID context from ib_gid_attr Selvin Xavier
2019-12-12 10:22 ` [PATCH for-next 1/2] IB/core: Add option to retrieve driver gid " Selvin Xavier
2019-12-13 23:17   ` Parav Pandit
2019-12-12 10:22 ` [PATCH for-next 2/2] RDMA/bnxt_re: Retrieve the driver gid context from gid_attr Selvin Xavier
2019-12-13 23:21   ` Parav Pandit

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).