> -----Original Message----- > From: Santosh Shilimkar [mailto:santosh.shilimkar@xxxxxxxxxx] > Sent: Monday, July 16, 2018 11:38 AM > To: Leon Romanovsky <leon@xxxxxxxxxx>; Doug Ledford > <dledford@xxxxxxxxxx>; Jason Gunthorpe <jgg@xxxxxxxxxxxx> > Cc: Leon Romanovsky <leonro@xxxxxxxxxxxx>; RDMA mailing list <linux- > rdma@xxxxxxxxxxxxxxx>; Daniel Jurgens <danielj@xxxxxxxxxxxx>; Haggai Eran > <haggaie@xxxxxxxxxxxx>; Parav Pandit <parav@xxxxxxxxxxxx> > Subject: Re: [PATCH rdma-next 1/3] IB/core: Introduce and use sgid_attr in CM > requests > > On 7/16/2018 1:50 AM, Leon Romanovsky wrote: > > From: Parav Pandit <parav@xxxxxxxxxxxx> > > > > For RoCE, when CM requests are received for RC and UD connections, > > netdevice of the incoming request is unavailable. Because of that CM > > requests are always forwarded to init_net namespace. > > > > Now that we have the GID attribute available, introduce SGID attribute > > in incoming CM requests and refer to the netdevice of it. > > This is similar to existing SGID attribute field in outgoing CM > > requests for RC and UD transports. > > > > Signed-off-by: Parav Pandit <parav@xxxxxxxxxxxx> > > Reviewed-by: Daniel Jurgens <danielj@xxxxxxxxxxxx> > > Signed-off-by: Leon Romanovsky <leonro@xxxxxxxxxxxx> > > --- > > drivers/infiniband/core/cm.c | 5 ++++- > > drivers/infiniband/core/cma.c | 28 ++++++++++++++++++++++------ > > include/rdma/ib_cm.h | 13 +++++++++++++ > > 3 files changed, 39 insertions(+), 7 deletions(-) > > > > diff --git a/drivers/infiniband/core/cm.c > > b/drivers/infiniband/core/cm.c index 4724cb09b69d..6e39c27dca8e 100644 > > --- a/drivers/infiniband/core/cm.c > > +++ b/drivers/infiniband/core/cm.c > > @@ -1716,6 +1716,7 @@ static void cm_format_req_event(struct cm_work > *work, > > param->retry_count = cm_req_get_retry_count(req_msg); > > param->rnr_retry_count = cm_req_get_rnr_retry_count(req_msg); > > param->srq = cm_req_get_srq(req_msg); > > + param->ppath_sgid_attr = cm_id_priv->av.ah_attr.grh.sgid_attr; > > work->cm_event.private_data = &req_msg->private_data; > > } > > > > @@ -3532,6 +3533,7 @@ int ib_send_cm_sidr_req(struct ib_cm_id *cm_id, > > EXPORT_SYMBOL(ib_send_cm_sidr_req); > > > > static void cm_format_sidr_req_event(struct cm_work *work, > > + const struct cm_id_private *rx_cm_id, > > struct ib_cm_id *listen_id) > > { > > struct cm_sidr_req_msg *sidr_req_msg; @@ -3545,6 +3547,7 @@ > static > > void cm_format_sidr_req_event(struct cm_work *work, > > param->service_id = sidr_req_msg->service_id; > > param->bth_pkey = cm_get_bth_pkey(work); > > param->port = work->port->port_num; > > + param->sgid_attr = rx_cm_id->av.ah_attr.grh.sgid_attr; > > work->cm_event.private_data = &sidr_req_msg->private_data; > > } > > > > @@ -3602,7 +3605,7 @@ static int cm_sidr_req_handler(struct cm_work > *work) > > cm_id_priv->id.service_id = sidr_req_msg->service_id; > > cm_id_priv->id.service_mask = ~cpu_to_be64(0); > > > > - cm_format_sidr_req_event(work, &cur_cm_id_priv->id); > > + cm_format_sidr_req_event(work, cm_id_priv, &cur_cm_id_priv->id); > > cm_process_work(cm_id_priv, work); > > cm_deref_id(cur_cm_id_priv); > > return 0; > > diff --git a/drivers/infiniband/core/cma.c > > b/drivers/infiniband/core/cma.c index f2bf997b62cd..26623f9cff32 > > 100644 > > --- a/drivers/infiniband/core/cma.c > > +++ b/drivers/infiniband/core/cma.c > > @@ -1371,6 +1371,22 @@ static bool validate_net_dev(struct net_device > *net_dev, > > } > > } > > > > +static struct net_device * > > +roce_get_net_dev_by_cm_event(const struct ib_cm_event *ib_event) { > > + const struct ib_gid_attr *sgid_attr = NULL; > > + > > + if (ib_event->event == IB_CM_REQ_RECEIVED) > > + sgid_attr = ib_event->param.req_rcvd.ppath_sgid_attr; > > + else if (ib_event->event == IB_CM_SIDR_REQ_RECEIVED) > > + sgid_attr = ib_event->param.sidr_req_rcvd.sgid_attr; > > + > > + if (!sgid_attr) > > + return NULL; > > + dev_hold(sgid_attr->ndev); > > + return sgid_attr->ndev; > > +} > > + > > static struct net_device *cma_get_net_dev(struct ib_cm_event *ib_event, > > struct cma_req_info *req) > > { > > @@ -1386,8 +1402,12 @@ static struct net_device *cma_get_net_dev(struct > ib_cm_event *ib_event, > > if (err) > > return ERR_PTR(err); > > > > - net_dev = ib_get_net_dev_by_params(req->device, req->port, req- > >pkey, > > - gid, listen_addr); > > + if (rdma_protocol_roce(req->device, req->port)) > > + net_dev = roce_get_net_dev_by_cm_event(ib_event); > > + else > > + net_dev = ib_get_net_dev_by_params(req->device, req->port, > > + req->pkey, > > + gid, listen_addr); > > if (!net_dev) > > return ERR_PTR(-ENODEV); > > > > @@ -1508,10 +1528,6 @@ static struct rdma_id_private > *cma_id_from_event(struct ib_cm_id *cm_id, > > if (PTR_ERR(*net_dev) == -EAFNOSUPPORT) { > > /* Assuming the protocol is AF_IB */ > > *net_dev = NULL; > > - } else if (rdma_protocol_roce(req.device, req.port)) { > > - /* TODO find the net dev matching the request > parameters > > - * through the RoCE GID table */ > > - *net_dev = NULL; > > } else { > > return ERR_CAST(*net_dev); > > } > > diff --git a/include/rdma/ib_cm.h b/include/rdma/ib_cm.h index > > c98d603c0b63..568708a87239 100644 > > --- a/include/rdma/ib_cm.h > > +++ b/include/rdma/ib_cm.h > > @@ -120,6 +120,13 @@ struct ib_cm_req_event_param { > > struct sa_path_rec *primary_path; > > struct sa_path_rec *alternate_path; > > > > + /* > > + * SGID attribute of the primary path. Currently only > > + * useful for RoCE. Alternate path GID attributes > > + * are not yet supported. > > + */ > > + const struct ib_gid_attr *ppath_sgid_attr; > > + > > __be64 remote_ca_guid; > > u32 remote_qkey; > > u32 remote_qpn; > > @@ -226,6 +233,12 @@ struct ib_cm_apr_event_param { > > struct ib_cm_sidr_req_event_param { > > struct ib_cm_id *listen_id; > > __be64 service_id; > > + > > + /* > > + * SGID attribute of the request. Currently only > > + * useful for RoCE. > > + */ > > + const struct ib_gid_attr *sgid_attr; > > /* P_Key that was used by the GMP's BTH header */ > > u16 bth_pkey; > > u8 port; > > > How does this interop with older CM request packets which doesn't have > ppath_sgid_attr ? Am I missing something ? This is upstream kernel on top of previous patches. So CM requests will have ppath_sgid_attr. ��.n��������+%������w��{.n�����{���fk��ܨ}���Ơz�j:+v�����w����ޙ��&�)ߡ�a����z�ޗ���ݢj��w�f