From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1754343AbcB2LLR (ORCPT ); Mon, 29 Feb 2016 06:11:17 -0500 Received: from torg.zytor.com ([198.137.202.12]:53836 "EHLO terminus.zytor.com" rhost-flags-OK-OK-OK-FAIL) by vger.kernel.org with ESMTP id S1754207AbcB2LLN (ORCPT ); Mon, 29 Feb 2016 06:11:13 -0500 Date: Mon, 29 Feb 2016 03:10:04 -0800 From: tip-bot for Thomas Gleixner Message-ID: Cc: harish.chegondi@intel.com, torvalds@linux-foundation.org, linux-kernel@vger.kernel.org, acme@redhat.com, andi.kleen@intel.com, peterz@infradead.org, eranian@google.com, kan.liang@intel.com, jolsa@redhat.com, bp@alien8.de, mingo@kernel.org, vincent.weaver@maine.edu, tglx@linutronix.de, hpa@zytor.com, jacob.jun.pan@linux.intel.com Reply-To: torvalds@linux-foundation.org, harish.chegondi@intel.com, andi.kleen@intel.com, acme@redhat.com, linux-kernel@vger.kernel.org, mingo@kernel.org, kan.liang@intel.com, bp@alien8.de, jolsa@redhat.com, peterz@infradead.org, eranian@google.com, jacob.jun.pan@linux.intel.com, hpa@zytor.com, tglx@linutronix.de, vincent.weaver@maine.edu In-Reply-To: <20160222221012.231222076@linutronix.de> References: <20160222221012.231222076@linutronix.de> To: linux-tip-commits@vger.kernel.org Subject: [tip:perf/core] perf/x86/intel/rapl: Add proper error handling Git-Commit-ID: 55f2890f0726fe4a1f41a3a0e72ca1a263f095c3 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 Commit-ID: 55f2890f0726fe4a1f41a3a0e72ca1a263f095c3 Gitweb: http://git.kernel.org/tip/55f2890f0726fe4a1f41a3a0e72ca1a263f095c3 Author: Thomas Gleixner AuthorDate: Mon, 22 Feb 2016 22:19:21 +0000 Committer: Ingo Molnar CommitDate: Mon, 29 Feb 2016 09:35:22 +0100 perf/x86/intel/rapl: Add proper error handling Like uncore the rapl driver lacks error handling. It leaks memory and leaves the hotplug notifier registered. Add the proper error checks, cleanup the memory and register the hotplug notifier only on success. Signed-off-by: Thomas Gleixner Signed-off-by: Peter Zijlstra (Intel) Cc: Andi Kleen Cc: Arnaldo Carvalho de Melo Cc: Borislav Petkov Cc: Harish Chegondi Cc: Jacob Pan Cc: Jiri Olsa Cc: Kan Liang Cc: Linus Torvalds Cc: Peter Zijlstra Cc: Stephane Eranian Cc: Vince Weaver Cc: linux-kernel@vger.kernel.org Link: http://lkml.kernel.org/r/20160222221012.231222076@linutronix.de Signed-off-by: Ingo Molnar --- arch/x86/events/intel/rapl.c | 29 +++++++++++++++++++++-------- 1 file changed, 21 insertions(+), 8 deletions(-) diff --git a/arch/x86/events/intel/rapl.c b/arch/x86/events/intel/rapl.c index 536f0ce..98b04d2 100644 --- a/arch/x86/events/intel/rapl.c +++ b/arch/x86/events/intel/rapl.c @@ -686,6 +686,14 @@ static int rapl_check_hw_unit(void) return 0; } +static void __init cleanup_rapl_pmus(void) +{ + int cpu; + + for_each_online_cpu(cpu) + kfree(per_cpu(rapl_pmu, cpu)); +} + static const struct x86_cpu_id rapl_cpu_match[] = { [0] = { .vendor = X86_VENDOR_INTEL, .family = 6 }, [1] = {}, @@ -702,7 +710,7 @@ static int __init rapl_pmu_init(void) * check for Intel processor family 6 */ if (!x86_match_cpu(rapl_cpu_match)) - return 0; + return -ENODEV; /* check supported CPU */ switch (boot_cpu_data.x86_model) { @@ -734,8 +742,9 @@ static int __init rapl_pmu_init(void) break; default: /* unsupported */ - return 0; + return -ENODEV; } + ret = rapl_check_hw_unit(); if (ret) return ret; @@ -743,6 +752,7 @@ static int __init rapl_pmu_init(void) /* run cpu model quirks */ for (quirk = rapl_quirks; quirk; quirk = quirk->next) quirk->func(); + cpu_notifier_register_begin(); for_each_online_cpu(cpu) { @@ -752,15 +762,14 @@ static int __init rapl_pmu_init(void) rapl_cpu_init(cpu); } - __perf_cpu_notifier(rapl_cpu_notifier); - ret = perf_pmu_register(&rapl_pmu_class, "power", -1); if (WARN_ON(ret)) { pr_info("RAPL PMU detected, registration failed (%d), RAPL PMU disabled\n", ret); - cpu_notifier_register_done(); - return -1; + goto out; } + __perf_cpu_notifier(rapl_cpu_notifier); + pmu = __this_cpu_read(rapl_pmu); pr_info("RAPL PMU detected," @@ -775,9 +784,13 @@ static int __init rapl_pmu_init(void) rapl_domain_names[i], rapl_hw_unit[i]); } } -out: - cpu_notifier_register_done(); + cpu_notifier_register_done(); return 0; + +out: + cleanup_rapl_pmus(); + cpu_notifier_register_done(); + return ret; } device_initcall(rapl_pmu_init);