The defrag_ratio is used to set the threshold at which defragmentation
should be attempted on a slab page.

The allocation ratio is measured by the percentage of the available slots
allocated.

Add a defrag ratio field and set it to 30% by default. A limit of 30% specified
that less than 3 out of 10 available slots for objects are in use before
slab defragmeentation runs.

Reviewed-by: Rik van Riel
Signed-off-by: Christoph Lameter
Signed-off-by: Pekka Enberg
Signed-off-by: Christoph Lameter

---
include/linux/slub_def.h | 7 +++++++
mm/slub.c | 23 +++++++++++++++++++++++
2 files changed, 30 insertions(+)

Index: linux-next/include/linux/slub_def.h
================================================== =================
--- linux-next.orig/include/linux/slub_def.h 2008-08-11 07:42:32.301017715 -0700
+++ linux-next/include/linux/slub_def.h 2008-08-11 07:50:11.382348462 -0700
@@ -89,6 +89,13 @@ struct kmem_cache {
void (*ctor)(void *);
int inuse; /* Offset to metadata */
int align; /* Alignment */
+ int defrag_ratio; /*
+ * Ratio used to check the percentage of
+ * objects allocate in a slab page.
+ * If less than this ratio is allocated
+ * then reclaim attempts are made.
+ */
+
const char *name; /* Name (only for display!) */
struct list_head list; /* List of slab caches */
#ifdef CONFIG_SLUB_DEBUG
Index: linux-next/mm/slub.c
================================================== =================
--- linux-next.orig/mm/slub.c 2008-08-11 07:42:34.392348172 -0700
+++ linux-next/mm/slub.c 2008-08-11 07:50:11.802347432 -0700
@@ -2324,6 +2324,7 @@ static int kmem_cache_open(struct kmem_c
goto error;

s->refcount = 1;
+ s->defrag_ratio = 30;
#ifdef CONFIG_NUMA
s->remote_node_defrag_ratio = 100;
#endif
@@ -4056,6 +4057,27 @@ static ssize_t free_calls_show(struct km
}
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)
+{
+ unsigned long ratio;
+ int err;
+
+ err = strict_strtoul(buf, 10, &ratio);
+ if (err)
+ return err;
+
+ if (ratio < 100)
+ s->defrag_ratio = ratio;
+ return length;
+}
+SLAB_ATTR(defrag_ratio);
+
#ifdef CONFIG_NUMA
static ssize_t remote_node_defrag_ratio_show(struct kmem_cache *s, char *buf)
{
@@ -4163,6 +4185,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

--
--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/