summaryrefslogtreecommitdiff
path: root/drivers/infiniband/hw/hns
diff options
context:
space:
mode:
authoroulijun <oulijun@huawei.com>2017-11-10 16:55:52 +0800
committerDoug Ledford <dledford@redhat.com>2017-11-10 12:32:18 -0500
commit0203b14c4f32b9b6e526db910844222705fc6e5f (patch)
tree2d24c78c7a9507119d28334916686a2043ef32bf /drivers/infiniband/hw/hns
parente8d1853357d237e6af69e384d6b05a23e3a70b93 (diff)
RDMA/hns: Unify the calculation for hem index in hip08
The calculation of hem index are different between hns_roce_table_get and hns_roce_table_find. When the table chunk size of TRRL is not divisible by object size, it will faile to find the trrl table. This patch is to update the calculation of the hem index in the hns_roce_table_find to the same as which in the hns_roce_table_get. Signed-off-by: Shaobo Xu <xushaobo2@huawei.com> Signed-off-by: Lijun Ou <oulijun@huawei.com> Signed-off-by: Doug Ledford <dledford@redhat.com>
Diffstat (limited to 'drivers/infiniband/hw/hns')
-rw-r--r--drivers/infiniband/hw/hns/hns_roce_hem.c10
1 files changed, 6 insertions, 4 deletions
diff --git a/drivers/infiniband/hw/hns/hns_roce_hem.c b/drivers/infiniband/hw/hns/hns_roce_hem.c
index f1f8fa43d59d..8b733a66fae5 100644
--- a/drivers/infiniband/hw/hns/hns_roce_hem.c
+++ b/drivers/infiniband/hw/hns/hns_roce_hem.c
@@ -724,7 +724,8 @@ void *hns_roce_table_find(struct hns_roce_dev *hr_dev,
struct hns_roce_hem *hem;
struct page *page = NULL;
unsigned long mhop_obj = obj;
- unsigned long idx;
+ unsigned long obj_per_chunk;
+ unsigned long idx_offset;
int offset, dma_offset;
int i, j;
u32 hem_idx = 0;
@@ -735,9 +736,10 @@ void *hns_roce_table_find(struct hns_roce_dev *hr_dev,
mutex_lock(&table->mutex);
if (!hns_roce_check_whether_mhop(hr_dev, table->type)) {
- idx = (obj & (table->num_obj - 1)) * table->obj_size;
- hem = table->hem[idx / table->table_chunk_size];
- dma_offset = offset = idx % table->table_chunk_size;
+ obj_per_chunk = table->table_chunk_size / table->obj_size;
+ hem = table->hem[(obj & (table->num_obj - 1)) / obj_per_chunk];
+ idx_offset = (obj & (table->num_obj - 1)) % obj_per_chunk;
+ dma_offset = offset = idx_offset * table->obj_size;
} else {
hns_roce_calc_hem_mhop(hr_dev, table, &mhop_obj, &mhop);
/* mtt mhop */