]> git.ipfire.org Git - thirdparty/linux.git/commitdiff
RDMA/bnxt_re: Support 2G message size
authorSelvin Xavier <selvin.xavier@broadcom.com>
Fri, 4 Jul 2025 04:38:56 +0000 (10:08 +0530)
committerLeon Romanovsky <leon@kernel.org>
Mon, 7 Jul 2025 05:37:35 +0000 (01:37 -0400)
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: Selvin Xavier <selvin.xavier@broadcom.com>
Signed-off-by: Shravya KN <shravya.k-n@broadcom.com>
Link: https://patch.msgid.link/20250704043857.19158-3-kalesh-anakkur.purayil@broadcom.com
Reviewed-by: Saravanan Vajravel <saravanan.vajravel@broadcom.com>
Reviewed-by: Kalesh AP <kalesh-anakkur.purayil@broadcom.com>
Signed-off-by: Leon Romanovsky <leon@kernel.org>
drivers/infiniband/hw/bnxt_re/qplib_fp.c
drivers/infiniband/hw/bnxt_re/qplib_fp.h

index be34c605d5167292fbe1dbffad878f15e8ba9709..dfe3177123e545fd67cb0e1bdb43e8a2508faf7e 100644 (file)
@@ -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,
-                                struct bnxt_qplib_swqe *wqe,
-                                u16 *idx)
+static unsigned int bnxt_qplib_put_inline(struct bnxt_qplib_qp *qp,
+                                         struct bnxt_qplib_swqe *wqe,
+                                         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,
-                              struct bnxt_qplib_sge *ssge,
-                              u16 nsge, u16 *idx)
+static unsigned int bnxt_qplib_put_sges(struct bnxt_qplib_hwq *hwq,
+                                       struct bnxt_qplib_sge *ssge,
+                                       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;
index 0d9487c889ff3e318d9c986c1c153e4aae7d0dc0..ab125f1d949eed8ee21f76198b7620bc515359cc 100644 (file)
@@ -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)