]> git.ipfire.org Git - thirdparty/kernel/stable.git/commitdiff
RDMA/bnxt_re: Check cqe flags to know imm_data vs inv_irkey
authorKashyap Desai <kashyap.desai@broadcom.com>
Mon, 28 Oct 2024 10:06:54 +0000 (03:06 -0700)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Sat, 14 Dec 2024 18:51:01 +0000 (19:51 +0100)
[ Upstream commit 808ca6de989c598bc5af1ae0ad971a66077efac0 ]

Invalidate rkey is cpu endian and immediate data is in big endian format.
Both immediate data and invalidate the remote key returned by
HW is in little endian format.

While handling the commit in fixes tag, the difference between
immediate data and invalidate rkey endianness was not considered.

Without changes of this patch, Kernel ULP was failing while processing
inv_rkey.

dmesg log snippet -
nvme nvme0: Bogus remote invalidation for rkey 0x2000019Fix in this patch

Do endianness conversion based on completion queue entry flag.
Also, the HW completions are already converted to host endianness in
bnxt_qplib_cq_process_res_rc and bnxt_qplib_cq_process_res_ud and there
is no need to convert it again in bnxt_re_poll_cq. Modified the union to
hold the correct data type.

Fixes: 95b087f87b78 ("bnxt_re: Fix imm_data endianness")
Signed-off-by: Kashyap Desai <kashyap.desai@broadcom.com>
Signed-off-by: Selvin Xavier <selvin.xavier@broadcom.com>
Link: https://patch.msgid.link/1730110014-20755-1-git-send-email-selvin.xavier@broadcom.com
Signed-off-by: Leon Romanovsky <leon@kernel.org>
Signed-off-by: Sasha Levin <sashal@kernel.org>
drivers/infiniband/hw/bnxt_re/ib_verbs.c
drivers/infiniband/hw/bnxt_re/qplib_fp.h

index e29894197f5caad6125396061410089561d90e55..0ce7bdcf988e8bf7ea1413f62f31a64423497ca5 100644 (file)
@@ -3334,7 +3334,7 @@ static void bnxt_re_process_res_shadow_qp_wc(struct bnxt_re_qp *gsi_sqp,
        wc->byte_len = orig_cqe->length;
        wc->qp = &gsi_qp->ib_qp;
 
-       wc->ex.imm_data = cpu_to_be32(le32_to_cpu(orig_cqe->immdata));
+       wc->ex.imm_data = cpu_to_be32(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)) {
@@ -3470,7 +3470,10 @@ int bnxt_re_poll_cq(struct ib_cq *ib_cq, int num_entries, struct ib_wc *wc)
                                 (unsigned long)(cqe->qp_handle),
                                 struct bnxt_re_qp, qplib_qp);
                        wc->qp = &qp->ib_qp;
-                       wc->ex.imm_data = cpu_to_be32(le32_to_cpu(cqe->immdata));
+                       if (cqe->flags & CQ_RES_RC_FLAGS_IMM)
+                               wc->ex.imm_data = cpu_to_be32(cqe->immdata);
+                       else
+                               wc->ex.invalidate_rkey = cqe->invrkey;
                        wc->src_qp = cqe->src_qp;
                        memcpy(wc->smac, cqe->smac, ETH_ALEN);
                        wc->port_num = 1;
index 57a3dae87f65960ff43ec0bfe53f8047a638fe40..13263ce2309d7784c5fd44e3c7743b32cd9be6ed 100644 (file)
@@ -374,7 +374,7 @@ struct bnxt_qplib_cqe {
        u16                             cfa_meta;
        u64                             wr_id;
        union {
-               __le32                  immdata;
+               u32                     immdata;
                u32                     invrkey;
        };
        u64                             qp_handle;