> From: Jason Gunthorpe [mailto:jgg@xxxxxxxx] > Sent: Monday, June 18, 2018 8:20 PM > > On Wed, Jun 13, 2018 at 10:22:06AM +0300, Leon Romanovsky wrote: > > From: Parav Pandit <parav@xxxxxxxxxxxx> > > > > 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@xxxxxxxxxxxx> > > Signed-off-by: Jason Gunthorpe <jgg@xxxxxxxxxxxx> > > Signed-off-by: Leon Romanovsky <leonro@xxxxxxxxxxxx> > > --- > > drivers/infiniband/hw/bnxt_re/ib_verbs.c | 63 > > +++++++++++--------------------- drivers/infiniband/hw/hns/hns_roce_ah.c > | 19 ++-------- > > drivers/infiniband/hw/mlx4/ah.c | 16 +++----- > > drivers/infiniband/hw/mlx4/qp.c | 31 ++++++---------- > > drivers/infiniband/hw/mlx5/ah.c | 11 +----- > > drivers/infiniband/hw/mlx5/main.c | 32 ++-------------- > > drivers/infiniband/hw/mlx5/mlx5_ib.h | 6 +-- > > drivers/infiniband/hw/mlx5/qp.c | 10 ++--- > > drivers/infiniband/hw/ocrdma/ocrdma_ah.c | 24 +++++------- > > drivers/infiniband/hw/ocrdma/ocrdma_hw.c | 21 +++++------ > > drivers/infiniband/hw/qedr/verbs.c | 22 ++++------- > > drivers/infiniband/sw/rxe/rxe_av.c | 11 +++--- > > drivers/infiniband/sw/rxe/rxe_loc.h | 5 +-- > > drivers/infiniband/sw/rxe/rxe_qp.c | 23 +----------- > > drivers/infiniband/sw/rxe/rxe_verbs.c | 31 +++------------- > > include/rdma/ib_verbs.h | 8 ++-- > > 16 files changed, 96 insertions(+), 237 deletions(-) > > Leon, don't forget to CC the maintainers when touching drivers.. > > RDMA Driver authors: 4.19 is looking like it is going to have alot of changes to > the core APIs and other things. It is a good idea to be sure you test your > drivers and keep track of what is changing this cycle so we can have a strong > release. > > I'm going to apply this series since the changes are relatively straightforward. > If something breaks please send a fixing patch. Thanks for the heads up! Can you elaborate a bit more of what changes we should expect this cycle? Are they already pending on some other public repo which we can take a look at? Perhaps for core API changes a more detailed description of what was tested to cover the changes could help us to focus on what to test in our validation labs in addition to regular regressions. Thanks, > > > diff --git a/drivers/infiniband/hw/bnxt_re/ib_verbs.c > > b/drivers/infiniband/hw/bnxt_re/ib_verbs.c > > index 62eb9e3346d5..134360236c2c 100644 > > --- a/drivers/infiniband/hw/bnxt_re/ib_verbs.c > > +++ b/drivers/infiniband/hw/bnxt_re/ib_verbs.c > > @@ -672,8 +672,6 @@ struct ib_ah *bnxt_re_create_ah(struct ib_pd > *ib_pd, > > int rc; > > u8 nw_type; > > > > - struct ib_gid_attr sgid_attr; > > - > > if (!(rdma_ah_get_ah_flags(ah_attr) & IB_AH_GRH)) { > > dev_err(rdev_to_dev(rdev), "Failed to alloc AH: GRH not set"); > > return ERR_PTR(-EINVAL); @@ -704,20 +702,11 @@ struct > > ib_ah *bnxt_re_create_ah(struct ib_pd *ib_pd, > > grh->dgid.raw) && > > !rdma_link_local_addr((struct in6_addr *) > > grh->dgid.raw)) { > > - union ib_gid sgid; > > + const struct ib_gid_attr *sgid_attr; > > > > - rc = ib_get_cached_gid(&rdev->ibdev, 1, > > - grh->sgid_index, &sgid, > > - &sgid_attr); > > - if (rc) { > > - dev_err(rdev_to_dev(rdev), > > - "Failed to query gid at index %d", > > - grh->sgid_index); > > - goto fail; > > - } > > - dev_put(sgid_attr.ndev); > > + sgid_attr = grh->sgid_attr; > > /* Get network header type for this GID */ > > - nw_type = ib_gid_to_network_type(sgid_attr.gid_type, &sgid); > > + nw_type = rdma_gid_attr_network_type(sgid_attr); > > switch (nw_type) { > > case RDMA_NETWORK_IPV4: > > 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, > > struct bnxt_qplib_dev_attr *dev_attr = &rdev->dev_attr; > > enum ib_qp_state curr_qp_state, new_qp_state; > > int rc, entries; > > - int status; > > - union ib_gid sgid; > > - struct ib_gid_attr sgid_attr; > > unsigned int flags; > > u8 nw_type; > > > > @@ -1667,6 +1653,7 @@ int bnxt_re_modify_qp(struct ib_qp *ib_qp, > struct ib_qp_attr *qp_attr, > > if (qp_attr_mask & IB_QP_AV) { > > const struct ib_global_route *grh = > > rdma_ah_read_grh(&qp_attr->ah_attr); > > + const struct ib_gid_attr *sgid_attr; > > > > qp->qplib_qp.modify_flags |= > CMDQ_MODIFY_QP_MODIFY_MASK_DGID | > > > > 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, > > ether_addr_copy(qp->qplib_qp.ah.dmac, > > qp_attr->ah_attr.roce.dmac); > > > > - status = ib_get_cached_gid(&rdev->ibdev, 1, > > - grh->sgid_index, > > - &sgid, &sgid_attr); > > - if (!status) { > > - memcpy(qp->qplib_qp.smac, sgid_attr.ndev->dev_addr, > > - ETH_ALEN); > > - dev_put(sgid_attr.ndev); > > - nw_type = ib_gid_to_network_type(sgid_attr.gid_type, > > - &sgid); > > - switch (nw_type) { > > - case RDMA_NETWORK_IPV4: > > - qp->qplib_qp.nw_type = > > - CMDQ_MODIFY_QP_NETWORK_TYPE_ROCEV2_IPV4; > > - break; > > - case RDMA_NETWORK_IPV6: > > - qp->qplib_qp.nw_type = > > - CMDQ_MODIFY_QP_NETWORK_TYPE_ROCEV2_IPV6; > > - break; > > - default: > > - qp->qplib_qp.nw_type = > > - CMDQ_MODIFY_QP_NETWORK_TYPE_ROCEV1; > > - break; > > - } > > + sgid_attr = qp_attr->ah_attr.grh.sgid_attr; > > + memcpy(qp->qplib_qp.smac, sgid_attr->ndev->dev_addr, > > + ETH_ALEN); > > + nw_type = rdma_gid_attr_network_type(sgid_attr); > > + switch (nw_type) { > > + case RDMA_NETWORK_IPV4: > > + qp->qplib_qp.nw_type = > > + CMDQ_MODIFY_QP_NETWORK_TYPE_ROCEV2_IPV4; > > + break; > > + case RDMA_NETWORK_IPV6: > > + qp->qplib_qp.nw_type = > > + CMDQ_MODIFY_QP_NETWORK_TYPE_ROCEV2_IPV6; > > + break; > > + default: > > + qp->qplib_qp.nw_type = > > + CMDQ_MODIFY_QP_NETWORK_TYPE_ROCEV1; > > + break; > > } > > } > > > > @@ -1934,7 +1915,7 @@ static int bnxt_re_build_qp1_send_v2(struct > bnxt_re_qp *qp, > > dev_put(sgid_attr.ndev); > > } > > /* Get network header type for this GID */ > > - nw_type = ib_gid_to_network_type(sgid_attr.gid_type, &sgid); > > + nw_type = rdma_gid_attr_network_type(&sgid_attr); > > switch (nw_type) { > > case RDMA_NETWORK_IPV4: > > nw_type = BNXT_RE_ROCEV2_IPV4_PACKET; diff --git > > a/drivers/infiniband/hw/hns/hns_roce_ah.c > > b/drivers/infiniband/hw/hns/hns_roce_ah.c > > index d74928621559..14efa3b9adb2 100644 > > --- a/drivers/infiniband/hw/hns/hns_roce_ah.c > > +++ b/drivers/infiniband/hw/hns/hns_roce_ah.c > > @@ -44,13 +44,11 @@ struct ib_ah *hns_roce_create_ah(struct ib_pd > *ibpd, > > struct ib_udata *udata) { > > struct hns_roce_dev *hr_dev = to_hr_dev(ibpd->device); > > + const struct ib_gid_attr *gid_attr; > > struct device *dev = hr_dev->dev; > > - struct ib_gid_attr gid_attr; > > struct hns_roce_ah *ah; > > u16 vlan_tag = 0xffff; > > const struct ib_global_route *grh = rdma_ah_read_grh(ah_attr); > > - union ib_gid sgid; > > - int ret; > > > > ah = kzalloc(sizeof(*ah), GFP_ATOMIC); > > if (!ah) > > @@ -59,18 +57,9 @@ struct ib_ah *hns_roce_create_ah(struct ib_pd > *ibpd, > > /* Get mac address */ > > memcpy(ah->av.mac, ah_attr->roce.dmac, ETH_ALEN); > > > > - /* Get source gid */ > > - ret = ib_get_cached_gid(ibpd->device, > rdma_ah_get_port_num(ah_attr), > > - grh->sgid_index, &sgid, &gid_attr); > > - if (ret) { > > - dev_err(dev, "get sgid failed! ret = %d\n", ret); > > - kfree(ah); > > - return ERR_PTR(ret); > > - } > > - > > - if (is_vlan_dev(gid_attr.ndev)) > > - vlan_tag = vlan_dev_vlan_id(gid_attr.ndev); > > - dev_put(gid_attr.ndev); > > + gid_attr = ah_attr->grh.sgid_attr; > > + if (is_vlan_dev(gid_attr->ndev)) > > + vlan_tag = vlan_dev_vlan_id(gid_attr->ndev); > > > > if (vlan_tag < 0x1000) > > vlan_tag |= (rdma_ah_get_sl(ah_attr) & diff --git > > a/drivers/infiniband/hw/mlx4/ah.c b/drivers/infiniband/hw/mlx4/ah.c > > index 9345d5b546d1..1ab3681acdcd 100644 > > --- a/drivers/infiniband/hw/mlx4/ah.c > > +++ b/drivers/infiniband/hw/mlx4/ah.c > > @@ -82,12 +82,11 @@ static struct ib_ah *create_iboe_ah(struct ib_pd > *pd, > > struct mlx4_ib_ah *ah) { > > struct mlx4_ib_dev *ibdev = to_mdev(pd->device); > > + const struct ib_gid_attr *gid_attr; > > struct mlx4_dev *dev = ibdev->dev; > > int is_mcast = 0; > > struct in6_addr in6; > > u16 vlan_tag = 0xffff; > > - union ib_gid sgid; > > - struct ib_gid_attr gid_attr; > > const struct ib_global_route *grh = rdma_ah_read_grh(ah_attr); > > int ret; > > > > @@ -96,15 +95,12 @@ static struct ib_ah *create_iboe_ah(struct ib_pd > *pd, > > is_mcast = 1; > > > > memcpy(ah->av.eth.mac, ah_attr->roce.dmac, ETH_ALEN); > > - ret = ib_get_cached_gid(pd->device, > rdma_ah_get_port_num(ah_attr), > > - grh->sgid_index, &sgid, &gid_attr); > > - if (ret) > > - return ERR_PTR(ret); > > eth_zero_addr(ah->av.eth.s_mac); > > - if (is_vlan_dev(gid_attr.ndev)) > > - vlan_tag = vlan_dev_vlan_id(gid_attr.ndev); > > - memcpy(ah->av.eth.s_mac, gid_attr.ndev->dev_addr, ETH_ALEN); > > - dev_put(gid_attr.ndev); > > + gid_attr = ah_attr->grh.sgid_attr; > > + if (is_vlan_dev(gid_attr->ndev)) > > + vlan_tag = vlan_dev_vlan_id(gid_attr->ndev); > > + memcpy(ah->av.eth.s_mac, gid_attr->ndev->dev_addr, ETH_ALEN); > > + > > if (vlan_tag < 0x1000) > > vlan_tag |= (rdma_ah_get_sl(ah_attr) & 7) << 13; > > ah->av.eth.port_pd = cpu_to_be32(to_mpd(pd)->pdn | diff --git > > a/drivers/infiniband/hw/mlx4/qp.c b/drivers/infiniband/hw/mlx4/qp.c > > index a7b89f035d9e..aa911fe2af6f 100644 > > --- a/drivers/infiniband/hw/mlx4/qp.c > > +++ b/drivers/infiniband/hw/mlx4/qp.c > > @@ -2176,6 +2176,7 @@ static int __mlx4_ib_modify_qp(void *src, enum > > mlx4_ib_source_type src_type, { > > struct ib_uobject *ibuobject; > > struct ib_srq *ibsrq; > > + const struct ib_gid_attr *gid_attr = NULL; > > struct ib_rwq_ind_table *rwq_ind_tbl; > > enum ib_qp_type qp_type; > > struct mlx4_ib_dev *dev; > > @@ -2356,29 +2357,17 @@ static int __mlx4_ib_modify_qp(void *src, > enum mlx4_ib_source_type src_type, > > if (attr_mask & IB_QP_AV) { > > u8 port_num = mlx4_is_bonded(dev->dev) ? 1 : > > attr_mask & IB_QP_PORT ? attr->port_num : qp->port; > > - union ib_gid gid; > > - struct ib_gid_attr gid_attr = {.gid_type = IB_GID_TYPE_IB}; > > u16 vlan = 0xffff; > > u8 smac[ETH_ALEN]; > > - int status = 0; > > int is_eth = > > rdma_cap_eth_ah(&dev->ib_dev, port_num) && > > rdma_ah_get_ah_flags(&attr->ah_attr) & > > IB_AH_GRH; > > > > if (is_eth) { > > - int index = > > - rdma_ah_read_grh(&attr->ah_attr)->sgid_index; > > - > > - status = ib_get_cached_gid(&dev->ib_dev, port_num, > > - index, &gid, &gid_attr); > > - if (!status) { > > - vlan = rdma_vlan_dev_vlan_id(gid_attr.ndev); > > - memcpy(smac, gid_attr.ndev->dev_addr, ETH_ALEN); > > - dev_put(gid_attr.ndev); > > - } > > + gid_attr = attr->ah_attr.grh.sgid_attr; > > + vlan = rdma_vlan_dev_vlan_id(gid_attr->ndev); > > + memcpy(smac, gid_attr->ndev->dev_addr, > > + ETH_ALEN); > > } > > - if (status) > > - goto out; > > > > if (mlx4_set_path(dev, attr, attr_mask, qp, &context->pri_path, > > port_num, vlan, smac)) @@ -2389,7 > > +2378,7 @@ static int __mlx4_ib_modify_qp(void *src, enum > > mlx4_ib_source_type src_type, > > > > if (is_eth && > > (cur_state == IB_QPS_INIT && new_state == IB_QPS_RTR)) { > > - u8 qpc_roce_mode = gid_type_to_qpc(gid_attr.gid_type); > > + u8 qpc_roce_mode = > > + gid_type_to_qpc(gid_attr->gid_type); > > > > if (qpc_roce_mode == MLX4_QPC_ROCE_MODE_UNDEFINED) { > > err = -EINVAL; @@ -3181,10 +3170,12 @@ > > static int build_mlx_header(struct mlx4_ib_sqp *sqp, struct ib_ud_wr *wr, > > to_mdev(ib_dev)->sriov.demux[sqp->qp.port - 1]. > > guid_cache[ah->av.ib.gid_index]; > > } else { > > - ib_get_cached_gid(ib_dev, > > - be32_to_cpu(ah->av.ib.port_pd) >> 24, > > - ah->av.ib.gid_index, > > - &sqp->ud_header.grh.source_gid, NULL); > > + err = rdma_query_gid(ib_dev, > > + be32_to_cpu(ah->av.ib.port_pd) >> 24, > > + ah->av.ib.gid_index, > > + &sqp->ud_header.grh.source_gid); > > + if (err) > > + return err; > > } > > } > > memcpy(sqp->ud_header.grh.destination_gid.raw, > > diff --git a/drivers/infiniband/hw/mlx5/ah.c > > b/drivers/infiniband/hw/mlx5/ah.c index e6bde32a83f3..ffd03bf1a71e > > 100644 > > --- a/drivers/infiniband/hw/mlx5/ah.c > > +++ b/drivers/infiniband/hw/mlx5/ah.c > > @@ -37,7 +37,6 @@ static struct ib_ah *create_ib_ah(struct mlx5_ib_dev > *dev, > > struct rdma_ah_attr *ah_attr) { > > enum ib_gid_type gid_type; > > - int err; > > > > if (rdma_ah_get_ah_flags(ah_attr) & IB_AH_GRH) { > > 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, > > ah->av.stat_rate_sl = (rdma_ah_get_static_rate(ah_attr) << 4); > > > > if (ah_attr->type == RDMA_AH_ATTR_TYPE_ROCE) { > > - err = mlx5_get_roce_gid_type(dev, ah_attr->port_num, > > - ah_attr->grh.sgid_index, > > - &gid_type); > > - if (err) > > - return ERR_PTR(err); > > + gid_type = ah_attr->grh.sgid_attr->gid_type; > > > > memcpy(ah->av.rmac, ah_attr->roce.dmac, > > sizeof(ah_attr->roce.dmac)); > > ah->av.udp_sport = > > - mlx5_get_roce_udp_sport(dev, > > - rdma_ah_get_port_num(ah_attr), > > - rdma_ah_read_grh(ah_attr)->sgid_index); > > + mlx5_get_roce_udp_sport(dev, > > + ah_attr->grh.sgid_attr); > > ah->av.stat_rate_sl |= (rdma_ah_get_sl(ah_attr) & 0x7) << 1; > > if (gid_type == IB_GID_TYPE_ROCE_UDP_ENCAP) #define > > MLX5_ECN_ENABLED BIT(1) diff --git a/drivers/infiniband/hw/mlx5/main.c > > b/drivers/infiniband/hw/mlx5/main.c > > index 9f1ab7e1782c..77775e10a314 100644 > > --- a/drivers/infiniband/hw/mlx5/main.c > > +++ b/drivers/infiniband/hw/mlx5/main.c > > @@ -524,41 +524,15 @@ static int mlx5_ib_del_gid(const struct ib_gid_attr > *attr, > > attr->index, NULL, NULL); } > > > > -__be16 mlx5_get_roce_udp_sport(struct mlx5_ib_dev *dev, u8 > port_num, > > - int index) > > +__be16 mlx5_get_roce_udp_sport(struct mlx5_ib_dev *dev, > > + const struct ib_gid_attr *attr) > > { > > - struct ib_gid_attr attr; > > - union ib_gid gid; > > - > > - if (ib_get_cached_gid(&dev->ib_dev, port_num, index, &gid, &attr)) > > - return 0; > > - > > - dev_put(attr.ndev); > > - > > - if (attr.gid_type != IB_GID_TYPE_ROCE_UDP_ENCAP) > > + if (attr->gid_type != IB_GID_TYPE_ROCE_UDP_ENCAP) > > return 0; > > > > return cpu_to_be16(MLX5_CAP_ROCE(dev->mdev, > > r_roce_min_src_udp_port)); } > > > > -int mlx5_get_roce_gid_type(struct mlx5_ib_dev *dev, u8 port_num, > > - int index, enum ib_gid_type *gid_type) > > -{ > > - struct ib_gid_attr attr; > > - union ib_gid gid; > > - int ret; > > - > > - ret = ib_get_cached_gid(&dev->ib_dev, port_num, index, &gid, &attr); > > - if (ret) > > - return ret; > > - > > - dev_put(attr.ndev); > > - > > - *gid_type = attr.gid_type; > > - > > - return 0; > > -} > > - > > static int mlx5_use_mad_ifc(struct mlx5_ib_dev *dev) { > > if (MLX5_CAP_GEN(dev->mdev, port_type) == > MLX5_CAP_PORT_TYPE_IB) > > diff --git a/drivers/infiniband/hw/mlx5/mlx5_ib.h > > b/drivers/infiniband/hw/mlx5/mlx5_ib.h > > index ed3c7cbadcf7..0f95453b11db 100644 > > --- a/drivers/infiniband/hw/mlx5/mlx5_ib.h > > +++ b/drivers/infiniband/hw/mlx5/mlx5_ib.h > > @@ -1186,10 +1186,8 @@ int mlx5_ib_get_vf_stats(struct ib_device > > *device, int vf, int mlx5_ib_set_vf_guid(struct ib_device *device, int vf, u8 > port, > > u64 guid, int type); > > > > -__be16 mlx5_get_roce_udp_sport(struct mlx5_ib_dev *dev, u8 > port_num, > > - int index); > > -int mlx5_get_roce_gid_type(struct mlx5_ib_dev *dev, u8 port_num, > > - int index, enum ib_gid_type *gid_type); > > +__be16 mlx5_get_roce_udp_sport(struct mlx5_ib_dev *dev, > > + const struct ib_gid_attr *attr); > > > > void mlx5_ib_cleanup_cong_debugfs(struct mlx5_ib_dev *dev, u8 > > port_num); int mlx5_ib_init_cong_debugfs(struct mlx5_ib_dev *dev, u8 > > port_num); diff --git a/drivers/infiniband/hw/mlx5/qp.c > > b/drivers/infiniband/hw/mlx5/qp.c index 70f399c0c9e8..6034a670859f > > 100644 > > --- a/drivers/infiniband/hw/mlx5/qp.c > > +++ b/drivers/infiniband/hw/mlx5/qp.c > > @@ -2558,18 +2558,16 @@ static int mlx5_set_path(struct mlx5_ib_dev > *dev, struct mlx5_ib_qp *qp, > > if (ah->type == RDMA_AH_ATTR_TYPE_ROCE) { > > if (!(ah_flags & IB_AH_GRH)) > > return -EINVAL; > > - err = mlx5_get_roce_gid_type(dev, port, grh->sgid_index, > > - &gid_type); > > - if (err) > > - return err; > > + > > memcpy(path->rmac, ah->roce.dmac, sizeof(ah->roce.dmac)); > > if (qp->ibqp.qp_type == IB_QPT_RC || > > qp->ibqp.qp_type == IB_QPT_UC || > > qp->ibqp.qp_type == IB_QPT_XRC_INI || > > qp->ibqp.qp_type == IB_QPT_XRC_TGT) > > - path->udp_sport = mlx5_get_roce_udp_sport(dev, port, > > - grh->sgid_index); > > + path->udp_sport = > > + mlx5_get_roce_udp_sport(dev, > > + ah->grh.sgid_attr); > > path->dci_cfi_prio_sl = (sl & 0x7) << 4; > > + gid_type = ah->grh.sgid_attr->gid_type; > > if (gid_type == IB_GID_TYPE_ROCE_UDP_ENCAP) > > path->ecn_dscp = (grh->traffic_class >> 2) & 0x3f; > > } else { > > diff --git a/drivers/infiniband/hw/ocrdma/ocrdma_ah.c > > b/drivers/infiniband/hw/ocrdma/ocrdma_ah.c > > index 3897b64532e1..a51b80bfadb3 100644 > > --- a/drivers/infiniband/hw/ocrdma/ocrdma_ah.c > > +++ b/drivers/infiniband/hw/ocrdma/ocrdma_ah.c > > @@ -71,7 +71,7 @@ static u16 ocrdma_hdr_type_to_proto_num(int devid, > > u8 hdr_type) } > > > > static inline int set_av_attr(struct ocrdma_dev *dev, struct ocrdma_ah > *ah, > > - struct rdma_ah_attr *attr, union ib_gid *sgid, > > + struct rdma_ah_attr *attr, const union ib_gid > > + *sgid, > > int pdid, bool *isvlan, u16 vlan_tag) { > > int status; > > @@ -164,11 +164,10 @@ struct ib_ah *ocrdma_create_ah(struct ib_pd > *ibpd, struct rdma_ah_attr *attr, > > struct ocrdma_ah *ah; > > bool isvlan = false; > > u16 vlan_tag = 0xffff; > > - struct ib_gid_attr sgid_attr; > > + const struct ib_gid_attr *sgid_attr; > > struct ocrdma_pd *pd = get_ocrdma_pd(ibpd); > > struct ocrdma_dev *dev = get_ocrdma_dev(ibpd->device); > > const struct ib_global_route *grh; > > - union ib_gid sgid; > > > > if ((attr->type != RDMA_AH_ATTR_TYPE_ROCE) || > > !(rdma_ah_get_ah_flags(attr) & IB_AH_GRH)) @@ -186,20 > > +185,15 @@ struct ib_ah *ocrdma_create_ah(struct ib_pd *ibpd, struct > rdma_ah_attr *attr, > > if (status) > > goto av_err; > > > > - status = ib_get_cached_gid(&dev->ibdev, 1, grh->sgid_index, &sgid, > > - &sgid_attr); > > - if (status) { > > - pr_err("%s(): Failed to query sgid, status = %d\n", > > - __func__, status); > > - goto av_conf_err; > > - } > > - if (is_vlan_dev(sgid_attr.ndev)) > > - vlan_tag = vlan_dev_vlan_id(sgid_attr.ndev); > > - dev_put(sgid_attr.ndev); > > + sgid_attr = attr->grh.sgid_attr; > > + if (is_vlan_dev(sgid_attr->ndev)) > > + vlan_tag = vlan_dev_vlan_id(sgid_attr->ndev); > > + > > /* Get network header type for this GID */ > > - ah->hdr_type = ib_gid_to_network_type(sgid_attr.gid_type, &sgid); > > + ah->hdr_type = rdma_gid_attr_network_type(sgid_attr); > > > > - status = set_av_attr(dev, ah, attr, &sgid, pd->id, &isvlan, vlan_tag); > > + status = set_av_attr(dev, ah, attr, &sgid_attr->gid, pd->id, > > + &isvlan, vlan_tag); > > if (status) > > goto av_conf_err; > > > > diff --git a/drivers/infiniband/hw/ocrdma/ocrdma_hw.c > > b/drivers/infiniband/hw/ocrdma/ocrdma_hw.c > > index 2c260e1c29d1..269d130758e5 100644 > > --- a/drivers/infiniband/hw/ocrdma/ocrdma_hw.c > > +++ b/drivers/infiniband/hw/ocrdma/ocrdma_hw.c > > @@ -2494,8 +2494,7 @@ static int ocrdma_set_av_params(struct > ocrdma_qp > > *qp, { > > int status; > > struct rdma_ah_attr *ah_attr = &attrs->ah_attr; > > - union ib_gid sgid; > > - struct ib_gid_attr sgid_attr; > > + const struct ib_gid_attr *sgid_attr; > > u32 vlan_id = 0xFFFF; > > u8 mac_addr[6], hdr_type; > > union { > > @@ -2525,25 +2524,23 @@ static int ocrdma_set_av_params(struct > ocrdma_qp *qp, > > memcpy(&cmd->params.dgid[0], &grh->dgid.raw[0], > > sizeof(cmd->params.dgid)); > > > > - status = ib_get_cached_gid(&dev->ibdev, 1, grh->sgid_index, > > - &sgid, &sgid_attr); > > - if (!status) { > > - vlan_id = rdma_vlan_dev_vlan_id(sgid_attr.ndev); > > - memcpy(mac_addr, sgid_attr.ndev->dev_addr, ETH_ALEN); > > - dev_put(sgid_attr.ndev); > > - } > > + sgid_attr = ah_attr->grh.sgid_attr; > > + vlan_id = rdma_vlan_dev_vlan_id(sgid_attr->ndev); > > + memcpy(mac_addr, sgid_attr->ndev->dev_addr, ETH_ALEN); > > > > qp->sgid_idx = grh->sgid_index; > > - memcpy(&cmd->params.sgid[0], &sgid.raw[0], sizeof(cmd- > >params.sgid)); > > + memcpy(&cmd->params.sgid[0], &sgid_attr->gid.raw[0], > > + sizeof(cmd->params.sgid)); > > status = ocrdma_resolve_dmac(dev, ah_attr, &mac_addr[0]); > > if (status) > > return status; > > + > > cmd->params.dmac_b0_to_b3 = mac_addr[0] | (mac_addr[1] << 8) | > > (mac_addr[2] << 16) | (mac_addr[3] << > > 24); > > > > - hdr_type = ib_gid_to_network_type(sgid_attr.gid_type, &sgid); > > + hdr_type = rdma_gid_attr_network_type(sgid_attr); > > if (hdr_type == RDMA_NETWORK_IPV4) { > > - rdma_gid2ip(&sgid_addr._sockaddr, &sgid); > > + rdma_gid2ip(&sgid_addr._sockaddr, &sgid_attr->gid); > > rdma_gid2ip(&dgid_addr._sockaddr, &grh->dgid); > > memcpy(&cmd->params.dgid[0], > > &dgid_addr._sockaddr_in.sin_addr.s_addr, 4); diff > > --git a/drivers/infiniband/hw/qedr/verbs.c > > b/drivers/infiniband/hw/qedr/verbs.c > > index 3b31ff5b1d54..d4df5188df78 100644 > > --- a/drivers/infiniband/hw/qedr/verbs.c > > +++ b/drivers/infiniband/hw/qedr/verbs.c > > @@ -1075,27 +1075,19 @@ static inline int get_gid_info_from_table(struct > ib_qp *ibqp, > > struct qed_rdma_modify_qp_in_params > > *qp_params) { > > + const struct ib_gid_attr *gid_attr; > > enum rdma_network_type nw_type; > > - struct ib_gid_attr gid_attr; > > const struct ib_global_route *grh = rdma_ah_read_grh(&attr->ah_attr); > > - union ib_gid gid; > > u32 ipv4_addr; > > - int rc = 0; > > int i; > > > > - rc = ib_get_cached_gid(ibqp->device, > > - rdma_ah_get_port_num(&attr->ah_attr), > > - grh->sgid_index, &gid, &gid_attr); > > - if (rc) > > - return rc; > > - > > - qp_params->vlan_id = rdma_vlan_dev_vlan_id(gid_attr.ndev); > > + gid_attr = grh->sgid_attr; > > + qp_params->vlan_id = rdma_vlan_dev_vlan_id(gid_attr->ndev); > > > > - dev_put(gid_attr.ndev); > > - nw_type = ib_gid_to_network_type(gid_attr.gid_type, &gid); > > + nw_type = rdma_gid_attr_network_type(gid_attr); > > switch (nw_type) { > > case RDMA_NETWORK_IPV6: > > - memcpy(&qp_params->sgid.bytes[0], &gid.raw[0], > > + memcpy(&qp_params->sgid.bytes[0], &gid_attr->gid.raw[0], > > sizeof(qp_params->sgid)); > > memcpy(&qp_params->dgid.bytes[0], > > &grh->dgid, > > @@ -1105,7 +1097,7 @@ static inline int get_gid_info_from_table(struct > ib_qp *ibqp, > > QED_ROCE_MODIFY_QP_VALID_ROCE_MODE, 1); > > break; > > case RDMA_NETWORK_IB: > > - memcpy(&qp_params->sgid.bytes[0], &gid.raw[0], > > + memcpy(&qp_params->sgid.bytes[0], &gid_attr->gid.raw[0], > > sizeof(qp_params->sgid)); > > memcpy(&qp_params->dgid.bytes[0], > > &grh->dgid, > > @@ -1115,7 +1107,7 @@ static inline int get_gid_info_from_table(struct > ib_qp *ibqp, > > case RDMA_NETWORK_IPV4: > > memset(&qp_params->sgid, 0, sizeof(qp_params->sgid)); > > memset(&qp_params->dgid, 0, sizeof(qp_params->dgid)); > > - ipv4_addr = qedr_get_ipv4_from_gid(gid.raw); > > + ipv4_addr = qedr_get_ipv4_from_gid(gid_attr->gid.raw); > > qp_params->sgid.ipv4_addr = ipv4_addr; > > ipv4_addr = > > qedr_get_ipv4_from_gid(grh->dgid.raw); > > diff --git a/drivers/infiniband/sw/rxe/rxe_av.c > > b/drivers/infiniband/sw/rxe/rxe_av.c > > index 7f1ae364088a..c6bce915df50 100644 > > --- a/drivers/infiniband/sw/rxe/rxe_av.c > > +++ b/drivers/infiniband/sw/rxe/rxe_av.c > > @@ -69,15 +69,14 @@ void rxe_av_to_attr(struct rxe_av *av, struct > rdma_ah_attr *attr) > > rdma_ah_set_port_num(attr, av->port_num); } > > > > -void rxe_av_fill_ip_info(struct rxe_av *av, > > - struct rdma_ah_attr *attr, > > - struct ib_gid_attr *sgid_attr, > > - union ib_gid *sgid) > > +void rxe_av_fill_ip_info(struct rxe_av *av, struct rdma_ah_attr > > +*attr) > > { > > - rdma_gid2ip((struct sockaddr *)&av->sgid_addr, sgid); > > + const struct ib_gid_attr *sgid_attr = attr->grh.sgid_attr; > > + > > + rdma_gid2ip((struct sockaddr *)&av->sgid_addr, &sgid_attr->gid); > > rdma_gid2ip((struct sockaddr *)&av->dgid_addr, > > &rdma_ah_read_grh(attr)->dgid); > > - av->network_type = ib_gid_to_network_type(sgid_attr->gid_type, > sgid); > > + av->network_type = rdma_gid_attr_network_type(sgid_attr); > > } > > > > struct rxe_av *rxe_get_av(struct rxe_pkt_info *pkt) diff --git > > a/drivers/infiniband/sw/rxe/rxe_loc.h > > b/drivers/infiniband/sw/rxe/rxe_loc.h > > index a51ece596c43..87d14f7ef21b 100644 > > --- a/drivers/infiniband/sw/rxe/rxe_loc.h > > +++ b/drivers/infiniband/sw/rxe/rxe_loc.h > > @@ -43,10 +43,7 @@ void rxe_av_from_attr(u8 port_num, struct rxe_av > > *av, > > > > void rxe_av_to_attr(struct rxe_av *av, struct rdma_ah_attr *attr); > > > > -void rxe_av_fill_ip_info(struct rxe_av *av, > > - struct rdma_ah_attr *attr, > > - struct ib_gid_attr *sgid_attr, > > - union ib_gid *sgid); > > +void rxe_av_fill_ip_info(struct rxe_av *av, struct rdma_ah_attr > > +*attr); > > > > struct rxe_av *rxe_get_av(struct rxe_pkt_info *pkt); > > > > diff --git a/drivers/infiniband/sw/rxe/rxe_qp.c > > b/drivers/infiniband/sw/rxe/rxe_qp.c > > index b9f7aa1114b2..9f83fc982f31 100644 > > --- a/drivers/infiniband/sw/rxe/rxe_qp.c > > +++ b/drivers/infiniband/sw/rxe/rxe_qp.c > > @@ -580,9 +580,6 @@ int rxe_qp_from_attr(struct rxe_qp *qp, struct > ib_qp_attr *attr, int mask, > > struct ib_udata *udata) { > > int err; > > - struct rxe_dev *rxe = to_rdev(qp->ibqp.device); > > - union ib_gid sgid; > > - struct ib_gid_attr sgid_attr; > > > > if (mask & IB_QP_MAX_QP_RD_ATOMIC) { > > int max_rd_atomic = > > __roundup_pow_of_two(attr->max_rd_atomic); > > @@ -623,30 +620,14 @@ int rxe_qp_from_attr(struct rxe_qp *qp, struct > ib_qp_attr *attr, int mask, > > qp->attr.qkey = attr->qkey; > > > > if (mask & IB_QP_AV) { > > - ib_get_cached_gid(&rxe->ib_dev, 1, > > - rdma_ah_read_grh(&attr->ah_attr)->sgid_index, > > - &sgid, &sgid_attr); > > rxe_av_from_attr(attr->port_num, &qp->pri_av, &attr->ah_attr); > > - rxe_av_fill_ip_info(&qp->pri_av, &attr->ah_attr, > > - &sgid_attr, &sgid); > > - if (sgid_attr.ndev) > > - dev_put(sgid_attr.ndev); > > + rxe_av_fill_ip_info(&qp->pri_av, &attr->ah_attr); > > } > > > > if (mask & IB_QP_ALT_PATH) { > > - u8 sgid_index = > > - rdma_ah_read_grh(&attr->alt_ah_attr)->sgid_index; > > - > > - ib_get_cached_gid(&rxe->ib_dev, 1, sgid_index, > > - &sgid, &sgid_attr); > > - > > rxe_av_from_attr(attr->alt_port_num, &qp->alt_av, > > &attr->alt_ah_attr); > > - rxe_av_fill_ip_info(&qp->alt_av, &attr->alt_ah_attr, > > - &sgid_attr, &sgid); > > - if (sgid_attr.ndev) > > - dev_put(sgid_attr.ndev); > > - > > + rxe_av_fill_ip_info(&qp->alt_av, &attr->alt_ah_attr); > > qp->attr.alt_port_num = attr->alt_port_num; > > qp->attr.alt_pkey_index = attr->alt_pkey_index; > > qp->attr.alt_timeout = attr->alt_timeout; diff --git > > a/drivers/infiniband/sw/rxe/rxe_verbs.c > > b/drivers/infiniband/sw/rxe/rxe_verbs.c > > index 9deafc3aa6af..9cfd440cebe1 100644 > > --- a/drivers/infiniband/sw/rxe/rxe_verbs.c > > +++ b/drivers/infiniband/sw/rxe/rxe_verbs.c > > @@ -222,25 +222,11 @@ static int rxe_dealloc_pd(struct ib_pd *ibpd) > > return 0; > > } > > > > -static int rxe_init_av(struct rxe_dev *rxe, struct rdma_ah_attr *attr, > > - struct rxe_av *av) > > +static void rxe_init_av(struct rxe_dev *rxe, struct rdma_ah_attr *attr, > > + struct rxe_av *av) > > { > > - int err; > > - union ib_gid sgid; > > - struct ib_gid_attr sgid_attr; > > - > > - err = ib_get_cached_gid(&rxe->ib_dev, rdma_ah_get_port_num(attr), > > - rdma_ah_read_grh(attr)->sgid_index, &sgid, > > - &sgid_attr); > > - if (err) { > > - pr_err("Failed to query sgid. err = %d\n", err); > > - return err; > > - } > > - > > rxe_av_from_attr(rdma_ah_get_port_num(attr), av, attr); > > - rxe_av_fill_ip_info(av, attr, &sgid_attr, &sgid); > > - dev_put(sgid_attr.ndev); > > - return 0; > > + rxe_av_fill_ip_info(av, attr); > > } > > > > static struct ib_ah *rxe_create_ah(struct ib_pd *ibpd, @@ -266,13 > > +252,9 @@ static struct ib_ah *rxe_create_ah(struct ib_pd *ibpd, > > rxe_add_ref(pd); > > ah->pd = pd; > > > > - err = rxe_init_av(rxe, attr, &ah->av); > > - if (err) > > - goto err2; > > - > > + rxe_init_av(rxe, attr, &ah->av); > > return &ah->ibah; > > > > -err2: > > rxe_drop_ref(pd); > > rxe_drop_ref(ah); > > err1: > > @@ -289,10 +271,7 @@ static int rxe_modify_ah(struct ib_ah *ibah, struct > rdma_ah_attr *attr) > > if (err) > > return err; > > > > - err = rxe_init_av(rxe, attr, &ah->av); > > - if (err) > > - return err; > > - > > + rxe_init_av(rxe, attr, &ah->av); > > return 0; > > } > > > > diff --git a/include/rdma/ib_verbs.h b/include/rdma/ib_verbs.h index > > e3ba51cbd61f..9ba3b2a7b6e6 100644 > > --- a/include/rdma/ib_verbs.h > > +++ b/include/rdma/ib_verbs.h > > @@ -149,13 +149,13 @@ static inline enum ib_gid_type > ib_network_to_gid_type(enum rdma_network_type net > > return IB_GID_TYPE_IB; > > } > > > > -static inline enum rdma_network_type ib_gid_to_network_type(enum > ib_gid_type gid_type, > > - union ib_gid *gid) > > +static inline enum rdma_network_type > > +rdma_gid_attr_network_type(const struct ib_gid_attr *attr) > > { > > - if (gid_type == IB_GID_TYPE_IB) > > + if (attr->gid_type == IB_GID_TYPE_IB) > > return RDMA_NETWORK_IB; > > > > - if (ipv6_addr_v4mapped((struct in6_addr *)gid)) > > + if (ipv6_addr_v4mapped((struct in6_addr *)&attr->gid)) > > return RDMA_NETWORK_IPV4; > > else > > return RDMA_NETWORK_IPV6; > > -- > > 2.14.4 > > > > -- > > To unsubscribe from this list: send the line "unsubscribe linux-rdma" > > in the body of a message to majordomo@xxxxxxxxxxxxxxx More > majordomo > > info at http://vger.kernel.org/majordomo-info.html -- To unsubscribe from this list: send the line "unsubscribe linux-rdma" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html