diff options
Diffstat (limited to 'drivers/infiniband/hw/mlx5')
| -rw-r--r-- | drivers/infiniband/hw/mlx5/mr.c | 14 | 
1 files changed, 12 insertions, 2 deletions
| diff --git a/drivers/infiniband/hw/mlx5/mr.c b/drivers/infiniband/hw/mlx5/mr.c index 0f90086327fc..81644bb75054 100644 --- a/drivers/infiniband/hw/mlx5/mr.c +++ b/drivers/infiniband/hw/mlx5/mr.c @@ -49,6 +49,7 @@ enum {  	MAX_PENDING_REG_MR = 8,  }; +#define MLX5_MR_CACHE_PERSISTENT_ENTRY_MIN_DESCS 4  #define MLX5_UMR_ALIGN 2048  static void @@ -662,6 +663,7 @@ mkey_cache_ent_from_rb_key(struct mlx5_ib_dev *dev,  {  	struct rb_node *node = dev->cache.rb_root.rb_node;  	struct mlx5_cache_ent *cur, *smallest = NULL; +	u64 ndescs_limit;  	int cmp;  	/* @@ -680,10 +682,18 @@ mkey_cache_ent_from_rb_key(struct mlx5_ib_dev *dev,  			return cur;  	} +	/* +	 * Limit the usage of mkeys larger than twice the required size while +	 * also allowing the usage of smallest cache entry for small MRs. +	 */ +	ndescs_limit = max_t(u64, rb_key.ndescs * 2, +			     MLX5_MR_CACHE_PERSISTENT_ENTRY_MIN_DESCS); +  	return (smallest &&  		smallest->rb_key.access_mode == rb_key.access_mode &&  		smallest->rb_key.access_flags == rb_key.access_flags && -		smallest->rb_key.ats == rb_key.ats) ? +		smallest->rb_key.ats == rb_key.ats && +		smallest->rb_key.ndescs <= ndescs_limit) ?  		       smallest :  		       NULL;  } @@ -964,7 +974,7 @@ int mlx5_mkey_cache_init(struct mlx5_ib_dev *dev)  	mlx5_mkey_cache_debugfs_init(dev);  	mutex_lock(&cache->rb_lock);  	for (i = 0; i <= mkey_cache_max_order(dev); i++) { -		rb_key.ndescs = 1 << (i + 2); +		rb_key.ndescs = MLX5_MR_CACHE_PERSISTENT_ENTRY_MIN_DESCS << i;  		ent = mlx5r_cache_create_ent_locked(dev, rb_key, true);  		if (IS_ERR(ent)) {  			ret = PTR_ERR(ent); |