|
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;
|