perf_counter/powerpc: Fix oops on cpus without perf_counter hardware support
If we have the powerpc perf_counter backend compiled in, but the cpu we are running on is one where we don't support the PMU, we currently oops in hw_perf_group_sched_in if we try to use any counters, because ppmu is NULL in that case, and we unconditionally dereference ppmu. This fixes the problem by adding a check if ppmu is NULL at the beginning of hw_perf_group_sched_in, and also at the beginning of the other functions that get called from the perf_counter core, i.e. hw_perf_disable, hw_perf_enable, and hw_perf_counter_setup. Signed-off-by: Paul Mackerras <paulus@samba.org> Cc: Peter Zijlstra <a.p.zijlstra@chello.nl> Cc: benh@kernel.crashing.org Signed-off-by: Ingo Molnar <mingo@elte.hu>
This commit is contained in:
parent
b26bc5a7f8
commit
f36a1a133a
|
@ -518,6 +518,8 @@ void hw_perf_disable(void)
|
|||
struct cpu_hw_counters *cpuhw;
|
||||
unsigned long flags;
|
||||
|
||||
if (!ppmu)
|
||||
return;
|
||||
local_irq_save(flags);
|
||||
cpuhw = &__get_cpu_var(cpu_hw_counters);
|
||||
|
||||
|
@ -572,6 +574,8 @@ void hw_perf_enable(void)
|
|||
int n_lim;
|
||||
int idx;
|
||||
|
||||
if (!ppmu)
|
||||
return;
|
||||
local_irq_save(flags);
|
||||
cpuhw = &__get_cpu_var(cpu_hw_counters);
|
||||
if (!cpuhw->disabled) {
|
||||
|
@ -737,6 +741,8 @@ int hw_perf_group_sched_in(struct perf_counter *group_leader,
|
|||
long i, n, n0;
|
||||
struct perf_counter *sub;
|
||||
|
||||
if (!ppmu)
|
||||
return 0;
|
||||
cpuhw = &__get_cpu_var(cpu_hw_counters);
|
||||
n0 = cpuhw->n_counters;
|
||||
n = collect_events(group_leader, ppmu->n_counter - n0,
|
||||
|
@ -1281,6 +1287,8 @@ void hw_perf_counter_setup(int cpu)
|
|||
{
|
||||
struct cpu_hw_counters *cpuhw = &per_cpu(cpu_hw_counters, cpu);
|
||||
|
||||
if (!ppmu)
|
||||
return;
|
||||
memset(cpuhw, 0, sizeof(*cpuhw));
|
||||
cpuhw->mmcr[0] = MMCR0_FC;
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue