Patch "IB/mlx5: Fix cached MR allocation flow" has been added to the 4.13-stable tree
Subsystems (3)
This is a note to let you know that I've just added the patch titled
IB/mlx5: Fix cached MR allocation flow
to the 4.13-stable tree which can be found at:
http://www.kernel.org/git/?p=linux/kernel/git/stable/stable-queue.git;a=summary
The filename of the patch is:
ib-mlx5-fix-cached-mr-allocation-flow.patch
and it can be found in the queue-4.13 subdirectory.
If you, or anyone else, feels it should not be added to the stable tree, please let <[email protected]> know about it.
Quoted 1 line
From
4c25b7a39005c9243a492b577c3e940eeac36a25Mon Sep 17 00:00:00 2001
From: Majd Dibbiny <[email protected]>
Date: Mon, 12 Jun 2017 10:36:15 +0300
Subject: IB/mlx5: Fix cached MR allocation flow
From: Majd Dibbiny <[email protected]>
commit 4c25b7a39005c9243a492b577c3e940eeac36a25 upstream.
When we have a miss in one order of the mkey cache, we try to get an mkey from a higher order.
We still need to check that the higher order can be used with UMR before using it. Otherwise, we will get an mkey with 0 entries and the post send operation that is used to fill it will complete with the following error:
mlx5_0:dump_cqe:275:(pid 0): dump error cqe
00000000 00000000 00000000 00000000
00000000 00000000 00000000 00000000
00000000 0f007806 25000025 49ce59d2
--- drivers/infiniband/hw/mlx5/mr.c | 18 +++++++++++++----- 1 file changed, 13 insertions(+), 5 deletions(-)
drivers/infiniband/hw/mlx5/mr.c +13 -5
@@ -48,6 +48,7 @@ enum {#define MLX5_UMR_ALIGN 2048static int clean_mr (struct mlx5_ib_mr *mr); +static int max_umr_order (struct mlx5_ib_dev *dev);static int use_umr (struct mlx5_ib_dev *dev,int order);static int unreg_umr (struct mlx5_ib_dev *dev,struct mlx5_ib_mr *mr);
@@ -491,16 +492,18 @@ static struct mlx5_ib_mr *alloc_cached_mstruct mlx5_mr_cache *cache = &dev->cache;struct mlx5_ib_mr *mr =NULL ;struct mlx5_cache_ent *ent; +int last_umr_cache_entry;int c;int i; c =order2idx (dev, order); -if (c <0 || c >MAX_UMR_CACHE_ENTRY ) { + last_umr_cache_entry =order2idx (dev,max_umr_order (dev)); +if (c <0 || c > last_umr_cache_entry) {mlx5_ib_warn (dev,"order %d, cache index %d\n" , order, c);return NULL ; } -for (i = c; i <MAX_UMR_CACHE_ENTRY ; i++) { +for (i = c; i <= last_umr_cache_entry; i++) { ent = &cache->ent[i];mlx5_ib_dbg (dev,"order %d, cache index %d\n" , ent->order, i);
@@ -816,11 +819,16 @@ static int get_octo_len(u64 addr, u64 lereturn (npages +1 ) /2 ; } -static int use_umr (struct mlx5_ib_dev *dev,int order) +static int max_umr_order (struct mlx5_ib_dev *dev) {if (MLX5_CAP_GEN (dev->mdev, umr_extended_translation_offset)) -return order <=MAX_UMR_CACHE_ENTRY +2 ; -return order <=MLX5_MAX_UMR_SHIFT ; +return MAX_UMR_CACHE_ENTRY +2 ; +return MLX5_MAX_UMR_SHIFT ; +} + +static int use_umr (struct mlx5_ib_dev *dev,int order) +{ +return order <=max_umr_order (dev); } static int mr_umem_get(struct ib_pd *pd, u64 start, u64 length,
Patches currently in stable-queue which might be from [email protected] are
queue-4.13/ib-mlx5-fix-cached-mr-allocation-flow.patch