Skip to content

Commit 47ec386

Browse files
paravmellanoxjgunthorpe
authored andcommitted
RDMA: Convert drivers to use sgid_attr instead of sgid_index
The core code now ensures that all driver callbacks that receive an rdma_ah_attrs will have a sgid_attr's pointer if there is a GRH present. Drivers can use this pointer instead of calling a query function with sgid_index. This simplifies the drivers and also avoids races where a gid_index lookup may return different data if it is changed. Signed-off-by: Parav Pandit <parav@mellanox.com> Signed-off-by: Jason Gunthorpe <jgg@mellanox.com> Signed-off-by: Leon Romanovsky <leonro@mellanox.com>
1 parent d97099f commit 47ec386

File tree

16 files changed

+96
-237
lines changed

16 files changed

+96
-237
lines changed

drivers/infiniband/hw/bnxt_re/ib_verbs.c

Lines changed: 22 additions & 41 deletions
Original file line numberDiff line numberDiff line change
@@ -672,8 +672,6 @@ struct ib_ah *bnxt_re_create_ah(struct ib_pd *ib_pd,
672672
int rc;
673673
u8 nw_type;
674674

675-
struct ib_gid_attr sgid_attr;
676-
677675
if (!(rdma_ah_get_ah_flags(ah_attr) & IB_AH_GRH)) {
678676
dev_err(rdev_to_dev(rdev), "Failed to alloc AH: GRH not set");
679677
return ERR_PTR(-EINVAL);
@@ -704,20 +702,11 @@ struct ib_ah *bnxt_re_create_ah(struct ib_pd *ib_pd,
704702
grh->dgid.raw) &&
705703
!rdma_link_local_addr((struct in6_addr *)
706704
grh->dgid.raw)) {
707-
union ib_gid sgid;
705+
const struct ib_gid_attr *sgid_attr;
708706

709-
rc = ib_get_cached_gid(&rdev->ibdev, 1,
710-
grh->sgid_index, &sgid,
711-
&sgid_attr);
712-
if (rc) {
713-
dev_err(rdev_to_dev(rdev),
714-
"Failed to query gid at index %d",
715-
grh->sgid_index);
716-
goto fail;
717-
}
718-
dev_put(sgid_attr.ndev);
707+
sgid_attr = grh->sgid_attr;
719708
/* Get network header type for this GID */
720-
nw_type = ib_gid_to_network_type(sgid_attr.gid_type, &sgid);
709+
nw_type = rdma_gid_attr_network_type(sgid_attr);
721710
switch (nw_type) {
722711
case RDMA_NETWORK_IPV4:
723712
ah->qplib_ah.nw_type = CMDQ_CREATE_AH_TYPE_V2IPV4;
@@ -1598,9 +1587,6 @@ int bnxt_re_modify_qp(struct ib_qp *ib_qp, struct ib_qp_attr *qp_attr,
15981587
struct bnxt_qplib_dev_attr *dev_attr = &rdev->dev_attr;
15991588
enum ib_qp_state curr_qp_state, new_qp_state;
16001589
int rc, entries;
1601-
int status;
1602-
union ib_gid sgid;
1603-
struct ib_gid_attr sgid_attr;
16041590
unsigned int flags;
16051591
u8 nw_type;
16061592

@@ -1667,6 +1653,7 @@ int bnxt_re_modify_qp(struct ib_qp *ib_qp, struct ib_qp_attr *qp_attr,
16671653
if (qp_attr_mask & IB_QP_AV) {
16681654
const struct ib_global_route *grh =
16691655
rdma_ah_read_grh(&qp_attr->ah_attr);
1656+
const struct ib_gid_attr *sgid_attr;
16701657

16711658
qp->qplib_qp.modify_flags |= CMDQ_MODIFY_QP_MODIFY_MASK_DGID |
16721659
CMDQ_MODIFY_QP_MODIFY_MASK_FLOW_LABEL |
@@ -1690,29 +1677,23 @@ int bnxt_re_modify_qp(struct ib_qp *ib_qp, struct ib_qp_attr *qp_attr,
16901677
ether_addr_copy(qp->qplib_qp.ah.dmac,
16911678
qp_attr->ah_attr.roce.dmac);
16921679

1693-
status = ib_get_cached_gid(&rdev->ibdev, 1,
1694-
grh->sgid_index,
1695-
&sgid, &sgid_attr);
1696-
if (!status) {
1697-
memcpy(qp->qplib_qp.smac, sgid_attr.ndev->dev_addr,
1698-
ETH_ALEN);
1699-
dev_put(sgid_attr.ndev);
1700-
nw_type = ib_gid_to_network_type(sgid_attr.gid_type,
1701-
&sgid);
1702-
switch (nw_type) {
1703-
case RDMA_NETWORK_IPV4:
1704-
qp->qplib_qp.nw_type =
1705-
CMDQ_MODIFY_QP_NETWORK_TYPE_ROCEV2_IPV4;
1706-
break;
1707-
case RDMA_NETWORK_IPV6:
1708-
qp->qplib_qp.nw_type =
1709-
CMDQ_MODIFY_QP_NETWORK_TYPE_ROCEV2_IPV6;
1710-
break;
1711-
default:
1712-
qp->qplib_qp.nw_type =
1713-
CMDQ_MODIFY_QP_NETWORK_TYPE_ROCEV1;
1714-
break;
1715-
}
1680+
sgid_attr = qp_attr->ah_attr.grh.sgid_attr;
1681+
memcpy(qp->qplib_qp.smac, sgid_attr->ndev->dev_addr,
1682+
ETH_ALEN);
1683+
nw_type = rdma_gid_attr_network_type(sgid_attr);
1684+
switch (nw_type) {
1685+
case RDMA_NETWORK_IPV4:
1686+
qp->qplib_qp.nw_type =
1687+
CMDQ_MODIFY_QP_NETWORK_TYPE_ROCEV2_IPV4;
1688+
break;
1689+
case RDMA_NETWORK_IPV6:
1690+
qp->qplib_qp.nw_type =
1691+
CMDQ_MODIFY_QP_NETWORK_TYPE_ROCEV2_IPV6;
1692+
break;
1693+
default:
1694+
qp->qplib_qp.nw_type =
1695+
CMDQ_MODIFY_QP_NETWORK_TYPE_ROCEV1;
1696+
break;
17161697
}
17171698
}
17181699

@@ -1934,7 +1915,7 @@ static int bnxt_re_build_qp1_send_v2(struct bnxt_re_qp *qp,
19341915
dev_put(sgid_attr.ndev);
19351916
}
19361917
/* Get network header type for this GID */
1937-
nw_type = ib_gid_to_network_type(sgid_attr.gid_type, &sgid);
1918+
nw_type = rdma_gid_attr_network_type(&sgid_attr);
19381919
switch (nw_type) {
19391920
case RDMA_NETWORK_IPV4:
19401921
nw_type = BNXT_RE_ROCEV2_IPV4_PACKET;

drivers/infiniband/hw/hns/hns_roce_ah.c

Lines changed: 4 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -44,13 +44,11 @@ struct ib_ah *hns_roce_create_ah(struct ib_pd *ibpd,
4444
struct ib_udata *udata)
4545
{
4646
struct hns_roce_dev *hr_dev = to_hr_dev(ibpd->device);
47+
const struct ib_gid_attr *gid_attr;
4748
struct device *dev = hr_dev->dev;
48-
struct ib_gid_attr gid_attr;
4949
struct hns_roce_ah *ah;
5050
u16 vlan_tag = 0xffff;
5151
const struct ib_global_route *grh = rdma_ah_read_grh(ah_attr);
52-
union ib_gid sgid;
53-
int ret;
5452

5553
ah = kzalloc(sizeof(*ah), GFP_ATOMIC);
5654
if (!ah)
@@ -59,18 +57,9 @@ struct ib_ah *hns_roce_create_ah(struct ib_pd *ibpd,
5957
/* Get mac address */
6058
memcpy(ah->av.mac, ah_attr->roce.dmac, ETH_ALEN);
6159

62-
/* Get source gid */
63-
ret = ib_get_cached_gid(ibpd->device, rdma_ah_get_port_num(ah_attr),
64-
grh->sgid_index, &sgid, &gid_attr);
65-
if (ret) {
66-
dev_err(dev, "get sgid failed! ret = %d\n", ret);
67-
kfree(ah);
68-
return ERR_PTR(ret);
69-
}
70-
71-
if (is_vlan_dev(gid_attr.ndev))
72-
vlan_tag = vlan_dev_vlan_id(gid_attr.ndev);
73-
dev_put(gid_attr.ndev);
60+
gid_attr = ah_attr->grh.sgid_attr;
61+
if (is_vlan_dev(gid_attr->ndev))
62+
vlan_tag = vlan_dev_vlan_id(gid_attr->ndev);
7463

7564
if (vlan_tag < 0x1000)
7665
vlan_tag |= (rdma_ah_get_sl(ah_attr) &

drivers/infiniband/hw/mlx4/ah.c

Lines changed: 6 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -82,12 +82,11 @@ static struct ib_ah *create_iboe_ah(struct ib_pd *pd,
8282
struct mlx4_ib_ah *ah)
8383
{
8484
struct mlx4_ib_dev *ibdev = to_mdev(pd->device);
85+
const struct ib_gid_attr *gid_attr;
8586
struct mlx4_dev *dev = ibdev->dev;
8687
int is_mcast = 0;
8788
struct in6_addr in6;
8889
u16 vlan_tag = 0xffff;
89-
union ib_gid sgid;
90-
struct ib_gid_attr gid_attr;
9190
const struct ib_global_route *grh = rdma_ah_read_grh(ah_attr);
9291
int ret;
9392

@@ -96,15 +95,12 @@ static struct ib_ah *create_iboe_ah(struct ib_pd *pd,
9695
is_mcast = 1;
9796

9897
memcpy(ah->av.eth.mac, ah_attr->roce.dmac, ETH_ALEN);
99-
ret = ib_get_cached_gid(pd->device, rdma_ah_get_port_num(ah_attr),
100-
grh->sgid_index, &sgid, &gid_attr);
101-
if (ret)
102-
return ERR_PTR(ret);
10398
eth_zero_addr(ah->av.eth.s_mac);
104-
if (is_vlan_dev(gid_attr.ndev))
105-
vlan_tag = vlan_dev_vlan_id(gid_attr.ndev);
106-
memcpy(ah->av.eth.s_mac, gid_attr.ndev->dev_addr, ETH_ALEN);
107-
dev_put(gid_attr.ndev);
99+
gid_attr = ah_attr->grh.sgid_attr;
100+
if (is_vlan_dev(gid_attr->ndev))
101+
vlan_tag = vlan_dev_vlan_id(gid_attr->ndev);
102+
memcpy(ah->av.eth.s_mac, gid_attr->ndev->dev_addr, ETH_ALEN);
103+
108104
if (vlan_tag < 0x1000)
109105
vlan_tag |= (rdma_ah_get_sl(ah_attr) & 7) << 13;
110106
ah->av.eth.port_pd = cpu_to_be32(to_mpd(pd)->pdn |

drivers/infiniband/hw/mlx4/qp.c

Lines changed: 11 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -2176,6 +2176,7 @@ static int __mlx4_ib_modify_qp(void *src, enum mlx4_ib_source_type src_type,
21762176
{
21772177
struct ib_uobject *ibuobject;
21782178
struct ib_srq *ibsrq;
2179+
const struct ib_gid_attr *gid_attr = NULL;
21792180
struct ib_rwq_ind_table *rwq_ind_tbl;
21802181
enum ib_qp_type qp_type;
21812182
struct mlx4_ib_dev *dev;
@@ -2356,29 +2357,17 @@ static int __mlx4_ib_modify_qp(void *src, enum mlx4_ib_source_type src_type,
23562357
if (attr_mask & IB_QP_AV) {
23572358
u8 port_num = mlx4_is_bonded(dev->dev) ? 1 :
23582359
attr_mask & IB_QP_PORT ? attr->port_num : qp->port;
2359-
union ib_gid gid;
2360-
struct ib_gid_attr gid_attr = {.gid_type = IB_GID_TYPE_IB};
23612360
u16 vlan = 0xffff;
23622361
u8 smac[ETH_ALEN];
2363-
int status = 0;
23642362
int is_eth =
23652363
rdma_cap_eth_ah(&dev->ib_dev, port_num) &&
23662364
rdma_ah_get_ah_flags(&attr->ah_attr) & IB_AH_GRH;
23672365

23682366
if (is_eth) {
2369-
int index =
2370-
rdma_ah_read_grh(&attr->ah_attr)->sgid_index;
2371-
2372-
status = ib_get_cached_gid(&dev->ib_dev, port_num,
2373-
index, &gid, &gid_attr);
2374-
if (!status) {
2375-
vlan = rdma_vlan_dev_vlan_id(gid_attr.ndev);
2376-
memcpy(smac, gid_attr.ndev->dev_addr, ETH_ALEN);
2377-
dev_put(gid_attr.ndev);
2378-
}
2367+
gid_attr = attr->ah_attr.grh.sgid_attr;
2368+
vlan = rdma_vlan_dev_vlan_id(gid_attr->ndev);
2369+
memcpy(smac, gid_attr->ndev->dev_addr, ETH_ALEN);
23792370
}
2380-
if (status)
2381-
goto out;
23822371

23832372
if (mlx4_set_path(dev, attr, attr_mask, qp, &context->pri_path,
23842373
port_num, vlan, smac))
@@ -2389,7 +2378,7 @@ static int __mlx4_ib_modify_qp(void *src, enum mlx4_ib_source_type src_type,
23892378

23902379
if (is_eth &&
23912380
(cur_state == IB_QPS_INIT && new_state == IB_QPS_RTR)) {
2392-
u8 qpc_roce_mode = gid_type_to_qpc(gid_attr.gid_type);
2381+
u8 qpc_roce_mode = gid_type_to_qpc(gid_attr->gid_type);
23932382

23942383
if (qpc_roce_mode == MLX4_QPC_ROCE_MODE_UNDEFINED) {
23952384
err = -EINVAL;
@@ -3181,10 +3170,12 @@ static int build_mlx_header(struct mlx4_ib_sqp *sqp, struct ib_ud_wr *wr,
31813170
to_mdev(ib_dev)->sriov.demux[sqp->qp.port - 1].
31823171
guid_cache[ah->av.ib.gid_index];
31833172
} else {
3184-
ib_get_cached_gid(ib_dev,
3185-
be32_to_cpu(ah->av.ib.port_pd) >> 24,
3186-
ah->av.ib.gid_index,
3187-
&sqp->ud_header.grh.source_gid, NULL);
3173+
err = rdma_query_gid(ib_dev,
3174+
be32_to_cpu(ah->av.ib.port_pd) >> 24,
3175+
ah->av.ib.gid_index,
3176+
&sqp->ud_header.grh.source_gid);
3177+
if (err)
3178+
return err;
31883179
}
31893180
}
31903181
memcpy(sqp->ud_header.grh.destination_gid.raw,

drivers/infiniband/hw/mlx5/ah.c

Lines changed: 2 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,6 @@ static struct ib_ah *create_ib_ah(struct mlx5_ib_dev *dev,
3737
struct rdma_ah_attr *ah_attr)
3838
{
3939
enum ib_gid_type gid_type;
40-
int err;
4140

4241
if (rdma_ah_get_ah_flags(ah_attr) & IB_AH_GRH) {
4342
const struct ib_global_route *grh = rdma_ah_read_grh(ah_attr);
@@ -53,18 +52,12 @@ static struct ib_ah *create_ib_ah(struct mlx5_ib_dev *dev,
5352
ah->av.stat_rate_sl = (rdma_ah_get_static_rate(ah_attr) << 4);
5453

5554
if (ah_attr->type == RDMA_AH_ATTR_TYPE_ROCE) {
56-
err = mlx5_get_roce_gid_type(dev, ah_attr->port_num,
57-
ah_attr->grh.sgid_index,
58-
&gid_type);
59-
if (err)
60-
return ERR_PTR(err);
55+
gid_type = ah_attr->grh.sgid_attr->gid_type;
6156

6257
memcpy(ah->av.rmac, ah_attr->roce.dmac,
6358
sizeof(ah_attr->roce.dmac));
6459
ah->av.udp_sport =
65-
mlx5_get_roce_udp_sport(dev,
66-
rdma_ah_get_port_num(ah_attr),
67-
rdma_ah_read_grh(ah_attr)->sgid_index);
60+
mlx5_get_roce_udp_sport(dev, ah_attr->grh.sgid_attr);
6861
ah->av.stat_rate_sl |= (rdma_ah_get_sl(ah_attr) & 0x7) << 1;
6962
if (gid_type == IB_GID_TYPE_ROCE_UDP_ENCAP)
7063
#define MLX5_ECN_ENABLED BIT(1)

drivers/infiniband/hw/mlx5/main.c

Lines changed: 3 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -524,41 +524,15 @@ static int mlx5_ib_del_gid(const struct ib_gid_attr *attr,
524524
attr->index, NULL, NULL);
525525
}
526526

527-
__be16 mlx5_get_roce_udp_sport(struct mlx5_ib_dev *dev, u8 port_num,
528-
int index)
527+
__be16 mlx5_get_roce_udp_sport(struct mlx5_ib_dev *dev,
528+
const struct ib_gid_attr *attr)
529529
{
530-
struct ib_gid_attr attr;
531-
union ib_gid gid;
532-
533-
if (ib_get_cached_gid(&dev->ib_dev, port_num, index, &gid, &attr))
534-
return 0;
535-
536-
dev_put(attr.ndev);
537-
538-
if (attr.gid_type != IB_GID_TYPE_ROCE_UDP_ENCAP)
530+
if (attr->gid_type != IB_GID_TYPE_ROCE_UDP_ENCAP)
539531
return 0;
540532

541533
return cpu_to_be16(MLX5_CAP_ROCE(dev->mdev, r_roce_min_src_udp_port));
542534
}
543535

544-
int mlx5_get_roce_gid_type(struct mlx5_ib_dev *dev, u8 port_num,
545-
int index, enum ib_gid_type *gid_type)
546-
{
547-
struct ib_gid_attr attr;
548-
union ib_gid gid;
549-
int ret;
550-
551-
ret = ib_get_cached_gid(&dev->ib_dev, port_num, index, &gid, &attr);
552-
if (ret)
553-
return ret;
554-
555-
dev_put(attr.ndev);
556-
557-
*gid_type = attr.gid_type;
558-
559-
return 0;
560-
}
561-
562536
static int mlx5_use_mad_ifc(struct mlx5_ib_dev *dev)
563537
{
564538
if (MLX5_CAP_GEN(dev->mdev, port_type) == MLX5_CAP_PORT_TYPE_IB)

drivers/infiniband/hw/mlx5/mlx5_ib.h

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1183,10 +1183,8 @@ int mlx5_ib_get_vf_stats(struct ib_device *device, int vf,
11831183
int mlx5_ib_set_vf_guid(struct ib_device *device, int vf, u8 port,
11841184
u64 guid, int type);
11851185

1186-
__be16 mlx5_get_roce_udp_sport(struct mlx5_ib_dev *dev, u8 port_num,
1187-
int index);
1188-
int mlx5_get_roce_gid_type(struct mlx5_ib_dev *dev, u8 port_num,
1189-
int index, enum ib_gid_type *gid_type);
1186+
__be16 mlx5_get_roce_udp_sport(struct mlx5_ib_dev *dev,
1187+
const struct ib_gid_attr *attr);
11901188

11911189
void mlx5_ib_cleanup_cong_debugfs(struct mlx5_ib_dev *dev, u8 port_num);
11921190
int mlx5_ib_init_cong_debugfs(struct mlx5_ib_dev *dev, u8 port_num);

drivers/infiniband/hw/mlx5/qp.c

Lines changed: 4 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -2555,18 +2555,16 @@ static int mlx5_set_path(struct mlx5_ib_dev *dev, struct mlx5_ib_qp *qp,
25552555
if (ah->type == RDMA_AH_ATTR_TYPE_ROCE) {
25562556
if (!(ah_flags & IB_AH_GRH))
25572557
return -EINVAL;
2558-
err = mlx5_get_roce_gid_type(dev, port, grh->sgid_index,
2559-
&gid_type);
2560-
if (err)
2561-
return err;
2558+
25622559
memcpy(path->rmac, ah->roce.dmac, sizeof(ah->roce.dmac));
25632560
if (qp->ibqp.qp_type == IB_QPT_RC ||
25642561
qp->ibqp.qp_type == IB_QPT_UC ||
25652562
qp->ibqp.qp_type == IB_QPT_XRC_INI ||
25662563
qp->ibqp.qp_type == IB_QPT_XRC_TGT)
2567-
path->udp_sport = mlx5_get_roce_udp_sport(dev, port,
2568-
grh->sgid_index);
2564+
path->udp_sport =
2565+
mlx5_get_roce_udp_sport(dev, ah->grh.sgid_attr);
25692566
path->dci_cfi_prio_sl = (sl & 0x7) << 4;
2567+
gid_type = ah->grh.sgid_attr->gid_type;
25702568
if (gid_type == IB_GID_TYPE_ROCE_UDP_ENCAP)
25712569
path->ecn_dscp = (grh->traffic_class >> 2) & 0x3f;
25722570
} else {

0 commit comments

Comments
 (0)