slub: Fix partial count comparison confusion
authorChristoph Lameter <cl@linux.com>
Tue, 9 Aug 2011 18:01:32 +0000 (13:01 -0500)
committerPekka Enberg <penberg@kernel.org>
Tue, 9 Aug 2011 18:12:31 +0000 (21:12 +0300)
deactivate_slab() has the comparison if more than the minimum number of
partial pages are in the partial list wrong. An effect of this may be that
empty pages are not freed from deactivate_slab(). The result could be an
OOM due to growth of the partial slabs per node. Frees mostly occur from
__slab_free which is okay so this would only affect use cases where a lot
of switching around of per cpu slabs occur.

Switching per cpu slabs occurs with high frequency if debugging options are
enabled.

Reported-and-tested-by: Xiaotian Feng <xtfeng@gmail.com>
Signed-off-by: Christoph Lameter <cl@linux.com>
Signed-off-by: Pekka Enberg <penberg@kernel.org>
mm/slub.c

index 6da68597bde8b2228695ebfa8a2d1a06253b5918..9f662d70eb4772c041349d7febb0c74c571c6aa9 100644 (file)
--- a/mm/slub.c
+++ b/mm/slub.c
@@ -1854,7 +1854,7 @@ redo:
 
        new.frozen = 0;
 
-       if (!new.inuse && n->nr_partial < s->min_partial)
+       if (!new.inuse && n->nr_partial > s->min_partial)
                m = M_FREE;
        else if (new.freelist) {
                m = M_PARTIAL;