mirror of
https://git.yoctoproject.org/meta-ti
synced 2026-07-17 06:48:07 +00:00
189ce92b4c
Signed-off-by: Koen Kooi <koen@dominion.thruhere.net> Signed-off-by: Denys Dmytriyenko <denys@ti.com>
87 lines
2.9 KiB
Diff
87 lines
2.9 KiB
Diff
From e03e067f960f7714ac98fdef365cafff22086a6b Mon Sep 17 00:00:00 2001
|
|
From: Joonsoo Kim <js1304@gmail.com>
|
|
Date: Thu, 17 May 2012 00:13:02 +0900
|
|
Subject: [PATCH 36/86] slub: fix a memory leak in get_partial_node()
|
|
|
|
commit 02d7633fa567be7bf55a993b79d2a31b95ce2227 upstream.
|
|
|
|
In the case which is below,
|
|
|
|
1. acquire slab for cpu partial list
|
|
2. free object to it by remote cpu
|
|
3. page->freelist = t
|
|
|
|
then memory leak is occurred.
|
|
|
|
Change acquire_slab() not to zap freelist when it works for cpu partial list.
|
|
I think it is a sufficient solution for fixing a memory leak.
|
|
|
|
Below is output of 'slabinfo -r kmalloc-256'
|
|
when './perf stat -r 30 hackbench 50 process 4000 > /dev/null' is done.
|
|
|
|
***Vanilla***
|
|
Sizes (bytes) Slabs Debug Memory
|
|
------------------------------------------------------------------------
|
|
Object : 256 Total : 468 Sanity Checks : Off Total: 3833856
|
|
SlabObj: 256 Full : 111 Redzoning : Off Used : 2004992
|
|
SlabSiz: 8192 Partial: 302 Poisoning : Off Loss : 1828864
|
|
Loss : 0 CpuSlab: 55 Tracking : Off Lalig: 0
|
|
Align : 8 Objects: 32 Tracing : Off Lpadd: 0
|
|
|
|
***Patched***
|
|
Sizes (bytes) Slabs Debug Memory
|
|
------------------------------------------------------------------------
|
|
Object : 256 Total : 300 Sanity Checks : Off Total: 2457600
|
|
SlabObj: 256 Full : 204 Redzoning : Off Used : 2348800
|
|
SlabSiz: 8192 Partial: 33 Poisoning : Off Loss : 108800
|
|
Loss : 0 CpuSlab: 63 Tracking : Off Lalig: 0
|
|
Align : 8 Objects: 32 Tracing : Off Lpadd: 0
|
|
|
|
Total and loss number is the impact of this patch.
|
|
|
|
Acked-by: Christoph Lameter <cl@linux.com>
|
|
Signed-off-by: Joonsoo Kim <js1304@gmail.com>
|
|
Signed-off-by: Pekka Enberg <penberg@kernel.org>
|
|
Signed-off-by: Ben Hutchings <ben@decadent.org.uk>
|
|
---
|
|
mm/slub.c | 9 ++++++---
|
|
1 file changed, 6 insertions(+), 3 deletions(-)
|
|
|
|
diff --git a/mm/slub.c b/mm/slub.c
|
|
index a99c785..af47188 100644
|
|
--- a/mm/slub.c
|
|
+++ b/mm/slub.c
|
|
@@ -1506,15 +1506,19 @@ static inline void *acquire_slab(struct kmem_cache *s,
|
|
freelist = page->freelist;
|
|
counters = page->counters;
|
|
new.counters = counters;
|
|
- if (mode)
|
|
+ if (mode) {
|
|
new.inuse = page->objects;
|
|
+ new.freelist = NULL;
|
|
+ } else {
|
|
+ new.freelist = freelist;
|
|
+ }
|
|
|
|
VM_BUG_ON(new.frozen);
|
|
new.frozen = 1;
|
|
|
|
} while (!__cmpxchg_double_slab(s, page,
|
|
freelist, counters,
|
|
- NULL, new.counters,
|
|
+ new.freelist, new.counters,
|
|
"lock and freeze"));
|
|
|
|
remove_partial(n, page);
|
|
@@ -1556,7 +1560,6 @@ static void *get_partial_node(struct kmem_cache *s,
|
|
object = t;
|
|
available = page->objects - page->inuse;
|
|
} else {
|
|
- page->freelist = t;
|
|
available = put_cpu_partial(s, page, 0);
|
|
}
|
|
if (kmem_cache_debug(s) || available > s->cpu_partial / 2)
|
|
--
|
|
1.7.9.5
|
|
|