From e6f57689f195add424b6b77186b469ece91dbac0 Mon Sep 17 00:00:00 2001 From: Christoph Lameter Date: Mon, 7 Jan 2008 23:20:29 -0800 Subject: [PATCH] SLUB: Avoid referencing kmem_cache struct in slab_alloc. There is the need to use the objects per slab in the first part of __slab_alloc() which is still pretty hot. Copy the number of objects per slab into the kmem_cache_cpu structure. That way we can get the value from a cache line that we already need to touch. This brings the kmem_cache_cpu structure up to 4 even words. There is no increase in the size of kmem_cache_cpu since the size of object is rounded to the next word. Signed-off-by: Christoph Lameter Reviewed-by: Pekka Enberg Signed-off-by: Andrew Morton --- include/linux/slub_def.h | 1 + mm/slub.c | 3 ++- 2 files changed, 3 insertions(+), 1 deletion(-) Index: linux-2.6/include/linux/slub_def.h =================================================================== --- linux-2.6.orig/include/linux/slub_def.h 2008-02-04 12:21:57.227535625 -0800 +++ linux-2.6/include/linux/slub_def.h 2008-02-04 12:29:47.595888309 -0800 @@ -17,6 +17,7 @@ struct kmem_cache_cpu { int node; /* The node of the page (or -1 for debug) */ unsigned int offset; /* Freepointer offset (in word units) */ unsigned int objsize; /* Size of an object (from kmem_cache) */ + unsigned int objects; /* Number of objects (from kmem_cache) */ }; struct kmem_cache_node { Index: linux-2.6/mm/slub.c =================================================================== --- linux-2.6.orig/mm/slub.c 2008-02-04 12:29:42.951884575 -0800 +++ linux-2.6/mm/slub.c 2008-02-04 12:29:47.595888309 -0800 @@ -1509,7 +1509,7 @@ load_freelist: object = c->page->freelist; c->freelist = object[c->offset]; - c->page->inuse = s->objects; + c->page->inuse = c->objects; c->page->freelist = c->page->end; c->node = page_to_nid(c->page); slab_unlock(c->page); @@ -1870,6 +1870,7 @@ static void init_kmem_cache_cpu(struct k c->node = 0; c->offset = s->offset / sizeof(void *); c->objsize = s->objsize; + c->objects = s->objects; } static void init_kmem_cache_node(struct kmem_cache_node *n)