summaryrefslogtreecommitdiff
path: root/mm
diff options
context:
space:
mode:
authorLinus Torvalds <torvalds@linux-foundation.org>2011-08-09 08:42:16 -0700
committerLinus Torvalds <torvalds@linux-foundation.org>2011-08-09 08:42:16 -0700
commite6a99d312687a42c077a9b8cb5e757f186edb1b9 (patch)
treeca2d0aaf149beb82f601006bdc0c2a7b6a9d3bd5 /mm
parent6bb615bc396512992f77495180cda29f0f9791b5 (diff)
parentef62fb32b7b21731e41aea3c1e08bcdb407c9eb9 (diff)
Merge branch 'slab/urgent' of git://git.kernel.org/pub/scm/linux/kernel/git/penberg/slab-2.6
* 'slab/urgent' of git://git.kernel.org/pub/scm/linux/kernel/git/penberg/slab-2.6: slub: fix check_bytes() for slub debugging slub: Fix full list corruption if debugging is on
Diffstat (limited to 'mm')
-rw-r--r--mm/slub.c8
1 files changed, 5 insertions, 3 deletions
diff --git a/mm/slub.c b/mm/slub.c
index eb5a8f93338a..6da68597bde8 100644
--- a/mm/slub.c
+++ b/mm/slub.c
@@ -701,7 +701,7 @@ static u8 *check_bytes(u8 *start, u8 value, unsigned int bytes)
return check_bytes8(start, value, bytes);
value64 = value | value << 8 | value << 16 | value << 24;
- value64 = value64 | value64 << 32;
+ value64 = (value64 & 0xffffffff) | value64 << 32;
prefix = 8 - ((unsigned long)start) % 8;
if (prefix) {
@@ -2387,11 +2387,13 @@ static void __slab_free(struct kmem_cache *s, struct page *page,
slab_empty:
if (prior) {
/*
- * Slab still on the partial list.
+ * Slab on the partial list.
*/
remove_partial(n, page);
stat(s, FREE_REMOVE_PARTIAL);
- }
+ } else
+ /* Slab must be on the full list */
+ remove_full(s, page);
spin_unlock_irqrestore(&n->list_lock, flags);
stat(s, FREE_SLAB);