RE: [PATCH for-next 4/6] IB/CM: Change sgid to IB GID when handling CM request

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

 



Hi Dennis,

> -----Original Message-----
> From: linux-rdma-owner@xxxxxxxxxxxxxxx [mailto:linux-rdma-
> owner@xxxxxxxxxxxxxxx] On Behalf Of Dennis Dalessandro
> Sent: Tuesday, November 14, 2017 6:35 AM
> To: dledford@xxxxxxxxxx
> Cc: linux-rdma@xxxxxxxxxxxxxxx; Don Hiatt <don.hiatt@xxxxxxxxx>; Ira Weiny
> <ira.weiny@xxxxxxxxx>
> Subject: [PATCH for-next 4/6] IB/CM: Change sgid to IB GID when handling CM
> request
> 
> From: Don Hiatt <don.hiatt@xxxxxxxxx>
> 
> ULPs do not understand OPA GIDs and will reject CM requests if the sgid does
> not match the local_gid. In order to fix this behavior we convert the OPA GID
> back to an IB GID.
> 
> Reviewed-by: Ira Weiny <ira.weiny@xxxxxxxxx>
> Signed-off-by: Don Hiatt <don.hiatt@xxxxxxxxx>
> Signed-off-by: Dennis Dalessandro <dennis.dalessandro@xxxxxxxxx>
> ---
>  drivers/infiniband/core/cm.c |   38
> ++++++++++++++++++++++++++++++++++++--
>  1 files changed, 36 insertions(+), 2 deletions(-)
> 
> diff --git a/drivers/infiniband/core/cm.c b/drivers/infiniband/core/cm.c index
> 5927ee4..f9f6f5e 100644
> --- a/drivers/infiniband/core/cm.c
> +++ b/drivers/infiniband/core/cm.c
> @@ -1560,6 +1560,37 @@ static u16 cm_get_bth_pkey(struct cm_work *work)
>  	return pkey;
>  }
> 
> +/**
> + * Convert OPA SGID to IB SGID
> + * ULPs (such as IPoIB) do not understand OPA GIDs and will
> + * reject them as the local_gid will not match the sgid. Therefore,
> + * change the pathrec's SGID to an IB SGID.
> + *
Address and other conversions are in ib_sa.h such as path_conv_opa_to_ib().
Do path_conv_opa_to_ib function also need such opa to ib gid conversion?
Can you place cm_opa_to_ib_sgid function in core/addr.c as it deals with addresses.

While replying back to CM request, is it ok to reply back with IB GID and reverse conversion not needed or it replies with OPA GID?

> + * @work: Work completion
> + * @path: Path record
> + */
> +static void cm_opa_to_ib_sgid(struct cm_work *work,
> +			      struct sa_path_rec *path)
> +{
> +	struct ib_device *dev = work->port->cm_dev->ib_device;
> +	struct ib_gid_attr gid_attr;
> +	u8 port_num = work->port->port_num;
> +
> +	if (rdma_cap_opa_ah(dev, port_num) &&
> +	    (ib_is_opa_gid(&path->sgid))) {
> +		union ib_gid sgid;
> +
> +		if (ib_get_cached_gid(dev, port_num, 0,
Only gid 0 needs conversion?

> +				      &sgid, &gid_attr)) {
Since gid attribute is not used here and applicable to RoCE and its optional, can you pass NULL and avoid gid_attr?

> +			dev_warn(&dev->dev,
> +				 "Error updating sgid in CM request\n");
> +			return;
> +		}
> +
> +		path->sgid = sgid;
> +	}
> +}
> +
>  static void cm_format_req_event(struct cm_work *work,
>  				struct cm_id_private *cm_id_priv,
>  				struct ib_cm_id *listen_id)
> @@ -1573,10 +1604,13 @@ static void cm_format_req_event(struct cm_work
> *work,
>  	param->bth_pkey = cm_get_bth_pkey(work);
>  	param->port = cm_id_priv->av.port->port_num;
>  	param->primary_path = &work->path[0];
> -	if (req_msg->alt_local_lid)
> +	cm_opa_to_ib_sgid(work, param->primary_path);
> +	if (cm_req_has_alt_path(req_msg)) {
>  		param->alternate_path = &work->path[1];
> -	else
> +		cm_opa_to_ib_sgid(work, param->alternate_path);
> +	} else {
>  		param->alternate_path = NULL;
> +	}
>  	param->remote_ca_guid = req_msg->local_ca_guid;
>  	param->remote_qkey = be32_to_cpu(req_msg->local_qkey);
>  	param->remote_qpn = be32_to_cpu(cm_req_get_local_qpn(req_msg));
> 
> --
> To unsubscribe from this list: send the line "unsubscribe linux-rdma" in the body
> of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at
> http://vger.kernel.org/majordomo-info.html
��.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