[SLUB] Add defrag_ratio field and sysfs support. The defrag_ratio is used to set the threshold when a slabcache should be defragmented. The allocation ratio is measured in percentage of the available slots for objects in use. The percentage will be lower for slabs that are more fragmented. Add a defrag ratio field and set it to 30% by default. 30% means that less than 3 out of 10 available slots for objects are in use. Signed-off-by: Christoph Lameter --- include/linux/slub_def.h | 7 +++++++ mm/slub.c | 18 ++++++++++++++++++ 2 files changed, 25 insertions(+), 0 deletions(-) diff --git a/include/linux/slub_def.h b/include/linux/slub_def.h index bffca06..5dc89a5 100644 --- a/include/linux/slub_def.h +++ b/include/linux/slub_def.h @@ -44,6 +44,13 @@ struct kmem_cache { void (*ctor)(void *, struct kmem_cache *, unsigned long); int inuse; /* Offset to metadata */ int align; /* Alignment */ + int defrag_ratio; /* + * objects/possible-objects limit. If we have + * less that the specified percentage of + * objects allocated then defrag passes + * will start to occur during reclaim. + */ + const char *name; /* Name (only for display!) */ struct list_head list; /* List of slab caches */ #ifdef CONFIG_SLUB_DEBUG diff --git a/mm/slub.c b/mm/slub.c index 4b52014..a91603c 100644 --- a/mm/slub.c +++ b/mm/slub.c @@ -2089,6 +2089,7 @@ static int kmem_cache_open(struct kmem_cache *s, gfp_t gfpflags, goto error; s->refcount = 1; + s->defrag_ratio = 30; #ifdef CONFIG_NUMA s->remote_node_defrag_ratio = 100; #endif @@ -3527,6 +3528,22 @@ static ssize_t free_calls_show(struct kmem_cache *s, char *buf) } SLAB_ATTR_RO(free_calls); +static ssize_t defrag_ratio_show(struct kmem_cache *s, char *buf) +{ + return sprintf(buf, "%d\n", s->defrag_ratio); +} + +static ssize_t defrag_ratio_store(struct kmem_cache *s, + const char *buf, size_t length) +{ + int n = simple_strtoul(buf, NULL, 10); + + if (n < 100) + s->defrag_ratio = n; + return length; +} +SLAB_ATTR(defrag_ratio); + #ifdef CONFIG_NUMA static ssize_t remote_node_defrag_ratio_show(struct kmem_cache *s, char *buf) { @@ -3569,6 +3586,7 @@ static struct attribute * slab_attrs[] = { &shrink_attr.attr, &alloc_calls_attr.attr, &free_calls_attr.attr, + &defrag_ratio_attr.attr, #ifdef CONFIG_ZONE_DMA &cache_dma_attr.attr, #endif -- 1.5.2.4