[PATCH v4 05/22] mm/slab: make caches with sheaves mergeable

Vlastimil Babka posted 22 patches 2 weeks, 3 days ago
[PATCH v4 05/22] mm/slab: make caches with sheaves mergeable
Posted by Vlastimil Babka 2 weeks, 3 days ago
Before enabling sheaves for all caches (with automatically determined
capacity), their enablement should no longer prevent merging of caches.
Limit this merge prevention only to caches that were created with a
specific sheaf capacity, by adding the SLAB_NO_MERGE flag to them.

Reviewed-by: Harry Yoo <harry.yoo@oracle.com>
Signed-off-by: Vlastimil Babka <vbabka@suse.cz>
---
 mm/slab_common.c | 13 +++++++------
 1 file changed, 7 insertions(+), 6 deletions(-)

diff --git a/mm/slab_common.c b/mm/slab_common.c
index ee245a880603..5c15a4ce5743 100644
--- a/mm/slab_common.c
+++ b/mm/slab_common.c
@@ -162,9 +162,6 @@ int slab_unmergeable(struct kmem_cache *s)
 		return 1;
 #endif
 
-	if (s->cpu_sheaves)
-		return 1;
-
 	/*
 	 * We may have set a slab to be unmergeable during bootstrap.
 	 */
@@ -189,9 +186,6 @@ static struct kmem_cache *find_mergeable(unsigned int size, slab_flags_t flags,
 	if (IS_ENABLED(CONFIG_HARDENED_USERCOPY) && args->usersize)
 		return NULL;
 
-	if (args->sheaf_capacity)
-		return NULL;
-
 	flags = kmem_cache_flags(flags, name);
 
 	if (flags & SLAB_NEVER_MERGE)
@@ -336,6 +330,13 @@ struct kmem_cache *__kmem_cache_create_args(const char *name,
 	flags &= ~SLAB_DEBUG_FLAGS;
 #endif
 
+	/*
+	 * Caches with specific capacity are special enough. It's simpler to
+	 * make them unmergeable.
+	 */
+	if (args->sheaf_capacity)
+		flags |= SLAB_NO_MERGE;
+
 	mutex_lock(&slab_mutex);
 
 	err = kmem_cache_sanity_check(name, object_size);

-- 
2.52.0
Re: [PATCH v4 05/22] mm/slab: make caches with sheaves mergeable
Posted by Liam R. Howlett 1 week, 6 days ago
* Vlastimil Babka <vbabka@suse.cz> [260123 01:53]:
> Before enabling sheaves for all caches (with automatically determined
> capacity), their enablement should no longer prevent merging of caches.
> Limit this merge prevention only to caches that were created with a
> specific sheaf capacity, by adding the SLAB_NO_MERGE flag to them.
> 
> Reviewed-by: Harry Yoo <harry.yoo@oracle.com>
> Signed-off-by: Vlastimil Babka <vbabka@suse.cz>

Reviewed-by: Liam R. Howlett <Liam.Howlett@oracle.com>

> ---
>  mm/slab_common.c | 13 +++++++------
>  1 file changed, 7 insertions(+), 6 deletions(-)
> 
> diff --git a/mm/slab_common.c b/mm/slab_common.c
> index ee245a880603..5c15a4ce5743 100644
> --- a/mm/slab_common.c
> +++ b/mm/slab_common.c
> @@ -162,9 +162,6 @@ int slab_unmergeable(struct kmem_cache *s)
>  		return 1;
>  #endif
>  
> -	if (s->cpu_sheaves)
> -		return 1;
> -
>  	/*
>  	 * We may have set a slab to be unmergeable during bootstrap.
>  	 */
> @@ -189,9 +186,6 @@ static struct kmem_cache *find_mergeable(unsigned int size, slab_flags_t flags,
>  	if (IS_ENABLED(CONFIG_HARDENED_USERCOPY) && args->usersize)
>  		return NULL;
>  
> -	if (args->sheaf_capacity)
> -		return NULL;
> -
>  	flags = kmem_cache_flags(flags, name);
>  
>  	if (flags & SLAB_NEVER_MERGE)
> @@ -336,6 +330,13 @@ struct kmem_cache *__kmem_cache_create_args(const char *name,
>  	flags &= ~SLAB_DEBUG_FLAGS;
>  #endif
>  
> +	/*
> +	 * Caches with specific capacity are special enough. It's simpler to
> +	 * make them unmergeable.
> +	 */
> +	if (args->sheaf_capacity)
> +		flags |= SLAB_NO_MERGE;
> +
>  	mutex_lock(&slab_mutex);
>  
>  	err = kmem_cache_sanity_check(name, object_size);
> 
> -- 
> 2.52.0
> 
>