Skip to content

Commit 9ee2516

Browse files
aharonl-nvidiajgunthorpe
authored andcommitted
RDMA/mlx5: Store ndescs instead of the translation table size
Currently, ent->xlt stores the translation table size. This data should not be stored in the cache entry but be written directly to the mailbox. Store ndescs instead, and deduce the translation table size from it according to the access mode. Link: https://lore.kernel.org/r/e9dbfaa1f279793a6bd28ee5a31cb4f0f0d70f05.1644947594.git.leonro@nvidia.com Signed-off-by: Aharon Landau <aharonl@nvidia.com> Signed-off-by: Leon Romanovsky <leonro@nvidia.com> Signed-off-by: Jason Gunthorpe <jgg@nvidia.com>
1 parent 56561ac commit 9ee2516

File tree

3 files changed

+25
-10
lines changed

3 files changed

+25
-10
lines changed

drivers/infiniband/hw/mlx5/mlx5_ib.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -763,9 +763,9 @@ struct mlx5_cache_ent {
763763

764764
char name[4];
765765
u32 order;
766-
u32 xlt;
767766
u32 access_mode;
768767
u32 page;
768+
unsigned int ndescs;
769769

770770
u8 disabled:1;
771771
u8 fill_to_high_water:1;

drivers/infiniband/hw/mlx5/mr.c

Lines changed: 22 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -176,6 +176,25 @@ static void create_mkey_callback(int status, struct mlx5_async_work *context)
176176
spin_unlock_irqrestore(&ent->lock, flags);
177177
}
178178

179+
static int get_mkc_octo_size(unsigned int access_mode, unsigned int ndescs)
180+
{
181+
int ret = 0;
182+
183+
switch (access_mode) {
184+
case MLX5_MKC_ACCESS_MODE_MTT:
185+
ret = DIV_ROUND_UP(ndescs, MLX5_IB_UMR_OCTOWORD /
186+
sizeof(struct mlx5_mtt));
187+
break;
188+
case MLX5_MKC_ACCESS_MODE_KSM:
189+
ret = DIV_ROUND_UP(ndescs, MLX5_IB_UMR_OCTOWORD /
190+
sizeof(struct mlx5_klm));
191+
break;
192+
default:
193+
WARN_ON(1);
194+
}
195+
return ret;
196+
}
197+
179198
static struct mlx5_ib_mr *alloc_cache_mr(struct mlx5_cache_ent *ent, void *mkc)
180199
{
181200
struct mlx5_ib_mr *mr;
@@ -191,7 +210,8 @@ static struct mlx5_ib_mr *alloc_cache_mr(struct mlx5_cache_ent *ent, void *mkc)
191210
MLX5_SET(mkc, mkc, access_mode_1_0, ent->access_mode & 0x3);
192211
MLX5_SET(mkc, mkc, access_mode_4_2, (ent->access_mode >> 2) & 0x7);
193212

194-
MLX5_SET(mkc, mkc, translations_octword_size, ent->xlt);
213+
MLX5_SET(mkc, mkc, translations_octword_size,
214+
get_mkc_octo_size(ent->access_mode, ent->ndescs));
195215
MLX5_SET(mkc, mkc, log_page_size, ent->page);
196216
return mr;
197217
}
@@ -701,8 +721,7 @@ int mlx5_mr_cache_init(struct mlx5_ib_dev *dev)
701721
continue;
702722

703723
ent->page = PAGE_SHIFT;
704-
ent->xlt = (1 << ent->order) * sizeof(struct mlx5_mtt) /
705-
MLX5_IB_UMR_OCTOWORD;
724+
ent->ndescs = 1 << ent->order;
706725
ent->access_mode = MLX5_MKC_ACCESS_MODE_MTT;
707726
if ((dev->mdev->profile.mask & MLX5_PROF_MASK_MR_CACHE) &&
708727
!dev->is_rep && mlx5_core_is_pf(dev->mdev) &&

drivers/infiniband/hw/mlx5/odp.c

Lines changed: 2 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1598,18 +1598,14 @@ void mlx5_odp_init_mr_cache_entry(struct mlx5_cache_ent *ent)
15981598
switch (ent->order - 2) {
15991599
case MLX5_IMR_MTT_CACHE_ENTRY:
16001600
ent->page = PAGE_SHIFT;
1601-
ent->xlt = MLX5_IMR_MTT_ENTRIES *
1602-
sizeof(struct mlx5_mtt) /
1603-
MLX5_IB_UMR_OCTOWORD;
1601+
ent->ndescs = MLX5_IMR_MTT_ENTRIES;
16041602
ent->access_mode = MLX5_MKC_ACCESS_MODE_MTT;
16051603
ent->limit = 0;
16061604
break;
16071605

16081606
case MLX5_IMR_KSM_CACHE_ENTRY:
16091607
ent->page = MLX5_KSM_PAGE_SHIFT;
1610-
ent->xlt = mlx5_imr_ksm_entries *
1611-
sizeof(struct mlx5_klm) /
1612-
MLX5_IB_UMR_OCTOWORD;
1608+
ent->ndescs = mlx5_imr_ksm_entries;
16131609
ent->access_mode = MLX5_MKC_ACCESS_MODE_KSM;
16141610
ent->limit = 0;
16151611
break;

0 commit comments

Comments
 (0)