summaryrefslogtreecommitdiffstats
path: root/mm/slub.c
diff options
context:
space:
mode:
authorChristoph Lameter <cl@linux.com>2011-08-09 13:01:32 -0500
committerPekka Enberg <penberg@kernel.org>2011-08-09 21:12:31 +0300
commit81107188f123e3c2217ac2f2feb2a1147904c62f (patch)
tree53626e529423c12d082cbcc23012de0b39f26e4d /mm/slub.c
parentef62fb32b7b21731e41aea3c1e08bcdb407c9eb9 (diff)
downloadlinux-stable-81107188f123e3c2217ac2f2feb2a1147904c62f.tar.gz
linux-stable-81107188f123e3c2217ac2f2feb2a1147904c62f.tar.bz2
linux-stable-81107188f123e3c2217ac2f2feb2a1147904c62f.zip
slub: Fix partial count comparison confusion
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>
Diffstat (limited to 'mm/slub.c')
-rw-r--r--mm/slub.c2
1 files changed, 1 insertions, 1 deletions
diff --git a/mm/slub.c b/mm/slub.c
index 6da68597bde8..9f662d70eb47 100644
--- 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;