slub: Fix double bit unlock in debug mode
authorChristoph Lameter <[email protected]>
Wed, 25 May 2011 14:47:43 +0000 (09:47 -0500)
committerLinus Torvalds <[email protected]>
Wed, 25 May 2011 15:38:24 +0000 (08:38 -0700)
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 <[email protected]>
Reported-and-bisected-by: James Morris <[email protected]>
Reported-by: Ingo Molnar <[email protected]>
Reported-by: Jens Axboe <[email protected]>
Cc: Pekka Enberg <[email protected]>
Signed-off-by: Linus Torvalds <[email protected]>
mm/slub.c

index 4ea7f1a22a9468f332f529c60e7be0b85a97616f..4aad32d2e60d22b659efa63f8728e67d1ce7f1e1 100644 (file)
--- 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;
 }
 
 /*