Commit 55f2890f authored by Thomas Gleixner's avatar Thomas Gleixner Committed by Ingo Molnar

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: default avatarThomas Gleixner <tglx@linutronix.de>
Signed-off-by: default avatarPeter Zijlstra (Intel) <peterz@infradead.org>
Cc: Andi Kleen <andi.kleen@intel.com>
Cc: Arnaldo Carvalho de Melo <acme@redhat.com>
Cc: Borislav Petkov <bp@alien8.de>
Cc: Harish Chegondi <harish.chegondi@intel.com>
Cc: Jacob Pan <jacob.jun.pan@linux.intel.com>
Cc: Jiri Olsa <jolsa@redhat.com>
Cc: Kan Liang <kan.liang@intel.com>
Cc: Linus Torvalds <torvalds@linux-foundation.org>
Cc: Peter Zijlstra <peterz@infradead.org>
Cc: Stephane Eranian <eranian@google.com>
Cc: Vince Weaver <vincent.weaver@maine.edu>
Cc: linux-kernel@vger.kernel.org
Link: http://lkml.kernel.org/r/20160222221012.231222076@linutronix.deSigned-off-by: default avatarIngo Molnar <mingo@kernel.org>
parent 4d120c53
...@@ -686,6 +686,14 @@ static int rapl_check_hw_unit(void) ...@@ -686,6 +686,14 @@ static int rapl_check_hw_unit(void)
return 0; 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[] = { static const struct x86_cpu_id rapl_cpu_match[] = {
[0] = { .vendor = X86_VENDOR_INTEL, .family = 6 }, [0] = { .vendor = X86_VENDOR_INTEL, .family = 6 },
[1] = {}, [1] = {},
...@@ -702,7 +710,7 @@ static int __init rapl_pmu_init(void) ...@@ -702,7 +710,7 @@ static int __init rapl_pmu_init(void)
* check for Intel processor family 6 * check for Intel processor family 6
*/ */
if (!x86_match_cpu(rapl_cpu_match)) if (!x86_match_cpu(rapl_cpu_match))
return 0; return -ENODEV;
/* check supported CPU */ /* check supported CPU */
switch (boot_cpu_data.x86_model) { switch (boot_cpu_data.x86_model) {
...@@ -734,8 +742,9 @@ static int __init rapl_pmu_init(void) ...@@ -734,8 +742,9 @@ static int __init rapl_pmu_init(void)
break; break;
default: default:
/* unsupported */ /* unsupported */
return 0; return -ENODEV;
} }
ret = rapl_check_hw_unit(); ret = rapl_check_hw_unit();
if (ret) if (ret)
return ret; return ret;
...@@ -743,6 +752,7 @@ static int __init rapl_pmu_init(void) ...@@ -743,6 +752,7 @@ static int __init rapl_pmu_init(void)
/* run cpu model quirks */ /* run cpu model quirks */
for (quirk = rapl_quirks; quirk; quirk = quirk->next) for (quirk = rapl_quirks; quirk; quirk = quirk->next)
quirk->func(); quirk->func();
cpu_notifier_register_begin(); cpu_notifier_register_begin();
for_each_online_cpu(cpu) { for_each_online_cpu(cpu) {
...@@ -752,15 +762,14 @@ static int __init rapl_pmu_init(void) ...@@ -752,15 +762,14 @@ static int __init rapl_pmu_init(void)
rapl_cpu_init(cpu); rapl_cpu_init(cpu);
} }
__perf_cpu_notifier(rapl_cpu_notifier);
ret = perf_pmu_register(&rapl_pmu_class, "power", -1); ret = perf_pmu_register(&rapl_pmu_class, "power", -1);
if (WARN_ON(ret)) { if (WARN_ON(ret)) {
pr_info("RAPL PMU detected, registration failed (%d), RAPL PMU disabled\n", ret); pr_info("RAPL PMU detected, registration failed (%d), RAPL PMU disabled\n", ret);
cpu_notifier_register_done(); goto out;
return -1;
} }
__perf_cpu_notifier(rapl_cpu_notifier);
pmu = __this_cpu_read(rapl_pmu); pmu = __this_cpu_read(rapl_pmu);
pr_info("RAPL PMU detected," pr_info("RAPL PMU detected,"
...@@ -775,9 +784,13 @@ static int __init rapl_pmu_init(void) ...@@ -775,9 +784,13 @@ static int __init rapl_pmu_init(void)
rapl_domain_names[i], rapl_hw_unit[i]); rapl_domain_names[i], rapl_hw_unit[i]);
} }
} }
out:
cpu_notifier_register_done();
cpu_notifier_register_done();
return 0; return 0;
out:
cleanup_rapl_pmus();
cpu_notifier_register_done();
return ret;
} }
device_initcall(rapl_pmu_init); device_initcall(rapl_pmu_init);
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment