RDMA: Convert drivers to use sgid_attr instead of sgid_index
authorParav Pandit <parav@mellanox.com>
Wed, 13 Jun 2018 07:22:06 +0000 (10:22 +0300)
committerJason Gunthorpe <jgg@mellanox.com>
Mon, 18 Jun 2018 17:11:26 +0000 (11:11 -0600)
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>
16 files changed:
drivers/infiniband/hw/bnxt_re/ib_verbs.c
drivers/infiniband/hw/hns/hns_roce_ah.c
drivers/infiniband/hw/mlx4/ah.c
drivers/infiniband/hw/mlx4/qp.c
drivers/infiniband/hw/mlx5/ah.c
drivers/infiniband/hw/mlx5/main.c
drivers/infiniband/hw/mlx5/mlx5_ib.h
drivers/infiniband/hw/mlx5/qp.c
drivers/infiniband/hw/ocrdma/ocrdma_ah.c
drivers/infiniband/hw/ocrdma/ocrdma_hw.c
drivers/infiniband/hw/qedr/verbs.c
drivers/infiniband/sw/rxe/rxe_av.c
drivers/infiniband/sw/rxe/rxe_loc.h
drivers/infiniband/sw/rxe/rxe_qp.c
drivers/infiniband/sw/rxe/rxe_verbs.c
include/rdma/ib_verbs.h

index 62eb9e3..1343602 100644 (file)
@@ -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;
index d749286..14efa3b 100644 (file)
@@ -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) &
index 9345d5b..1ab3681 100644 (file)
@@ -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 |
index 3b8045f..1538ce6 100644 (file)
@@ -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,
index e6bde32..ffd03bf 100644 (file)
@@ -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)
index 94669df..e6d88f3 100644 (file)
@@ -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)
index d89c8fe..615bd6e 100644 (file)
@@ -1183,10 +1183,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);
index a4f1f63..e3c4ab9 100644 (file)
@@ -2555,18 +2555,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 {
index 3897b64..a51b80b 100644 (file)
@@ -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;
 
index 6c136e5..c6c87cb 100644 (file)
@@ -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);
index 5b2a79b..10d8f41 100644 (file)
@@ -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);
index c0f972c..26fe8d7 100644 (file)
@@ -82,15 +82,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)
index a51ece5..87d14f7 100644 (file)
@@ -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);
 
index b9f7aa1..9f83fc9 100644 (file)
@@ -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;
index 9deafc3..9cfd440 100644 (file)
@@ -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;
 }
 
index 1e5c1e8..65f467d 100644 (file)
@@ -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;