RE: [PATCH rdma-next 1/3] IB/core: Introduce and use sgid_attr in CM requests

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 




> -----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




[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