Commit 47ec3866 authored by Parav Pandit's avatar Parav Pandit Committed by Jason Gunthorpe

RDMA: Convert drivers to use sgid_attr instead of sgid_index

The core code now ensures that all driver callbacks that receive an
rdma_ah_attrs will have a sgid_attr's pointer if there is a GRH present.

Drivers can use this pointer instead of calling a query function with
sgid_index. This simplifies the drivers and also avoids races where a
gid_index lookup may return different data if it is changed.
Signed-off-by: default avatarParav Pandit <parav@mellanox.com>
Signed-off-by: default avatarJason Gunthorpe <jgg@mellanox.com>
Signed-off-by: default avatarLeon Romanovsky <leonro@mellanox.com>
parent d97099fe
...@@ -672,8 +672,6 @@ struct ib_ah *bnxt_re_create_ah(struct ib_pd *ib_pd, ...@@ -672,8 +672,6 @@ struct ib_ah *bnxt_re_create_ah(struct ib_pd *ib_pd,
int rc; int rc;
u8 nw_type; u8 nw_type;
struct ib_gid_attr sgid_attr;
if (!(rdma_ah_get_ah_flags(ah_attr) & IB_AH_GRH)) { if (!(rdma_ah_get_ah_flags(ah_attr) & IB_AH_GRH)) {
dev_err(rdev_to_dev(rdev), "Failed to alloc AH: GRH not set"); dev_err(rdev_to_dev(rdev), "Failed to alloc AH: GRH not set");
return ERR_PTR(-EINVAL); return ERR_PTR(-EINVAL);
...@@ -704,20 +702,11 @@ struct ib_ah *bnxt_re_create_ah(struct ib_pd *ib_pd, ...@@ -704,20 +702,11 @@ struct ib_ah *bnxt_re_create_ah(struct ib_pd *ib_pd,
grh->dgid.raw) && grh->dgid.raw) &&
!rdma_link_local_addr((struct in6_addr *) !rdma_link_local_addr((struct in6_addr *)
grh->dgid.raw)) { grh->dgid.raw)) {
union ib_gid sgid; const struct ib_gid_attr *sgid_attr;
rc = ib_get_cached_gid(&rdev->ibdev, 1, sgid_attr = grh->sgid_attr;
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);
/* Get network header type for this GID */ /* 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) { switch (nw_type) {
case RDMA_NETWORK_IPV4: case RDMA_NETWORK_IPV4:
ah->qplib_ah.nw_type = CMDQ_CREATE_AH_TYPE_V2IPV4; 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, ...@@ -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; struct bnxt_qplib_dev_attr *dev_attr = &rdev->dev_attr;
enum ib_qp_state curr_qp_state, new_qp_state; enum ib_qp_state curr_qp_state, new_qp_state;
int rc, entries; int rc, entries;
int status;
union ib_gid sgid;
struct ib_gid_attr sgid_attr;
unsigned int flags; unsigned int flags;
u8 nw_type; u8 nw_type;
...@@ -1667,6 +1653,7 @@ int bnxt_re_modify_qp(struct ib_qp *ib_qp, struct ib_qp_attr *qp_attr, ...@@ -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) { if (qp_attr_mask & IB_QP_AV) {
const struct ib_global_route *grh = const struct ib_global_route *grh =
rdma_ah_read_grh(&qp_attr->ah_attr); 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 | qp->qplib_qp.modify_flags |= CMDQ_MODIFY_QP_MODIFY_MASK_DGID |
CMDQ_MODIFY_QP_MODIFY_MASK_FLOW_LABEL | 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, ...@@ -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, ether_addr_copy(qp->qplib_qp.ah.dmac,
qp_attr->ah_attr.roce.dmac); qp_attr->ah_attr.roce.dmac);
status = ib_get_cached_gid(&rdev->ibdev, 1, sgid_attr = qp_attr->ah_attr.grh.sgid_attr;
grh->sgid_index, memcpy(qp->qplib_qp.smac, sgid_attr->ndev->dev_addr,
&sgid, &sgid_attr); ETH_ALEN);
if (!status) { nw_type = rdma_gid_attr_network_type(sgid_attr);
memcpy(qp->qplib_qp.smac, sgid_attr.ndev->dev_addr, switch (nw_type) {
ETH_ALEN); case RDMA_NETWORK_IPV4:
dev_put(sgid_attr.ndev); qp->qplib_qp.nw_type =
nw_type = ib_gid_to_network_type(sgid_attr.gid_type, CMDQ_MODIFY_QP_NETWORK_TYPE_ROCEV2_IPV4;
&sgid); break;
switch (nw_type) { case RDMA_NETWORK_IPV6:
case RDMA_NETWORK_IPV4: qp->qplib_qp.nw_type =
qp->qplib_qp.nw_type = CMDQ_MODIFY_QP_NETWORK_TYPE_ROCEV2_IPV6;
CMDQ_MODIFY_QP_NETWORK_TYPE_ROCEV2_IPV4; break;
break; default:
case RDMA_NETWORK_IPV6: qp->qplib_qp.nw_type =
qp->qplib_qp.nw_type = CMDQ_MODIFY_QP_NETWORK_TYPE_ROCEV1;
CMDQ_MODIFY_QP_NETWORK_TYPE_ROCEV2_IPV6; break;
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, ...@@ -1934,7 +1915,7 @@ static int bnxt_re_build_qp1_send_v2(struct bnxt_re_qp *qp,
dev_put(sgid_attr.ndev); dev_put(sgid_attr.ndev);
} }
/* Get network header type for this GID */ /* 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) { switch (nw_type) {
case RDMA_NETWORK_IPV4: case RDMA_NETWORK_IPV4:
nw_type = BNXT_RE_ROCEV2_IPV4_PACKET; nw_type = BNXT_RE_ROCEV2_IPV4_PACKET;
......
...@@ -44,13 +44,11 @@ struct ib_ah *hns_roce_create_ah(struct ib_pd *ibpd, ...@@ -44,13 +44,11 @@ struct ib_ah *hns_roce_create_ah(struct ib_pd *ibpd,
struct ib_udata *udata) struct ib_udata *udata)
{ {
struct hns_roce_dev *hr_dev = to_hr_dev(ibpd->device); 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 device *dev = hr_dev->dev;
struct ib_gid_attr gid_attr;
struct hns_roce_ah *ah; struct hns_roce_ah *ah;
u16 vlan_tag = 0xffff; u16 vlan_tag = 0xffff;
const struct ib_global_route *grh = rdma_ah_read_grh(ah_attr); const struct ib_global_route *grh = rdma_ah_read_grh(ah_attr);
union ib_gid sgid;
int ret;
ah = kzalloc(sizeof(*ah), GFP_ATOMIC); ah = kzalloc(sizeof(*ah), GFP_ATOMIC);
if (!ah) if (!ah)
...@@ -59,18 +57,9 @@ struct ib_ah *hns_roce_create_ah(struct ib_pd *ibpd, ...@@ -59,18 +57,9 @@ struct ib_ah *hns_roce_create_ah(struct ib_pd *ibpd,
/* Get mac address */ /* Get mac address */
memcpy(ah->av.mac, ah_attr->roce.dmac, ETH_ALEN); memcpy(ah->av.mac, ah_attr->roce.dmac, ETH_ALEN);
/* Get source gid */ gid_attr = ah_attr->grh.sgid_attr;
ret = ib_get_cached_gid(ibpd->device, rdma_ah_get_port_num(ah_attr), if (is_vlan_dev(gid_attr->ndev))
grh->sgid_index, &sgid, &gid_attr); vlan_tag = vlan_dev_vlan_id(gid_attr->ndev);
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);
if (vlan_tag < 0x1000) if (vlan_tag < 0x1000)
vlan_tag |= (rdma_ah_get_sl(ah_attr) & vlan_tag |= (rdma_ah_get_sl(ah_attr) &
......
...@@ -82,12 +82,11 @@ static struct ib_ah *create_iboe_ah(struct ib_pd *pd, ...@@ -82,12 +82,11 @@ static struct ib_ah *create_iboe_ah(struct ib_pd *pd,
struct mlx4_ib_ah *ah) struct mlx4_ib_ah *ah)
{ {
struct mlx4_ib_dev *ibdev = to_mdev(pd->device); struct mlx4_ib_dev *ibdev = to_mdev(pd->device);
const struct ib_gid_attr *gid_attr;
struct mlx4_dev *dev = ibdev->dev; struct mlx4_dev *dev = ibdev->dev;
int is_mcast = 0; int is_mcast = 0;
struct in6_addr in6; struct in6_addr in6;
u16 vlan_tag = 0xffff; 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); const struct ib_global_route *grh = rdma_ah_read_grh(ah_attr);
int ret; int ret;
...@@ -96,15 +95,12 @@ static struct ib_ah *create_iboe_ah(struct ib_pd *pd, ...@@ -96,15 +95,12 @@ static struct ib_ah *create_iboe_ah(struct ib_pd *pd,
is_mcast = 1; is_mcast = 1;
memcpy(ah->av.eth.mac, ah_attr->roce.dmac, ETH_ALEN); 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); eth_zero_addr(ah->av.eth.s_mac);
if (is_vlan_dev(gid_attr.ndev)) gid_attr = ah_attr->grh.sgid_attr;
vlan_tag = vlan_dev_vlan_id(gid_attr.ndev); if (is_vlan_dev(gid_attr->ndev))
memcpy(ah->av.eth.s_mac, gid_attr.ndev->dev_addr, ETH_ALEN); vlan_tag = vlan_dev_vlan_id(gid_attr->ndev);
dev_put(gid_attr.ndev); memcpy(ah->av.eth.s_mac, gid_attr->ndev->dev_addr, ETH_ALEN);
if (vlan_tag < 0x1000) if (vlan_tag < 0x1000)
vlan_tag |= (rdma_ah_get_sl(ah_attr) & 7) << 13; vlan_tag |= (rdma_ah_get_sl(ah_attr) & 7) << 13;
ah->av.eth.port_pd = cpu_to_be32(to_mpd(pd)->pdn | ah->av.eth.port_pd = cpu_to_be32(to_mpd(pd)->pdn |
......
...@@ -2176,6 +2176,7 @@ static int __mlx4_ib_modify_qp(void *src, enum mlx4_ib_source_type src_type, ...@@ -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_uobject *ibuobject;
struct ib_srq *ibsrq; struct ib_srq *ibsrq;
const struct ib_gid_attr *gid_attr = NULL;
struct ib_rwq_ind_table *rwq_ind_tbl; struct ib_rwq_ind_table *rwq_ind_tbl;
enum ib_qp_type qp_type; enum ib_qp_type qp_type;
struct mlx4_ib_dev *dev; struct mlx4_ib_dev *dev;
...@@ -2356,29 +2357,17 @@ static int __mlx4_ib_modify_qp(void *src, enum mlx4_ib_source_type src_type, ...@@ -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) { if (attr_mask & IB_QP_AV) {
u8 port_num = mlx4_is_bonded(dev->dev) ? 1 : u8 port_num = mlx4_is_bonded(dev->dev) ? 1 :
attr_mask & IB_QP_PORT ? attr->port_num : qp->port; 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; u16 vlan = 0xffff;
u8 smac[ETH_ALEN]; u8 smac[ETH_ALEN];
int status = 0;
int is_eth = int is_eth =
rdma_cap_eth_ah(&dev->ib_dev, port_num) && rdma_cap_eth_ah(&dev->ib_dev, port_num) &&
rdma_ah_get_ah_flags(&attr->ah_attr) & IB_AH_GRH; rdma_ah_get_ah_flags(&attr->ah_attr) & IB_AH_GRH;
if (is_eth) { if (is_eth) {
int index = gid_attr = attr->ah_attr.grh.sgid_attr;
rdma_ah_read_grh(&attr->ah_attr)->sgid_index; vlan = rdma_vlan_dev_vlan_id(gid_attr->ndev);
memcpy(smac, gid_attr->ndev->dev_addr, ETH_ALEN);
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);
}
} }
if (status)
goto out;
if (mlx4_set_path(dev, attr, attr_mask, qp, &context->pri_path, if (mlx4_set_path(dev, attr, attr_mask, qp, &context->pri_path,
port_num, vlan, smac)) port_num, vlan, smac))
...@@ -2389,7 +2378,7 @@ static int __mlx4_ib_modify_qp(void *src, enum mlx4_ib_source_type src_type, ...@@ -2389,7 +2378,7 @@ static int __mlx4_ib_modify_qp(void *src, enum mlx4_ib_source_type src_type,
if (is_eth && if (is_eth &&
(cur_state == IB_QPS_INIT && new_state == IB_QPS_RTR)) { (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) { if (qpc_roce_mode == MLX4_QPC_ROCE_MODE_UNDEFINED) {
err = -EINVAL; err = -EINVAL;
...@@ -3181,10 +3170,12 @@ static int build_mlx_header(struct mlx4_ib_sqp *sqp, struct ib_ud_wr *wr, ...@@ -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]. to_mdev(ib_dev)->sriov.demux[sqp->qp.port - 1].
guid_cache[ah->av.ib.gid_index]; guid_cache[ah->av.ib.gid_index];
} else { } else {
ib_get_cached_gid(ib_dev, err = rdma_query_gid(ib_dev,
be32_to_cpu(ah->av.ib.port_pd) >> 24, be32_to_cpu(ah->av.ib.port_pd) >> 24,
ah->av.ib.gid_index, ah->av.ib.gid_index,
&sqp->ud_header.grh.source_gid, NULL); &sqp->ud_header.grh.source_gid);
if (err)
return err;
} }
} }
memcpy(sqp->ud_header.grh.destination_gid.raw, memcpy(sqp->ud_header.grh.destination_gid.raw,
......
...@@ -37,7 +37,6 @@ static struct ib_ah *create_ib_ah(struct mlx5_ib_dev *dev, ...@@ -37,7 +37,6 @@ static struct ib_ah *create_ib_ah(struct mlx5_ib_dev *dev,
struct rdma_ah_attr *ah_attr) struct rdma_ah_attr *ah_attr)
{ {
enum ib_gid_type gid_type; enum ib_gid_type gid_type;
int err;
if (rdma_ah_get_ah_flags(ah_attr) & IB_AH_GRH) { if (rdma_ah_get_ah_flags(ah_attr) & IB_AH_GRH) {
const struct ib_global_route *grh = rdma_ah_read_grh(ah_attr); 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, ...@@ -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); ah->av.stat_rate_sl = (rdma_ah_get_static_rate(ah_attr) << 4);
if (ah_attr->type == RDMA_AH_ATTR_TYPE_ROCE) { if (ah_attr->type == RDMA_AH_ATTR_TYPE_ROCE) {
err = mlx5_get_roce_gid_type(dev, ah_attr->port_num, gid_type = ah_attr->grh.sgid_attr->gid_type;
ah_attr->grh.sgid_index,
&gid_type);
if (err)
return ERR_PTR(err);
memcpy(ah->av.rmac, ah_attr->roce.dmac, memcpy(ah->av.rmac, ah_attr->roce.dmac,
sizeof(ah_attr->roce.dmac)); sizeof(ah_attr->roce.dmac));
ah->av.udp_sport = ah->av.udp_sport =
mlx5_get_roce_udp_sport(dev, mlx5_get_roce_udp_sport(dev, ah_attr->grh.sgid_attr);
rdma_ah_get_port_num(ah_attr),
rdma_ah_read_grh(ah_attr)->sgid_index);
ah->av.stat_rate_sl |= (rdma_ah_get_sl(ah_attr) & 0x7) << 1; ah->av.stat_rate_sl |= (rdma_ah_get_sl(ah_attr) & 0x7) << 1;
if (gid_type == IB_GID_TYPE_ROCE_UDP_ENCAP) if (gid_type == IB_GID_TYPE_ROCE_UDP_ENCAP)
#define MLX5_ECN_ENABLED BIT(1) #define MLX5_ECN_ENABLED BIT(1)
......
...@@ -524,41 +524,15 @@ static int mlx5_ib_del_gid(const struct ib_gid_attr *attr, ...@@ -524,41 +524,15 @@ static int mlx5_ib_del_gid(const struct ib_gid_attr *attr,
attr->index, NULL, NULL); attr->index, NULL, NULL);
} }
__be16 mlx5_get_roce_udp_sport(struct mlx5_ib_dev *dev, u8 port_num, __be16 mlx5_get_roce_udp_sport(struct mlx5_ib_dev *dev,
int index) const struct ib_gid_attr *attr)
{ {
struct ib_gid_attr attr; if (attr->gid_type != IB_GID_TYPE_ROCE_UDP_ENCAP)
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)
return 0; return 0;
return cpu_to_be16(MLX5_CAP_ROCE(dev->mdev, r_roce_min_src_udp_port)); 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) static int mlx5_use_mad_ifc(struct mlx5_ib_dev *dev)
{ {
if (MLX5_CAP_GEN(dev->mdev, port_type) == MLX5_CAP_PORT_TYPE_IB) if (MLX5_CAP_GEN(dev->mdev, port_type) == MLX5_CAP_PORT_TYPE_IB)
......
...@@ -1183,10 +1183,8 @@ int mlx5_ib_get_vf_stats(struct ib_device *device, int vf, ...@@ -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, int mlx5_ib_set_vf_guid(struct ib_device *device, int vf, u8 port,
u64 guid, int type); u64 guid, int type);
__be16 mlx5_get_roce_udp_sport(struct mlx5_ib_dev *dev, u8 port_num, __be16 mlx5_get_roce_udp_sport(struct mlx5_ib_dev *dev,
int index); const struct ib_gid_attr *attr);
int mlx5_get_roce_gid_type(struct mlx5_ib_dev *dev, u8 port_num,
int index, enum ib_gid_type *gid_type);
void mlx5_ib_cleanup_cong_debugfs(struct mlx5_ib_dev *dev, u8 port_num); 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); int mlx5_ib_init_cong_debugfs(struct mlx5_ib_dev *dev, u8 port_num);
......
...@@ -2555,18 +2555,16 @@ static int mlx5_set_path(struct mlx5_ib_dev *dev, struct mlx5_ib_qp *qp, ...@@ -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->type == RDMA_AH_ATTR_TYPE_ROCE) {
if (!(ah_flags & IB_AH_GRH)) if (!(ah_flags & IB_AH_GRH))
return -EINVAL; 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)); memcpy(path->rmac, ah->roce.dmac, sizeof(ah->roce.dmac));
if (qp->ibqp.qp_type == IB_QPT_RC || if (qp->ibqp.qp_type == IB_QPT_RC ||
qp->ibqp.qp_type == IB_QPT_UC || qp->ibqp.qp_type == IB_QPT_UC ||
qp->ibqp.qp_type == IB_QPT_XRC_INI || qp->ibqp.qp_type == IB_QPT_XRC_INI ||
qp->ibqp.qp_type == IB_QPT_XRC_TGT) qp->ibqp.qp_type == IB_QPT_XRC_TGT)
path->udp_sport = mlx5_get_roce_udp_sport(dev, port, path->udp_sport =
grh->sgid_index); mlx5_get_roce_udp_sport(dev, ah->grh.sgid_attr);
path->dci_cfi_prio_sl = (sl & 0x7) << 4; 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) if (gid_type == IB_GID_TYPE_ROCE_UDP_ENCAP)
path->ecn_dscp = (grh->traffic_class >> 2) & 0x3f; path->ecn_dscp = (grh->traffic_class >> 2) & 0x3f;
} else { } else {
......
...@@ -71,7 +71,7 @@ static u16 ocrdma_hdr_type_to_proto_num(int devid, u8 hdr_type) ...@@ -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, 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 pdid, bool *isvlan, u16 vlan_tag)
{ {
int status; int status;
...@@ -164,11 +164,10 @@ struct ib_ah *ocrdma_create_ah(struct ib_pd *ibpd, struct rdma_ah_attr *attr, ...@@ -164,11 +164,10 @@ struct ib_ah *ocrdma_create_ah(struct ib_pd *ibpd, struct rdma_ah_attr *attr,
struct ocrdma_ah *ah; struct ocrdma_ah *ah;
bool isvlan = false; bool isvlan = false;
u16 vlan_tag = 0xffff; 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_pd *pd = get_ocrdma_pd(ibpd);
struct ocrdma_dev *dev = get_ocrdma_dev(ibpd->device); struct ocrdma_dev *dev = get_ocrdma_dev(ibpd->device);
const struct ib_global_route *grh; const struct ib_global_route *grh;
union ib_gid sgid;
if ((attr->type != RDMA_AH_ATTR_TYPE_ROCE) || if ((attr->type != RDMA_AH_ATTR_TYPE_ROCE) ||
!(rdma_ah_get_ah_flags(attr) & IB_AH_GRH)) !(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, ...@@ -186,20 +185,15 @@ struct ib_ah *ocrdma_create_ah(struct ib_pd *ibpd, struct rdma_ah_attr *attr,
if (status) if (status)
goto av_err; goto av_err;
status = ib_get_cached_gid(&dev->ibdev, 1, grh->sgid_index, &sgid, sgid_attr = attr->grh.sgid_attr;
&sgid_attr); if (is_vlan_dev(sgid_attr->ndev))
if (status) { vlan_tag = vlan_dev_vlan_id(sgid_attr->ndev);
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);
/* Get network header type for this GID */ /* 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) if (status)
goto av_conf_err; goto av_conf_err;
......
...@@ -2494,8 +2494,7 @@ static int ocrdma_set_av_params(struct ocrdma_qp *qp, ...@@ -2494,8 +2494,7 @@ static int ocrdma_set_av_params(struct ocrdma_qp *qp,
{ {
int status; int status;
struct rdma_ah_attr *ah_attr = &attrs->ah_attr; struct rdma_ah_attr *ah_attr = &attrs->ah_attr;
union ib_gid sgid; const struct ib_gid_attr *sgid_attr;
struct ib_gid_attr sgid_attr;
u32 vlan_id = 0xFFFF; u32 vlan_id = 0xFFFF;
u8 mac_addr[6], hdr_type; u8 mac_addr[6], hdr_type;
union { union {
...@@ -2525,25 +2524,23 @@ static int ocrdma_set_av_params(struct ocrdma_qp *qp, ...@@ -2525,25 +2524,23 @@ static int ocrdma_set_av_params(struct ocrdma_qp *qp,
memcpy(&cmd->params.dgid[0], &grh->dgid.raw[0], memcpy(&cmd->params.dgid[0], &grh->dgid.raw[0],
sizeof(cmd->params.dgid)); sizeof(cmd->params.dgid));
status = ib_get_cached_gid(&dev->ibdev, 1, grh->sgid_index, sgid_attr = ah_attr->grh.sgid_attr;
&sgid, &sgid_attr); vlan_id = rdma_vlan_dev_vlan_id(sgid_attr->ndev);
if (!status) { memcpy(mac_addr, sgid_attr->ndev->dev_addr, ETH_ALEN);
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);
}
qp->sgid_idx = grh->sgid_index; 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]); status = ocrdma_resolve_dmac(dev, ah_attr, &mac_addr[0]);
if (status) if (status)
return status; return status;
cmd->params.dmac_b0_to_b3 = mac_addr[0] | (mac_addr[1] << 8) | cmd->params.dmac_b0_to_b3 = mac_addr[0] | (mac_addr[1] << 8) |
(mac_addr[2] << 16) | (mac_addr[3] << 24); (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) { 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); rdma_gid2ip(&dgid_addr._sockaddr, &grh->dgid);
memcpy(&cmd->params.dgid[0], memcpy(&cmd->params.dgid[0],
&dgid_addr._sockaddr_in.sin_addr.s_addr, 4); &dgid_addr._sockaddr_in.sin_addr.s_addr, 4);
......
...@@ -1075,27 +1075,19 @@ static inline int get_gid_info_from_table(struct ib_qp *ibqp, ...@@ -1075,27 +1075,19 @@ static inline int get_gid_info_from_table(struct ib_qp *ibqp,
struct qed_rdma_modify_qp_in_params struct qed_rdma_modify_qp_in_params
*qp_params) *qp_params)
{ {
const struct ib_gid_attr *gid_attr;
enum rdma_network_type nw_type; 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); const struct ib_global_route *grh = rdma_ah_read_grh(&attr->ah_attr);
union ib_gid gid;
u32 ipv4_addr; u32 ipv4_addr;
int rc = 0;
int i; int i;
rc = ib_get_cached_gid(ibqp->device, gid_attr = grh->sgid_attr;
rdma_ah_get_port_num(&attr->ah_attr), qp_params->vlan_id = rdma_vlan_dev_vlan_id(gid_attr->ndev);
grh->sgid_index, &gid, &gid_attr);
if (rc)
return rc;
qp_params->vlan_id = rdma_vlan_dev_vlan_id(gid_attr.ndev);
dev_put(gid_attr.ndev); nw_type = rdma_gid_attr_network_type(gid_attr);
nw_type = ib_gid_to_network_type(gid_attr.gid_type, &gid);
switch (nw_type) { switch (nw_type) {
case RDMA_NETWORK_IPV6: 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)); sizeof(qp_params->sgid));
memcpy(&qp_params->dgid.bytes[0], memcpy(&qp_params->dgid.bytes[0],
&grh->dgid, &grh->dgid,
...@@ -1105,7 +1097,7 @@ static inline int get_gid_info_from_table(struct ib_qp *ibqp, ...@@ -1105,7 +1097,7 @@ static inline int get_gid_info_from_table(struct ib_qp *ibqp,
QED_ROCE_MODIFY_QP_VALID_ROCE_MODE, 1); QED_ROCE_MODIFY_QP_VALID_ROCE_MODE, 1);
break; break;
case RDMA_NETWORK_IB: 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)); sizeof(qp_params->sgid));
memcpy(&qp_params->dgid.bytes[0], memcpy(&qp_params->dgid.bytes[0],
&grh->dgid, &grh->dgid,
...@@ -1115,7 +1107,7 @@ static inline int get_gid_info_from_table(struct ib_qp *ibqp, ...@@ -1115,7 +1107,7 @@ static inline int get_gid_info_from_table(struct ib_qp *ibqp,
case RDMA_NETWORK_IPV4: case RDMA_NETWORK_IPV4:
memset(&qp_params->sgid, 0, sizeof(qp_params->sgid)); memset(&qp_params->sgid, 0, sizeof(qp_params->sgid));
memset(&qp_params->dgid, 0, sizeof(qp_params->dgid)); 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; qp_params->sgid.ipv4_addr = ipv4_addr;
ipv4_addr = ipv4_addr =
qedr_get_ipv4_from_gid(grh->dgid.raw); qedr_get_ipv4_from_gid(grh->dgid.raw);
......
...@@ -82,15 +82,14 @@ void rxe_av_to_attr(struct rxe_av *av, struct rdma_ah_attr *attr) ...@@ -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); rdma_ah_set_port_num(attr, av->port_num);
} }
void rxe_av_fill_ip_info(struct rxe_av *av, void rxe_av_fill_ip_info(struct rxe_av *av, struct rdma_ah_attr *attr)
struct rdma_ah_attr *attr,
struct ib_gid_attr *sgid_attr,
union ib_gid *sgid)
{ {
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_gid2ip((struct sockaddr *)&av->dgid_addr,
&rdma_ah_read_grh(attr)->dgid); &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) struct rxe_av *rxe_get_av(struct rxe_pkt_info *pkt)
......
...@@ -43,10 +43,7 @@ void rxe_av_from_attr(u8 port_num, struct rxe_av *av, ...@@ -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_to_attr(struct rxe_av *av, struct rdma_ah_attr *attr);
void rxe_av_fill_ip_info(struct rxe_av *av, void rxe_av_fill_ip_info(struct rxe_av *av, struct rdma_ah_attr *attr);
struct rdma_ah_attr *attr,
struct ib_gid_attr *sgid_attr,
union ib_gid *sgid);
struct rxe_av *rxe_get_av(struct rxe_pkt_info *pkt); struct rxe_av *rxe_get_av(struct rxe_pkt_info *pkt);
......
...@@ -580,9 +580,6 @@ int rxe_qp_from_attr(struct rxe_qp *qp, struct ib_qp_attr *attr, int mask, ...@@ -580,9 +580,6 @@ int rxe_qp_from_attr(struct rxe_qp *qp, struct ib_qp_attr *attr, int mask,
struct ib_udata *udata) struct ib_udata *udata)
{ {
int err; 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) { if (mask & IB_QP_MAX_QP_RD_ATOMIC) {
int max_rd_atomic = __roundup_pow_of_two(attr->max_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, ...@@ -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; qp->attr.qkey = attr->qkey;
if (mask & IB_QP_AV) { 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_from_attr(attr->port_num, &qp->pri_av, &attr->ah_attr);
rxe_av_fill_ip_info(&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);
} }
if (mask & IB_QP_ALT_PATH) { 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, rxe_av_from_attr(attr->alt_port_num, &qp->alt_av,
&attr->alt_ah_attr); &attr->alt_ah_attr);
rxe_av_fill_ip_info(&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);
qp->attr.alt_port_num = attr->alt_port_num; qp->attr.alt_port_num = attr->alt_port_num;
qp->attr.alt_pkey_index = attr->alt_pkey_index; qp->attr.alt_pkey_index = attr->alt_pkey_index;
qp->attr.alt_timeout = attr->alt_timeout; qp->attr.alt_timeout = attr->alt_timeout;
......
...@@ -222,25 +222,11 @@ static int rxe_dealloc_pd(struct ib_pd *ibpd) ...@@ -222,25 +222,11 @@ static int rxe_dealloc_pd(struct ib_pd *ibpd)
return 0; return 0;
} }
static int rxe_init_av(struct rxe_dev *rxe, struct rdma_ah_attr *attr, static void rxe_init_av(struct rxe_dev *rxe, struct rdma_ah_attr *attr,
struct rxe_av *av) 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_from_attr(rdma_ah_get_port_num(attr), av, attr);
rxe_av_fill_ip_info(av, attr, &sgid_attr, &sgid); rxe_av_fill_ip_info(av, attr);
dev_put(sgid_attr.ndev);
return 0;
} }
static struct ib_ah *rxe_create_ah(struct ib_pd *ibpd, 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, ...@@ -266,13 +252,9 @@ static struct ib_ah *rxe_create_ah(struct ib_pd *ibpd,
rxe_add_ref(pd); rxe_add_ref(pd);
ah->pd = pd; ah->pd = pd;
err = rxe_init_av(rxe, attr, &ah->av); rxe_init_av(rxe, attr, &ah->av);
if (err)
goto err2;
return &ah->ibah; return &ah->ibah;
err2:
rxe_drop_ref(pd); rxe_drop_ref(pd);
rxe_drop_ref(ah); rxe_drop_ref(ah);
err1: err1:
...@@ -289,10 +271,7 @@ static int rxe_modify_ah(struct ib_ah *ibah, struct rdma_ah_attr *attr) ...@@ -289,10 +271,7 @@ static int rxe_modify_ah(struct ib_ah *ibah, struct rdma_ah_attr *attr)
if (err) if (err)
return err; return err;
err = rxe_init_av(rxe, attr, &ah->av); rxe_init_av(rxe, attr, &ah->av);
if (err)
return err;
return 0; return 0;
} }
......
...@@ -149,13 +149,13 @@ static inline enum ib_gid_type ib_network_to_gid_type(enum rdma_network_type net ...@@ -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; return IB_GID_TYPE_IB;
} }
static inline enum rdma_network_type ib_gid_to_network_type(enum ib_gid_type gid_type, static inline enum rdma_network_type
union ib_gid *gid) 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; 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; return RDMA_NETWORK_IPV4;
else else
return RDMA_NETWORK_IPV6; return RDMA_NETWORK_IPV6;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment