Skip to content

Commit

Permalink
---
Browse files Browse the repository at this point in the history
yaml
---
r: 23511
b: refs/heads/master
c: 0718dc2
h: refs/heads/master
i:
  23509: 2e0a645
  23507: 63b05fb
  23503: 0b12600
v: v3
  • Loading branch information
Christoph Lameter authored and Linus Torvalds committed Mar 25, 2006
1 parent 4a7c94d commit 7cba90e
Show file tree
Hide file tree
Showing 2 changed files with 29 additions and 6 deletions.
2 changes: 1 addition & 1 deletion [refs]
Original file line number Diff line number Diff line change
@@ -1,2 +1,2 @@
---
refs/heads/master: cafeb02e098ecd58fb0bd797b2c9fbba3edf54f8
refs/heads/master: 0718dc2a82c865ca75975acabaf984057f9fd488
33 changes: 28 additions & 5 deletions trunk/mm/slab.c
Original file line number Diff line number Diff line change
Expand Up @@ -3418,7 +3418,7 @@ const char *kmem_cache_name(struct kmem_cache *cachep)
EXPORT_SYMBOL_GPL(kmem_cache_name);

/*
* This initializes kmem_list3 for all nodes.
* This initializes kmem_list3 or resizes varioius caches for all nodes.
*/
static int alloc_kmemlist(struct kmem_cache *cachep)
{
Expand All @@ -3433,10 +3433,13 @@ static int alloc_kmemlist(struct kmem_cache *cachep)
if (!new_alien)
goto fail;

new_shared = alloc_arraycache(node, cachep->shared*cachep->batchcount,
new_shared = alloc_arraycache(node,
cachep->shared*cachep->batchcount,
0xbaadf00d);
if (!new_shared)
if (!new_shared) {
free_alien_cache(new_alien);
goto fail;
}

l3 = cachep->nodelists[node];
if (l3) {
Expand All @@ -3445,7 +3448,8 @@ static int alloc_kmemlist(struct kmem_cache *cachep)
spin_lock_irq(&l3->list_lock);

if (shared)
free_block(cachep, shared->entry, shared->avail, node);
free_block(cachep, shared->entry,
shared->avail, node);

l3->shared = new_shared;
if (!l3->alien) {
Expand All @@ -3460,8 +3464,11 @@ static int alloc_kmemlist(struct kmem_cache *cachep)
continue;
}
l3 = kmalloc_node(sizeof(struct kmem_list3), GFP_KERNEL, node);
if (!l3)
if (!l3) {
free_alien_cache(new_alien);
kfree(new_shared);
goto fail;
}

kmem_list3_init(l3);
l3->next_reap = jiffies + REAPTIMEOUT_LIST3 +
Expand All @@ -3473,7 +3480,23 @@ static int alloc_kmemlist(struct kmem_cache *cachep)
cachep->nodelists[node] = l3;
}
return 0;

fail:
if (!cachep->next.next) {
/* Cache is not active yet. Roll back what we did */
node--;
while (node >= 0) {
if (cachep->nodelists[node]) {
l3 = cachep->nodelists[node];

kfree(l3->shared);
free_alien_cache(l3->alien);
kfree(l3);
cachep->nodelists[node] = NULL;
}
node--;
}
}
return -ENOMEM;
}

Expand Down

0 comments on commit 7cba90e

Please sign in to comment.