* [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
* 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
* [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 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).