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]

 



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.

> 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