Commit 815d456e authored by Parav Pandit's avatar Parav Pandit Committed by Jason Gunthorpe

IB/cm: Pass the sgid_attr through various events

Make the sgid_attr available along with path information to the event
consumer, this allows the consumer to keep using the same GID table entry
as the event is related to.
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 4ed13a5f
...@@ -3671,7 +3671,8 @@ error: spin_unlock_irqrestore(&cm_id_priv->lock, flags); ...@@ -3671,7 +3671,8 @@ error: spin_unlock_irqrestore(&cm_id_priv->lock, flags);
} }
EXPORT_SYMBOL(ib_send_cm_sidr_rep); EXPORT_SYMBOL(ib_send_cm_sidr_rep);
static void cm_format_sidr_rep_event(struct cm_work *work) static void cm_format_sidr_rep_event(struct cm_work *work,
const struct cm_id_private *cm_id_priv)
{ {
struct cm_sidr_rep_msg *sidr_rep_msg; struct cm_sidr_rep_msg *sidr_rep_msg;
struct ib_cm_sidr_rep_event_param *param; struct ib_cm_sidr_rep_event_param *param;
...@@ -3684,6 +3685,7 @@ static void cm_format_sidr_rep_event(struct cm_work *work) ...@@ -3684,6 +3685,7 @@ static void cm_format_sidr_rep_event(struct cm_work *work)
param->qpn = be32_to_cpu(cm_sidr_rep_get_qpn(sidr_rep_msg)); param->qpn = be32_to_cpu(cm_sidr_rep_get_qpn(sidr_rep_msg));
param->info = &sidr_rep_msg->info; param->info = &sidr_rep_msg->info;
param->info_len = sidr_rep_msg->info_length; param->info_len = sidr_rep_msg->info_length;
param->sgid_attr = cm_id_priv->av.ah_attr.grh.sgid_attr;
work->cm_event.private_data = &sidr_rep_msg->private_data; work->cm_event.private_data = &sidr_rep_msg->private_data;
} }
...@@ -3707,7 +3709,7 @@ static int cm_sidr_rep_handler(struct cm_work *work) ...@@ -3707,7 +3709,7 @@ static int cm_sidr_rep_handler(struct cm_work *work)
ib_cancel_mad(cm_id_priv->av.port->mad_agent, cm_id_priv->msg); ib_cancel_mad(cm_id_priv->av.port->mad_agent, cm_id_priv->msg);
spin_unlock_irq(&cm_id_priv->lock); spin_unlock_irq(&cm_id_priv->lock);
cm_format_sidr_rep_event(work); cm_format_sidr_rep_event(work, cm_id_priv);
cm_process_work(cm_id_priv, work); cm_process_work(cm_id_priv, work);
return 0; return 0;
out: out:
......
...@@ -3581,6 +3581,7 @@ static int cma_resolve_ib_udp(struct rdma_id_private *id_priv, ...@@ -3581,6 +3581,7 @@ static int cma_resolve_ib_udp(struct rdma_id_private *id_priv,
id_priv->cm_id.ib = id; id_priv->cm_id.ib = id;
req.path = id_priv->id.route.path_rec; req.path = id_priv->id.route.path_rec;
req.sgid_attr = id_priv->id.route.addr.dev_addr.sgid_attr;
req.service_id = rdma_get_service_id(&id_priv->id, cma_dst_addr(id_priv)); req.service_id = rdma_get_service_id(&id_priv->id, cma_dst_addr(id_priv));
req.timeout_ms = 1 << (CMA_CM_RESPONSE_TIMEOUT - 8); req.timeout_ms = 1 << (CMA_CM_RESPONSE_TIMEOUT - 8);
req.max_cm_retries = CMA_MAX_CM_RETRIES; req.max_cm_retries = CMA_MAX_CM_RETRIES;
...@@ -3642,6 +3643,8 @@ static int cma_connect_ib(struct rdma_id_private *id_priv, ...@@ -3642,6 +3643,8 @@ static int cma_connect_ib(struct rdma_id_private *id_priv,
if (route->num_paths == 2) if (route->num_paths == 2)
req.alternate_path = &route->path_rec[1]; req.alternate_path = &route->path_rec[1];
req.ppath_sgid_attr = id_priv->id.route.addr.dev_addr.sgid_attr;
/* Alternate path SGID attribute currently unsupported */
req.service_id = rdma_get_service_id(&id_priv->id, cma_dst_addr(id_priv)); req.service_id = rdma_get_service_id(&id_priv->id, cma_dst_addr(id_priv));
req.qp_num = id_priv->qp_num; req.qp_num = id_priv->qp_num;
req.qp_type = id_priv->id.qp_type; req.qp_type = id_priv->id.qp_type;
......
...@@ -246,6 +246,7 @@ struct ib_cm_sidr_rep_event_param { ...@@ -246,6 +246,7 @@ struct ib_cm_sidr_rep_event_param {
u32 qkey; u32 qkey;
u32 qpn; u32 qpn;
void *info; void *info;
const struct ib_gid_attr *sgid_attr;
u8 info_len; u8 info_len;
}; };
...@@ -365,6 +366,7 @@ struct ib_cm_id *ib_cm_insert_listen(struct ib_device *device, ...@@ -365,6 +366,7 @@ struct ib_cm_id *ib_cm_insert_listen(struct ib_device *device,
struct ib_cm_req_param { struct ib_cm_req_param {
struct sa_path_rec *primary_path; struct sa_path_rec *primary_path;
struct sa_path_rec *alternate_path; struct sa_path_rec *alternate_path;
const struct ib_gid_attr *ppath_sgid_attr;
__be64 service_id; __be64 service_id;
u32 qp_num; u32 qp_num;
enum ib_qp_type qp_type; enum ib_qp_type qp_type;
...@@ -566,6 +568,7 @@ int ib_send_cm_apr(struct ib_cm_id *cm_id, ...@@ -566,6 +568,7 @@ int ib_send_cm_apr(struct ib_cm_id *cm_id,
struct ib_cm_sidr_req_param { struct ib_cm_sidr_req_param {
struct sa_path_rec *path; struct sa_path_rec *path;
const struct ib_gid_attr *sgid_attr;
__be64 service_id; __be64 service_id;
int timeout_ms; int timeout_ms;
const void *private_data; const void *private_data;
......
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