Patch "RDMA/mlx5: Limit usage of over-sized mkeys from the MR cache" has been added to the 6.10-stable tree

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



This is a note to let you know that I've just added the patch titled

    RDMA/mlx5: Limit usage of over-sized mkeys from the MR cache

to the 6.10-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:
     rdma-mlx5-limit-usage-of-over-sized-mkeys-from-the-m.patch
and it can be found in the queue-6.10 subdirectory.

If you, or anyone else, feels it should not be added to the stable tree,
please let <stable@xxxxxxxxxxxxxxx> know about it.



commit d989eb619439f2f28b620a57fc95af2d5f63e983
Author: Michael Guralnik <michaelgur@xxxxxxxxxx>
Date:   Tue Sep 3 14:24:49 2024 +0300

    RDMA/mlx5: Limit usage of over-sized mkeys from the MR cache
    
    [ Upstream commit ee6d57a2e13d11ce9050cfc3e3b69ef707a44a63 ]
    
    When searching the MR cache for suitable cache entries, don't use mkeys
    larger than twice the size required for the MR.
    This should ensure the usage of mkeys closer to the minimal required size
    and reduce memory waste.
    
    On driver init we create entries for mkeys with clear attributes and
    powers of 2 sizes from 4 to the max supported size.
    This solves the issue for anyone using mkeys that fit these
    requirements.
    
    In the use case where an MR is registered with different attributes,
    like an access flag we can't UMR, we'll create a new cache entry to store
    it upon dereg.
    Without this fix, any later registration with same attributes and smaller
    size will use the newly created cache entry and it's mkeys, disregarding
    the memory waste of using mkeys larger than required.
    
    For example, one worst-case scenario can be when registering and
    deregistering a 1GB mkey with ATS enabled which will cause the creation of
    a new cache entry to hold those type of mkeys. A user registering a 4k MR
    with ATS will end up using the new cache entry and an mkey that can
    support a 1GB MR, thus wasting x250k memory than actually needed in the HW.
    
    Additionally, allow all small registration to use the smallest size
    cache entry that is initialized on driver load even if size is larger
    than twice the required size.
    
    Fixes: 73d09b2fe833 ("RDMA/mlx5: Introduce mlx5r_cache_rb_key")
    Signed-off-by: Michael Guralnik <michaelgur@xxxxxxxxxx>
    Link: https://patch.msgid.link/8ba3a6e3748aace2026de8b83da03aba084f78f4.1725362530.git.leon@xxxxxxxxxx
    Signed-off-by: Leon Romanovsky <leon@xxxxxxxxxx>
    Signed-off-by: Sasha Levin <sashal@xxxxxxxxxx>

diff --git a/drivers/infiniband/hw/mlx5/mr.c b/drivers/infiniband/hw/mlx5/mr.c
index a03557c8416e8..b3a8dc9465c04 100644
--- a/drivers/infiniband/hw/mlx5/mr.c
+++ b/drivers/infiniband/hw/mlx5/mr.c
@@ -48,6 +48,7 @@ enum {
 	MAX_PENDING_REG_MR = 8,
 };
 
+#define MLX5_MR_CACHE_PERSISTENT_ENTRY_MIN_DESCS 4
 #define MLX5_UMR_ALIGN 2048
 
 static void
@@ -659,6 +660,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;
 
 	/*
@@ -677,10 +679,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;
 }
@@ -962,7 +972,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);




[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Index of Archives]     [Linux USB Devel]     [Linux Audio Users]     [Yosemite News]     [Linux Kernel]     [Linux SCSI]

  Powered by Linux