Commit aa74f487 authored by Parav Pandit's avatar Parav Pandit Committed by Jason Gunthorpe

IB: Make init_ah_attr_grh_fields set sgid_attr

Use the sgid and other information from the path record to figure out the
sgid_attrs.

Store the selected table entry in the sgid_attr for everything else to
use.
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 f685c195
...@@ -554,10 +554,12 @@ static int cm_init_av_by_path(struct sa_path_rec *path, struct cm_av *av, ...@@ -554,10 +554,12 @@ static int cm_init_av_by_path(struct sa_path_rec *path, struct cm_av *av,
/* /*
* av->ah_attr might be initialized based on wc or during * av->ah_attr might be initialized based on wc or during
* request processing time. So initialize a new ah_attr on stack. * request processing time which might have reference to sgid_attr.
* So initialize a new ah_attr on stack.
* If initialization fails, old ah_attr is used for sending any * If initialization fails, old ah_attr is used for sending any
* responses. If initialization is successful, than new ah_attr * responses. If initialization is successful, than new ah_attr
* is used by overwriting the old one. * is used by overwriting the old one. So that right ah_attr
* can be used to return an error response.
*/ */
ret = ib_init_ah_attr_from_path(cm_dev->ib_device, port->port_num, path, ret = ib_init_ah_attr_from_path(cm_dev->ib_device, port->port_num, path,
&new_ah_attr); &new_ah_attr);
...@@ -567,8 +569,10 @@ static int cm_init_av_by_path(struct sa_path_rec *path, struct cm_av *av, ...@@ -567,8 +569,10 @@ static int cm_init_av_by_path(struct sa_path_rec *path, struct cm_av *av,
av->timeout = path->packet_life_time + 1; av->timeout = path->packet_life_time + 1;
ret = add_cm_id_to_port_list(cm_id_priv, av, port); ret = add_cm_id_to_port_list(cm_id_priv, av, port);
if (ret) if (ret) {
rdma_destroy_ah_attr(&new_ah_attr);
return ret; return ret;
}
rdma_move_ah_attr(&av->ah_attr, &new_ah_attr); rdma_move_ah_attr(&av->ah_attr, &new_ah_attr);
return 0; return 0;
} }
......
...@@ -3508,6 +3508,8 @@ static int cma_sidr_rep_handler(struct ib_cm_id *cm_id, ...@@ -3508,6 +3508,8 @@ static int cma_sidr_rep_handler(struct ib_cm_id *cm_id,
} }
ret = id_priv->id.event_handler(&id_priv->id, &event); ret = id_priv->id.event_handler(&id_priv->id, &event);
rdma_destroy_ah_attr(&event.param.ud.ah_attr);
if (ret) { if (ret) {
/* Destroy the CM ID by returning a non-zero value. */ /* Destroy the CM ID by returning a non-zero value. */
id_priv->cm_id.ib = NULL; id_priv->cm_id.ib = NULL;
......
...@@ -1301,21 +1301,20 @@ static int init_ah_attr_grh_fields(struct ib_device *device, u8 port_num, ...@@ -1301,21 +1301,20 @@ static int init_ah_attr_grh_fields(struct ib_device *device, u8 port_num,
{ {
enum ib_gid_type type = sa_conv_pathrec_to_gid_type(rec); enum ib_gid_type type = sa_conv_pathrec_to_gid_type(rec);
struct net_device *ndev; struct net_device *ndev;
u16 gid_index; const struct ib_gid_attr *gid_attr;
int ret;
ndev = ib_get_ndev_from_path(rec); ndev = ib_get_ndev_from_path(rec);
ret = ib_find_cached_gid_by_port(device, &rec->sgid, type, gid_attr =
port_num, ndev, &gid_index); rdma_find_gid_by_port(device, &rec->sgid, type, port_num, ndev);
if (ndev) if (ndev)
dev_put(ndev); dev_put(ndev);
if (ret) if (IS_ERR(gid_attr))
return ret; return PTR_ERR(gid_attr);
rdma_ah_set_grh(ah_attr, &rec->dgid, rdma_move_grh_sgid_attr(ah_attr, &rec->dgid,
be32_to_cpu(rec->flow_label), be32_to_cpu(rec->flow_label),
gid_index, rec->hop_limit, rec->hop_limit, rec->traffic_class,
rec->traffic_class); gid_attr);
return 0; return 0;
} }
......
...@@ -770,8 +770,10 @@ static void path_rec_completion(int status, ...@@ -770,8 +770,10 @@ static void path_rec_completion(int status,
struct rdma_ah_attr av; struct rdma_ah_attr av;
if (!ib_init_ah_attr_from_path(priv->ca, priv->port, if (!ib_init_ah_attr_from_path(priv->ca, priv->port,
pathrec, &av)) pathrec, &av)) {
ah = ipoib_create_ah(dev, priv->pd, &av); ah = ipoib_create_ah(dev, priv->pd, &av);
rdma_destroy_ah_attr(&av);
}
} }
spin_lock_irqsave(&priv->lock, flags); spin_lock_irqsave(&priv->lock, flags);
......
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