Slab merge is good feature to reduce fragmentation. If new creating slab have similar size and property with exsitent slab, this feature reuse it rather than creating new one. As a result, objects are packed into fewer slabs so that fragmentation is reduced.
Below is result of my testing. * After boot, sleep 20; cat /proc/meminfo | grep Slab <Before> Slab: 25136 kB <After> Slab: 24364 kB We can save 3% memory used by slab. For supporting this feature in SLAB, we need to implement SLAB specific kmem_cache_flag() and __kmem_cache_alias(), because SLUB implements some SLUB specific processing related to debug flag and object size change on these functions. v2: add commit description for the reason to implement SLAB specific functions. Signed-off-by: Joonsoo Kim <iamjoonsoo....@lge.com> --- mm/slab.c | 20 ++++++++++++++++++++ mm/slab.h | 2 +- 2 files changed, 21 insertions(+), 1 deletion(-) diff --git a/mm/slab.c b/mm/slab.c index 5927a17..cc246f2 100644 --- a/mm/slab.c +++ b/mm/slab.c @@ -2104,6 +2104,26 @@ static int __init_refok setup_cpu_cache(struct kmem_cache *cachep, gfp_t gfp) return 0; } +unsigned long kmem_cache_flags(unsigned long object_size, + unsigned long flags, const char *name, + void (*ctor)(void *)) +{ + return flags; +} + +struct kmem_cache * +__kmem_cache_alias(const char *name, size_t size, size_t align, + unsigned long flags, void (*ctor)(void *)) +{ + struct kmem_cache *cachep; + + cachep = find_mergeable(size, align, flags, name, ctor); + if (cachep) + cachep->refcount++; + + return cachep; +} + /** * __kmem_cache_create - Create a cache. * @cachep: cache management descriptor diff --git a/mm/slab.h b/mm/slab.h index 857758b..46c7c25 100644 --- a/mm/slab.h +++ b/mm/slab.h @@ -90,7 +90,7 @@ struct mem_cgroup; int slab_unmergeable(struct kmem_cache *s); struct kmem_cache *find_mergeable(size_t size, size_t align, unsigned long flags, const char *name, void (*ctor)(void *)); -#ifdef CONFIG_SLUB +#ifndef CONFIG_SLOB struct kmem_cache * __kmem_cache_alias(const char *name, size_t size, size_t align, unsigned long flags, void (*ctor)(void *)); -- 1.7.9.5 -- To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to majord...@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/