aboutsummaryrefslogtreecommitdiffstats
path: root/mm/slab.c
diff options
context:
space:
mode:
authorChristoph Lameter <clameter@sgi.com>2006-03-25 03:06:46 -0800
committerLinus Torvalds <torvalds@g5.osdl.org>2006-03-25 08:22:50 -0800
commitcafeb02e098ecd58fb0bd797b2c9fbba3edf54f8 (patch)
treef4d03a748184e24cb0ff4c9a56ba6b0eaefd78d3 /mm/slab.c
parent[PATCH] slab: Bypass free lists for __drain_alien_cache() (diff)
downloadlinux-dev-cafeb02e098ecd58fb0bd797b2c9fbba3edf54f8.tar.xz
linux-dev-cafeb02e098ecd58fb0bd797b2c9fbba3edf54f8.zip
[PATCH] alloc_kmemlist: Some cleanup in preparation for a real memory leak fix
Inspired by Jesper Juhl's patch from today 1. Get rid of err We do not set it to anything else but zero. 2. Drop the CONFIG_NUMA stuff. There are definitions for alloc_alien_cache and free_alien_cache() that do the right thing for the non NUMA case. 3. Better naming of variables. 4. Remove redundant cachep->nodelists[node] expressions. Signed-off-by: Christoph Lameter <clameter@sgi.com> Signed-off-by: Jesper Juhl <jesper.juhl@gmail.com> Signed-off-by: Andrew Morton <akpm@osdl.org> Signed-off-by: Linus Torvalds <torvalds@osdl.org>
Diffstat (limited to 'mm/slab.c')
-rw-r--r--mm/slab.c34
1 files changed, 17 insertions, 17 deletions
diff --git a/mm/slab.c b/mm/slab.c
index 351aa6c587f7..ef9f60fe37d6 100644
--- a/mm/slab.c
+++ b/mm/slab.c
@@ -3424,37 +3424,38 @@ static int alloc_kmemlist(struct kmem_cache *cachep)
{
int node;
struct kmem_list3 *l3;
- int err = 0;
+ struct array_cache *new_shared;
+ struct array_cache **new_alien;
for_each_online_node(node) {
- struct array_cache *nc = NULL, *new;
- struct array_cache **new_alien = NULL;
-#ifdef CONFIG_NUMA
+
new_alien = alloc_alien_cache(node, cachep->limit);
if (!new_alien)
goto fail;
-#endif
- new = alloc_arraycache(node, cachep->shared*cachep->batchcount,
+
+ new_shared = alloc_arraycache(node, cachep->shared*cachep->batchcount,
0xbaadf00d);
- if (!new)
+ if (!new_shared)
goto fail;
+
l3 = cachep->nodelists[node];
if (l3) {
+ struct array_cache *shared = l3->shared;
+
spin_lock_irq(&l3->list_lock);
- nc = cachep->nodelists[node]->shared;
- if (nc)
- free_block(cachep, nc->entry, nc->avail, node);
+ if (shared)
+ free_block(cachep, shared->entry, shared->avail, node);
- l3->shared = new;
- if (!cachep->nodelists[node]->alien) {
+ l3->shared = new_shared;
+ if (!l3->alien) {
l3->alien = new_alien;
new_alien = NULL;
}
l3->free_limit = (1 + nr_cpus_node(node)) *
cachep->batchcount + cachep->num;
spin_unlock_irq(&l3->list_lock);
- kfree(nc);
+ kfree(shared);
free_alien_cache(new_alien);
continue;
}
@@ -3465,16 +3466,15 @@ static int alloc_kmemlist(struct kmem_cache *cachep)
kmem_list3_init(l3);
l3->next_reap = jiffies + REAPTIMEOUT_LIST3 +
((unsigned long)cachep) % REAPTIMEOUT_LIST3;
- l3->shared = new;
+ l3->shared = new_shared;
l3->alien = new_alien;
l3->free_limit = (1 + nr_cpus_node(node)) *
cachep->batchcount + cachep->num;
cachep->nodelists[node] = l3;
}
- return err;
+ return 0;
fail:
- err = -ENOMEM;
- return err;
+ return -ENOMEM;
}
struct ccupdate_struct {