RE: [PATCH] RDMA/bnxt_re: report vlan_id and sl in qp1 recv completion

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

 




> -----Original Message-----
> From: Devesh Sharma [mailto:devesh.sharma@xxxxxxxxxxxx]
> Sent: Tuesday, November 07, 2017 11:45 PM
> To: dledford@xxxxxxxxxx
> Cc: linux-rdma@xxxxxxxxxxxxxxx; Parav Pandit <parav@xxxxxxxxxxxx>;
> leon@xxxxxxxxxx; Devesh Sharma <devesh.sharma@xxxxxxxxxxxx>
> Subject: [PATCH] RDMA/bnxt_re: report vlan_id and sl in qp1 recv completion
> 
> In a real RoCE v2 network it is possible to have two Sections of network have
> same IP hence same gid. However those may have different vlans. During
> connection resolution it is important to report the actual vlan on which the MAD
> packet was received instead of relying on other means to resolve vlan-id.
> ib_find_gid_index should not be used to resolve the vlan-id using sgid of the
> local system where the packet was received.
> 
> Our device has the capability to report the actual VLAN-ID in the GSI qp
> completions. Since we have the capability our driver should move away from
> resolving the vlan-id with the help of SGID at the destination port.
> 
> Signed-off-by: Devesh Sharma <devesh.sharma@xxxxxxxxxxxx>
> Reported-by: Parav Pandit <parav@xxxxxxxxxxxx>
> ---
>  drivers/infiniband/hw/bnxt_re/ib_verbs.c | 33
> ++++++++++++++++++++++++++++++++
> drivers/infiniband/hw/bnxt_re/qplib_fp.c |  1 +
>  2 files changed, 34 insertions(+)
> 
> diff --git a/drivers/infiniband/hw/bnxt_re/ib_verbs.c
> b/drivers/infiniband/hw/bnxt_re/ib_verbs.c
> index ebcdfb4..558d786 100644
> --- a/drivers/infiniband/hw/bnxt_re/ib_verbs.c
> +++ b/drivers/infiniband/hw/bnxt_re/ib_verbs.c
> @@ -2771,6 +2771,32 @@ static void bnxt_re_process_res_rawqp1_wc(struct
> ib_wc *wc,
>  	wc->wc_flags |= IB_WC_GRH;
>  }
> 
> +static bool bnxt_re_is_vlan_pkt(struct bnxt_qplib_cqe *orig_cqe,
> +				u16 *vid, u8 *sl)
> +{
> +	u32 metadata;
> +	u16 tpid;
> +	bool ret = false;
> +
Large number of places reverse Christmas tree reverse order is not followed, but let's try to follow for newly added code  like below.
	bool ret = false;
	u32 metadata;
	u16 tpid;

> +	metadata = orig_cqe->raweth_qp1_metadata;
> +	if (orig_cqe->raweth_qp1_flags2 &
> +
> 	CQ_RES_RAWETH_QP1_RAWETH_QP1_FLAGS2_META_FORMAT_VLAN)
> {
> +		tpid = ((metadata &
> +
> CQ_RES_RAWETH_QP1_RAWETH_QP1_METADATA_TPID_MASK) >>
> +
> CQ_RES_RAWETH_QP1_RAWETH_QP1_METADATA_TPID_SFT);
> +		if (tpid == ETH_P_8021Q) {
> +			*vid = metadata &
> +
> CQ_RES_RAWETH_QP1_RAWETH_QP1_METADATA_VID_MASK;
> +			*sl = (metadata &
> +
> CQ_RES_RAWETH_QP1_RAWETH_QP1_METADATA_PRI_MASK) >>
> +
> CQ_RES_RAWETH_QP1_RAWETH_QP1_METADATA_PRI_SFT;
> +			ret = true;
> +		}
> +	}
> +
> +	return ret;
> +}
> +
>  static void bnxt_re_process_res_rc_wc(struct ib_wc *wc,
>  				      struct bnxt_qplib_cqe *cqe)
>  {
> @@ -2796,6 +2822,8 @@ static void
> bnxt_re_process_res_shadow_qp_wc(struct bnxt_re_qp *qp,
>  	struct bnxt_qplib_cqe *orig_cqe = NULL;
>  	struct bnxt_re_sqp_entries *sqp_entry = NULL;
>  	int nw_type;
> +	u16 vlan_id;
> +	u8 sl;
> 
>  	tbl_idx = cqe->wr_id;
> 
> @@ -2810,6 +2838,11 @@ static void
> bnxt_re_process_res_shadow_qp_wc(struct bnxt_re_qp *qp,
>  	wc->ex.imm_data = orig_cqe->immdata;
>  	wc->src_qp = orig_cqe->src_qp;
>  	memcpy(wc->smac, orig_cqe->smac, ETH_ALEN);
> +	if (bnxt_re_is_vlan_pkt(orig_cqe, &vlan_id, &sl)) {
> +		wc->vlan_id = vlan_id;
> +		wc->sl = sl;
> +		wc->wc_flags |= IB_WC_WITH_VLAN;
> +	}
>  	wc->port_num = 1;
>  	wc->vendor_err = orig_cqe->status;
> 
> diff --git a/drivers/infiniband/hw/bnxt_re/qplib_fp.c
> b/drivers/infiniband/hw/bnxt_re/qplib_fp.c
> index a82044d..8962621 100644
> --- a/drivers/infiniband/hw/bnxt_re/qplib_fp.c
> +++ b/drivers/infiniband/hw/bnxt_re/qplib_fp.c
> @@ -2236,6 +2236,7 @@ static int
> bnxt_qplib_cq_process_res_raweth_qp1(struct bnxt_qplib_cq *cq,
> 
>  	cqe->raweth_qp1_flags = le16_to_cpu(hwcqe->raweth_qp1_flags);
>  	cqe->raweth_qp1_flags2 = le32_to_cpu(hwcqe->raweth_qp1_flags2);
> +	cqe->raweth_qp1_metadata = le32_to_cpu(hwcqe-
> >raweth_qp1_metadata);
> 
>  	rq = &qp->rq;
>  	if (wr_id_idx > rq->hwq.max_elements) {
> --
> 1.8.3.1

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




[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