Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1754267AbcCUJ4D (ORCPT ); Mon, 21 Mar 2016 05:56:03 -0400 Received: from [198.137.202.10] ([198.137.202.10]:45544 "EHLO terminus.zytor.com" rhost-flags-FAIL-FAIL-OK-OK) by vger.kernel.org with ESMTP id S1753851AbcCUJzz (ORCPT ); Mon, 21 Mar 2016 05:55:55 -0400 Date: Mon, 21 Mar 2016 02:51:53 -0700 From: tip-bot for Vikas Shivappa Message-ID: Cc: torvalds@linux-foundation.org, brgerst@gmail.com, namhyung@kernel.org, tony.luck@intel.com, vincent.weaver@maine.edu, jolsa@redhat.com, vikas.shivappa@linux.intel.com, acme@redhat.com, hpa@zytor.com, dsahern@gmail.com, luto@amacapital.net, bp@alien8.de, tglx@linutronix.de, matt@codeblueprint.co.uk, peterz@infradead.org, linux-kernel@vger.kernel.org, mingo@kernel.org, eranian@google.com, alexander.shishkin@linux.intel.com, dvlasenk@redhat.com Reply-To: peterz@infradead.org, matt@codeblueprint.co.uk, linux-kernel@vger.kernel.org, mingo@kernel.org, alexander.shishkin@linux.intel.com, eranian@google.com, dvlasenk@redhat.com, namhyung@kernel.org, tony.luck@intel.com, torvalds@linux-foundation.org, brgerst@gmail.com, acme@redhat.com, vincent.weaver@maine.edu, jolsa@redhat.com, vikas.shivappa@linux.intel.com, hpa@zytor.com, dsahern@gmail.com, tglx@linutronix.de, luto@amacapital.net, bp@alien8.de In-Reply-To: <1457652732-4499-3-git-send-email-vikas.shivappa@linux.intel.com> References: <1457652732-4499-3-git-send-email-vikas.shivappa@linux.intel.com> To: linux-tip-commits@vger.kernel.org Subject: [tip:perf/urgent] perf/x86/cqm: Fix CQM memory leak and notifier leak Git-Commit-ID: ada2f634cd50d050269b67b4e2966582387e7c27 X-Mailer: tip-git-log-daemon Robot-ID: Robot-Unsubscribe: Contact to get blacklisted from these emails MIME-Version: 1.0 Content-Transfer-Encoding: 8bit Content-Type: text/plain; charset=UTF-8 Content-Disposition: inline Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Length: 3738 Lines: 129 Commit-ID: ada2f634cd50d050269b67b4e2966582387e7c27 Gitweb: http://git.kernel.org/tip/ada2f634cd50d050269b67b4e2966582387e7c27 Author: Vikas Shivappa AuthorDate: Thu, 10 Mar 2016 15:32:08 -0800 Committer: Ingo Molnar CommitDate: Mon, 21 Mar 2016 09:08:19 +0100 perf/x86/cqm: Fix CQM memory leak and notifier leak Fixes the hotcpu notifier leak and other global variable memory leaks during CQM (cache quality of service monitoring) initialization. Signed-off-by: Vikas Shivappa Signed-off-by: Peter Zijlstra (Intel) Reviewed-by: Tony Luck Acked-by: Thomas Gleixner Cc: Alexander Shishkin Cc: Andy Lutomirski Cc: Arnaldo Carvalho de Melo Cc: Borislav Petkov Cc: Brian Gerst Cc: David Ahern Cc: Denys Vlasenko Cc: H. Peter Anvin Cc: Jiri Olsa Cc: Linus Torvalds Cc: Matt Fleming Cc: Namhyung Kim Cc: Peter Zijlstra Cc: Stephane Eranian Cc: Vince Weaver Cc: fenghua.yu@intel.com Cc: h.peter.anvin@intel.com Cc: ravi.v.shankar@intel.com Cc: vikas.shivappa@intel.com Link: http://lkml.kernel.org/r/1457652732-4499-3-git-send-email-vikas.shivappa@linux.intel.com Signed-off-by: Ingo Molnar --- arch/x86/events/intel/cqm.c | 43 ++++++++++++++++++++++++++++++++----------- 1 file changed, 32 insertions(+), 11 deletions(-) diff --git a/arch/x86/events/intel/cqm.c b/arch/x86/events/intel/cqm.c index b0226f1..dbb058d 100644 --- a/arch/x86/events/intel/cqm.c +++ b/arch/x86/events/intel/cqm.c @@ -211,6 +211,20 @@ static void __put_rmid(u32 rmid) list_add_tail(&entry->list, &cqm_rmid_limbo_lru); } +static void cqm_cleanup(void) +{ + int i; + + if (!cqm_rmid_ptrs) + return; + + for (i = 0; i < cqm_max_rmid; i++) + kfree(cqm_rmid_ptrs[i]); + + kfree(cqm_rmid_ptrs); + cqm_rmid_ptrs = NULL; +} + static int intel_cqm_setup_rmid_cache(void) { struct cqm_rmid_entry *entry; @@ -218,7 +232,7 @@ static int intel_cqm_setup_rmid_cache(void) int r = 0; nr_rmids = cqm_max_rmid + 1; - cqm_rmid_ptrs = kmalloc(sizeof(struct cqm_rmid_entry *) * + cqm_rmid_ptrs = kzalloc(sizeof(struct cqm_rmid_entry *) * nr_rmids, GFP_KERNEL); if (!cqm_rmid_ptrs) return -ENOMEM; @@ -249,11 +263,9 @@ static int intel_cqm_setup_rmid_cache(void) mutex_unlock(&cache_mutex); return 0; -fail: - while (r--) - kfree(cqm_rmid_ptrs[r]); - kfree(cqm_rmid_ptrs); +fail: + cqm_cleanup(); return -ENOMEM; } @@ -1312,7 +1324,7 @@ static const struct x86_cpu_id intel_cqm_match[] = { static int __init intel_cqm_init(void) { - char *str, scale[20]; + char *str = NULL, scale[20]; int i, cpu, ret; if (!x86_match_cpu(intel_cqm_match)) @@ -1372,16 +1384,25 @@ static int __init intel_cqm_init(void) cqm_pick_event_reader(i); } - __perf_cpu_notifier(intel_cqm_cpu_notifier); - ret = perf_pmu_register(&intel_cqm_pmu, "intel_cqm", -1); - if (ret) + if (ret) { pr_err("Intel CQM perf registration failed: %d\n", ret); - else - pr_info("Intel CQM monitoring enabled\n"); + goto out; + } + pr_info("Intel CQM monitoring enabled\n"); + + /* + * Register the hot cpu notifier once we are sure cqm + * is enabled to avoid notifier leak. + */ + __perf_cpu_notifier(intel_cqm_cpu_notifier); out: cpu_notifier_register_done(); + if (ret) { + kfree(str); + cqm_cleanup(); + } return ret; }