RE: [PATCH rdma-next 5/8] RDMA: Convert drivers to use sgid_attr instead of sgid_index

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



> 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




[Index of Archives]     [Linux USB Devel]     [Video for Linux]     [Linux Audio Users]     [Photo]     [Yosemite News]     [Yosemite Photos]     [Linux Kernel]     [Linux SCSI]     [XFree86]

  Powered by Linux