Commit 0aed8173 authored by Selvin Xavier's avatar Selvin Xavier Committed by Leon Romanovsky
Browse files

RDMA/bnxt_re: Support 2G message size



bnxt_qplib_put_sges is calculating the length in
a signed int. So handling the 2G message size
is not working since it is considered as negative.

Use a unsigned number to calculate the total message
length. As per the spec, IB message size shall be
between zero and 2^31 bytes (inclusive). So adding
a check for 2G message size.

Signed-off-by: default avatarSelvin Xavier <selvin.xavier@broadcom.com>
Signed-off-by: default avatarShravya KN <shravya.k-n@broadcom.com>
Link: https://patch.msgid.link/20250704043857.19158-3-kalesh-anakkur.purayil@broadcom.com


Reviewed-by: default avatarSaravanan Vajravel <saravanan.vajravel@broadcom.com>
Reviewed-by: default avatarKalesh AP <kalesh-anakkur.purayil@broadcom.com>
Signed-off-by: default avatarLeon Romanovsky <leon@kernel.org>
parent 09d231ab
Loading
Loading
Loading
Loading
+14 −14
Original line number Diff line number Diff line
@@ -1750,9 +1750,9 @@ static void bnxt_qplib_fill_psn_search(struct bnxt_qplib_qp *qp,
	}
}

static int bnxt_qplib_put_inline(struct bnxt_qplib_qp *qp,
static unsigned int bnxt_qplib_put_inline(struct bnxt_qplib_qp *qp,
					  struct bnxt_qplib_swqe *wqe,
				 u16 *idx)
					  u32 *idx)
{
	struct bnxt_qplib_hwq *hwq;
	int len, t_len, offt;
@@ -1769,7 +1769,7 @@ static int bnxt_qplib_put_inline(struct bnxt_qplib_qp *qp,
		il_src = (void *)wqe->sg_list[indx].addr;
		t_len += len;
		if (t_len > qp->max_inline_data)
			return -ENOMEM;
			return BNXT_RE_INVAL_MSG_SIZE;
		while (len) {
			if (pull_dst) {
				pull_dst = false;
@@ -1795,9 +1795,9 @@ static int bnxt_qplib_put_inline(struct bnxt_qplib_qp *qp,
	return t_len;
}

static u32 bnxt_qplib_put_sges(struct bnxt_qplib_hwq *hwq,
static unsigned int bnxt_qplib_put_sges(struct bnxt_qplib_hwq *hwq,
					struct bnxt_qplib_sge *ssge,
			       u16 nsge, u16 *idx)
					u32 nsge, u32 *idx)
{
	struct sq_sge *dsge;
	int indx, len = 0;
@@ -1878,14 +1878,12 @@ int bnxt_qplib_post_send(struct bnxt_qplib_qp *qp,
	struct bnxt_qplib_hwq *hwq;
	struct bnxt_qplib_swq *swq;
	bool sch_handler = false;
	u32 wqe_idx, slots, idx;
	u16 wqe_sz, qdf = 0;
	bool msn_update;
	void *base_hdr;
	void *ext_hdr;
	__le32 temp32;
	u32 wqe_idx;
	u32 slots;
	u16 idx;

	hwq = &sq->hwq;
	if (qp->state != CMDQ_MODIFY_QP_NEW_STATE_RTS &&
@@ -1937,8 +1935,10 @@ int bnxt_qplib_post_send(struct bnxt_qplib_qp *qp,
	else
		data_len = bnxt_qplib_put_sges(hwq, wqe->sg_list, wqe->num_sge,
					       &idx);
	if (data_len < 0)
		goto queue_err;
	if (data_len > BNXT_RE_MAX_MSG_SIZE) {
		rc = -EINVAL;
		goto done;
	}
	/* Make sure we update MSN table only for wired wqes */
	msn_update = true;
	/* Specifics */
@@ -2139,8 +2139,8 @@ int bnxt_qplib_post_recv(struct bnxt_qplib_qp *qp,
	struct bnxt_qplib_hwq *hwq;
	struct bnxt_qplib_swq *swq;
	bool sch_handler = false;
	u16 wqe_sz, idx;
	u32 wqe_idx;
	u32 wqe_idx, idx;
	u16 wqe_sz;
	int rc = 0;

	hwq = &rq->hwq;
+3 −0
Original line number Diff line number Diff line
@@ -346,6 +346,9 @@ struct bnxt_qplib_qp {
	u8				tos_dscp;
};

#define BNXT_RE_MAX_MSG_SIZE	0x80000000
#define BNXT_RE_INVAL_MSG_SIZE	0xFFFFFFFF

#define BNXT_QPLIB_MAX_CQE_ENTRY_SIZE	sizeof(struct cq_base)

#define CQE_CNT_PER_PG		(PAGE_SIZE / BNXT_QPLIB_MAX_CQE_ENTRY_SIZE)