]> git.hungrycats.org Git - linux/commitdiff
RDMA/bnxt_re: Fix a bug while setting up Level-2 PBL pages
authorBhargava Chenna Marreddy <bhargava.marreddy@broadcom.com>
Tue, 8 Oct 2024 07:41:41 +0000 (00:41 -0700)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Fri, 8 Nov 2024 15:21:57 +0000 (16:21 +0100)
[ Upstream commit 7988bdbbb85ac85a847baf09879edcd0f70521dc ]

Avoid memory corruption while setting up Level-2 PBL pages for the non MR
resources when num_pages > 256K.

There will be a single PDE page address (contiguous pages in the case of >
PAGE_SIZE), but, current logic assumes multiple pages, leading to invalid
memory access after 256K PBL entries in the PDE.

Fixes: 0c4dcd602817 ("RDMA/bnxt_re: Refactor hardware queue memory allocation")
Link: https://patch.msgid.link/r/1728373302-19530-10-git-send-email-selvin.xavier@broadcom.com
Signed-off-by: Bhargava Chenna Marreddy <bhargava.marreddy@broadcom.com>
Signed-off-by: Selvin Xavier <selvin.xavier@broadcom.com>
Signed-off-by: Jason Gunthorpe <jgg@nvidia.com>
Signed-off-by: Sasha Levin <sashal@kernel.org>
drivers/infiniband/hw/bnxt_re/qplib_res.c

index 2861a2bbea6e4089c5904feee74e211a5cab59d9..af23e57fc78ed0bca6fbe9beeb124779d398d430 100644 (file)
@@ -256,22 +256,9 @@ int bnxt_qplib_alloc_init_hwq(struct bnxt_qplib_hwq *hwq,
                        dst_virt_ptr =
                                (dma_addr_t **)hwq->pbl[PBL_LVL_0].pg_arr;
                        src_phys_ptr = hwq->pbl[PBL_LVL_1].pg_map_arr;
-                       if (hwq_attr->type == HWQ_TYPE_MR) {
-                       /* For MR it is expected that we supply only 1 contigous
-                        * page i.e only 1 entry in the PDL that will contain
-                        * all the PBLs for the user supplied memory region
-                        */
-                               for (i = 0; i < hwq->pbl[PBL_LVL_1].pg_count;
-                                    i++)
-                                       dst_virt_ptr[0][i] = src_phys_ptr[i] |
-                                               flag;
-                       } else {
-                               for (i = 0; i < hwq->pbl[PBL_LVL_1].pg_count;
-                                    i++)
-                                       dst_virt_ptr[PTR_PG(i)][PTR_IDX(i)] =
-                                               src_phys_ptr[i] |
-                                               PTU_PDE_VALID;
-                       }
+                       for (i = 0; i < hwq->pbl[PBL_LVL_1].pg_count; i++)
+                               dst_virt_ptr[0][i] = src_phys_ptr[i] | flag;
+
                        /* Alloc or init PTEs */
                        rc = __alloc_pbl(res, &hwq->pbl[PBL_LVL_2],
                                         hwq_attr->sginfo);