aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSha Zhengju <handai.szj@taobao.com>2012-05-10 13:01:45 -0700
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>2012-05-21 10:46:22 -0700
commitef474e8699d6214527989d09e9d4cab368a6468f (patch)
tree4d2203e25f4b36ccc8b6a2ca93e9c3a65232f32a
parent277ff221e8b2a9d4397c247313883d1160c0403e (diff)
memcg: free spare array to avoid memory leak
commit 8c7577637ca31385e92769a77e2ab5b428e8b99c upstream. When the last event is unregistered, there is no need to keep the spare array anymore. So free it to avoid memory leak. Signed-off-by: Sha Zhengju <handai.szj@taobao.com> Acked-by: KAMEZAWA Hiroyuki <kamezawa.hiroyu@jp.fujitsu.com> Reviewed-by: Kirill A. Shutemov <kirill@shutemov.name> Signed-off-by: Andrew Morton <akpm@linux-foundation.org> Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org> Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
-rw-r--r--mm/memcontrol.c6
1 files changed, 6 insertions, 0 deletions
diff --git a/mm/memcontrol.c b/mm/memcontrol.c
index 6fe7afe66a7..f70c6fd1a93 100644
--- a/mm/memcontrol.c
+++ b/mm/memcontrol.c
@@ -4480,6 +4480,12 @@ static void mem_cgroup_usage_unregister_event(struct cgroup *cgrp,
swap_buffers:
/* Swap primary and spare array */
thresholds->spare = thresholds->primary;
+ /* If all events are unregistered, free the spare array */
+ if (!new) {
+ kfree(thresholds->spare);
+ thresholds->spare = NULL;
+ }
+
rcu_assign_pointer(thresholds->primary, new);
/* To be sure that nobody uses thresholds */