Thomas Bogendoerfer 7d1f84
From: Selvin Xavier <selvin.xavier@broadcom.com>
Thomas Bogendoerfer 7d1f84
Date: Wed, 15 Sep 2021 05:32:39 -0700
Thomas Bogendoerfer 7d1f84
Subject: RDMA/bnxt_re: Fix FRMR issue with single page MR allocation
Thomas Bogendoerfer 7d1f84
Patch-mainline: v5.16-rc1
Thomas Bogendoerfer 7d1f84
Git-commit: 2b4ccce6cafae8eff0daec06b7652d9ab75f692f
Thomas Bogendoerfer 7d1f84
References: jsc#SLE-18977
Thomas Bogendoerfer 7d1f84
Thomas Bogendoerfer 7d1f84
When the FRMR is allocated with single page, driver is attempting to
Thomas Bogendoerfer 7d1f84
create a level 0 HWQ and not allocating any page because the nopte field
Thomas Bogendoerfer 7d1f84
is set. This causes the crash during post_send as the pbl is not
Thomas Bogendoerfer 7d1f84
populated.
Thomas Bogendoerfer 7d1f84
Thomas Bogendoerfer 7d1f84
To avoid this crash, check for the nopte bit during HWQ creation with
Thomas Bogendoerfer 7d1f84
single page and create a level 1 page table and populate the pbl address
Thomas Bogendoerfer 7d1f84
correctly.
Thomas Bogendoerfer 7d1f84
Thomas Bogendoerfer 7d1f84
Link: https://lore.kernel.org/r/1631709163-2287-9-git-send-email-selvin.xavier@broadcom.com
Thomas Bogendoerfer 7d1f84
Reviewed-by: Leon Romanovsky <leonro@nvidia.com>
Thomas Bogendoerfer 7d1f84
Signed-off-by: Selvin Xavier <selvin.xavier@broadcom.com>
Thomas Bogendoerfer 7d1f84
Signed-off-by: Jason Gunthorpe <jgg@nvidia.com>
Thomas Bogendoerfer 7d1f84
Acked-by: Thomas Bogendoerfer <tbogendoerfer@suse.de>
Thomas Bogendoerfer 7d1f84
---
Thomas Bogendoerfer 7d1f84
 drivers/infiniband/hw/bnxt_re/qplib_res.c |    5 +++--
Thomas Bogendoerfer 7d1f84
 1 file changed, 3 insertions(+), 2 deletions(-)
Thomas Bogendoerfer 7d1f84
Thomas Bogendoerfer 7d1f84
--- a/drivers/infiniband/hw/bnxt_re/qplib_res.c
Thomas Bogendoerfer 7d1f84
+++ b/drivers/infiniband/hw/bnxt_re/qplib_res.c
Thomas Bogendoerfer 7d1f84
@@ -228,15 +228,16 @@ int bnxt_qplib_alloc_init_hwq(struct bnx
Thomas Bogendoerfer 7d1f84
 				npages++;
Thomas Bogendoerfer 7d1f84
 	}
Thomas Bogendoerfer 7d1f84
 
Thomas Bogendoerfer 7d1f84
-	if (npages == MAX_PBL_LVL_0_PGS) {
Thomas Bogendoerfer 7d1f84
+	if (npages == MAX_PBL_LVL_0_PGS && !hwq_attr->sginfo->nopte) {
Thomas Bogendoerfer 7d1f84
 		/* This request is Level 0, map PTE */
Thomas Bogendoerfer 7d1f84
 		rc = __alloc_pbl(res, &hwq->pbl[PBL_LVL_0], hwq_attr->sginfo);
Thomas Bogendoerfer 7d1f84
 		if (rc)
Thomas Bogendoerfer 7d1f84
 			goto fail;
Thomas Bogendoerfer 7d1f84
 		hwq->level = PBL_LVL_0;
Thomas Bogendoerfer 7d1f84
+		goto done;
Thomas Bogendoerfer 7d1f84
 	}
Thomas Bogendoerfer 7d1f84
 
Thomas Bogendoerfer 7d1f84
-	if (npages > MAX_PBL_LVL_0_PGS) {
Thomas Bogendoerfer 7d1f84
+	if (npages >= MAX_PBL_LVL_0_PGS) {
Thomas Bogendoerfer 7d1f84
 		if (npages > MAX_PBL_LVL_1_PGS) {
Thomas Bogendoerfer 7d1f84
 			u32 flag = (hwq_attr->type == HWQ_TYPE_L2_CMPL) ?
Thomas Bogendoerfer 7d1f84
 				    0 : PTU_PTE_VALID;