diff options
author | Christoph Lameter <cl@linux.com> | 2011-05-25 09:47:43 -0500 |
---|---|---|
committer | Linus Torvalds <torvalds@linux-foundation.org> | 2011-05-25 08:38:24 -0700 |
commit | a71ae47a2cbfa542c69f695809124da4e4dd9e8f (patch) | |
tree | a6b563bbab796f404fc68fdeebdf9a1c1e2fc27b /mm/slub.c | |
parent | 4a7df24ddc7097cd789a7527187826552ea0765e (diff) | |
download | lwn-a71ae47a2cbfa542c69f695809124da4e4dd9e8f.tar.gz lwn-a71ae47a2cbfa542c69f695809124da4e4dd9e8f.zip |
slub: Fix double bit unlock in debug mode
Commit 442b06bcea23 ("slub: Remove node check in slab_free") added a
call to deactivate_slab() in the debug case in __slab_alloc(), which
unlocks the current slab used for allocation. Going to the label
'unlock_out' then does it again.
Also, in the debug case we do not need all the other processing that the
'unlock_out' path does. We always fall back to the slow path in the
debug case. So the tid update is useless.
Similarly, ALLOC_SLOWPATH would just be incremented for all allocations.
Also a pretty useless thing.
So simply restore irq flags and return the object.
Signed-off-by: Christoph Lameter <cl@linux.com>
Reported-and-bisected-by: James Morris <jmorris@namei.org>
Reported-by: Ingo Molnar <mingo@elte.hu>
Reported-by: Jens Axboe <jaxboe@fusionio.com>
Cc: Pekka Enberg <penberg@kernel.org>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
Diffstat (limited to 'mm/slub.c')
-rw-r--r-- | mm/slub.c | 3 |
1 files changed, 2 insertions, 1 deletions
diff --git a/mm/slub.c b/mm/slub.c index 4ea7f1a22a94..4aad32d2e60d 100644 --- a/mm/slub.c +++ b/mm/slub.c @@ -1884,7 +1884,8 @@ debug: deactivate_slab(s, c); c->page = NULL; c->node = NUMA_NO_NODE; - goto unlock_out; + local_irq_restore(flags); + return object; } /* |