diff mbox series

[for-next,2/3] RDMA/hns:Fix bug that caused srq creation to fail

Message ID 1554614619-27024-3-git-send-email-oulijun@huawei.com (mailing list archive)
State Accepted
Delegated to: Jason Gunthorpe
Headers show
Series None | expand

Commit Message

Lijun Ou April 7, 2019, 5:23 a.m. UTC
Due to the incorrect use of the seg and obj information,
the position of the mtt is calculated incorrectly,
and the free space of the page is not enough to store the entire mtt,
resulting in access to the next page. This patch fixes this problem.

[  863.358993] Unable to handle kernel paging request at virtual address ffff00006e3cd000
...
[  863.551180] Call trace:
[  863.553616]  hns_roce_write_mtt+0x154/0x2f0 [hns_roce]
[  863.558742]  hns_roce_buf_write_mtt+0xa8/0xd8 [hns_roce]
[  863.564042]  hns_roce_create_srq+0x74c/0x808 [hns_roce]
[  863.569255]  ib_create_srq+0x28/0xc8

Fixes: 6ed42c196fb7 ("RDMA/hns: Unify the calculation for hem index in hip08")
Signed-off-by: chenglang <chenglang@huawei.com>
Signed-off-by: Lijun Ou <oulijun@huawei.com>
---
 drivers/infiniband/hw/hns/hns_roce_hem.c | 6 ++++--
 drivers/infiniband/hw/hns/hns_roce_mr.c  | 4 ++--
 2 files changed, 6 insertions(+), 4 deletions(-)

Comments

Jason Gunthorpe April 8, 2019, 4:30 p.m. UTC | #1
On Sun, Apr 07, 2019 at 01:23:38PM +0800, Lijun Ou wrote:
> Due to the incorrect use of the seg and obj information,
> the position of the mtt is calculated incorrectly,
> and the free space of the page is not enough to store the entire mtt,
> resulting in access to the next page. This patch fixes this problem.
> 
> [  863.358993] Unable to handle kernel paging request at virtual address ffff00006e3cd000
> ...
> [  863.551180] Call trace:
> [  863.553616]  hns_roce_write_mtt+0x154/0x2f0 [hns_roce]
> [  863.558742]  hns_roce_buf_write_mtt+0xa8/0xd8 [hns_roce]
> [  863.564042]  hns_roce_create_srq+0x74c/0x808 [hns_roce]
> [  863.569255]  ib_create_srq+0x28/0xc8
> 
> Fixes: 6ed42c196fb7 ("RDMA/hns: Unify the calculation for hem index in hip08")

This fixes line is wrong, I fixed it for you but be more careful in
future:

    Fixes: 0203b14c4f32 ("RDMA/hns: Unify the calculation for hem index in hip08")

Jason
diff mbox series

Patch

diff --git a/drivers/infiniband/hw/hns/hns_roce_hem.c b/drivers/infiniband/hw/hns/hns_roce_hem.c
index f1fec56..8e29dbb 100644
--- a/drivers/infiniband/hw/hns/hns_roce_hem.c
+++ b/drivers/infiniband/hw/hns/hns_roce_hem.c
@@ -792,6 +792,8 @@  void *hns_roce_table_find(struct hns_roce_dev *hr_dev,
 		idx_offset = (obj & (table->num_obj - 1)) % obj_per_chunk;
 		dma_offset = offset = idx_offset * table->obj_size;
 	} else {
+		u32 seg_size = 64; /* 8 bytes per BA and 8 BA per segment */
+
 		hns_roce_calc_hem_mhop(hr_dev, table, &mhop_obj, &mhop);
 		/* mtt mhop */
 		i = mhop.l0_idx;
@@ -803,8 +805,8 @@  void *hns_roce_table_find(struct hns_roce_dev *hr_dev,
 			hem_idx = i;
 
 		hem = table->hem[hem_idx];
-		dma_offset = offset = (obj & (table->num_obj - 1)) *
-				       table->obj_size % mhop.bt_chunk_size;
+		dma_offset = offset = (obj & (table->num_obj - 1)) * seg_size %
+				       mhop.bt_chunk_size;
 		if (mhop.hop_num == 2)
 			dma_offset = offset = 0;
 	}
diff --git a/drivers/infiniband/hw/hns/hns_roce_mr.c b/drivers/infiniband/hw/hns/hns_roce_mr.c
index b09f1cd..08be0e4 100644
--- a/drivers/infiniband/hw/hns/hns_roce_mr.c
+++ b/drivers/infiniband/hw/hns/hns_roce_mr.c
@@ -746,7 +746,6 @@  static int hns_roce_write_mtt_chunk(struct hns_roce_dev *hr_dev,
 	struct hns_roce_hem_table *table;
 	dma_addr_t dma_handle;
 	__le64 *mtts;
-	u32 s = start_index * sizeof(u64);
 	u32 bt_page_size;
 	u32 i;
 
@@ -780,7 +779,8 @@  static int hns_roce_write_mtt_chunk(struct hns_roce_dev *hr_dev,
 		return -EINVAL;
 
 	mtts = hns_roce_table_find(hr_dev, table,
-				mtt->first_seg + s / hr_dev->caps.mtt_entry_sz,
+				mtt->first_seg +
+				start_index / HNS_ROCE_MTT_ENTRY_PER_SEG,
 				&dma_handle);
 	if (!mtts)
 		return -ENOMEM;