summaryrefslogtreecommitdiff
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 09:40:04 -0700
commit37de6be49f6c88f7d1306594b7aae5aeee2fa499 (patch)
tree77f0c5e7aad88a8bb419d3c2211a93ea709ead8a
parent19165bdbb3622cfca0ff66e8b30248d469b849d6 (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 283068f5af9f..ffb99b4e7527 100644
--- a/mm/memcontrol.c
+++ b/mm/memcontrol.c
@@ -4605,6 +4605,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 */