Skip to content

Commit

Permalink
perf/x86/intel/rapl: Add proper error handling
Browse files Browse the repository at this point in the history
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 <tglx@linutronix.de>
Signed-off-by: Peter 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.de
Signed-off-by: Ingo Molnar <mingo@kernel.org>
  • Loading branch information
Thomas Gleixner authored and Ingo Molnar committed Feb 29, 2016
1 parent 4d120c5 commit 55f2890
Showing 1 changed file with 21 additions and 8 deletions.
29 changes: 21 additions & 8 deletions arch/x86/events/intel/rapl.c
Original file line number Diff line number Diff line change
Expand Up @@ -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] = {},
Expand All @@ -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) {
Expand Down Expand Up @@ -734,15 +742,17 @@ static int __init rapl_pmu_init(void)
break;
default:
/* unsupported */
return 0;
return -ENODEV;
}

ret = rapl_check_hw_unit();
if (ret)
return ret;

/* run cpu model quirks */
for (quirk = rapl_quirks; quirk; quirk = quirk->next)
quirk->func();

cpu_notifier_register_begin();

for_each_online_cpu(cpu) {
Expand All @@ -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,"
Expand All @@ -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);

0 comments on commit 55f2890

Please sign in to comment.