Commit 65175c07 authored by Michael Cree's avatar Michael Cree Committed by Ingo Molnar

alpha: Fix HW performance counters to be stopped properly

Also fix a few compile errors due to undefined and duplicated
variables.
Signed-off-by: default avatarMichael Cree <mcree@orcon.net.nz>
Signed-off-by: default avatarPeter Zijlstra <a.p.zijlstra@chello.nl>
LKML-Reference: <1284269844-23251-1-git-send-email-mcree@orcon.net.nz>
Signed-off-by: default avatarIngo Molnar <mingo@elte.hu>
parent d9ca07a0
...@@ -422,9 +422,10 @@ static void maybe_change_configuration(struct cpu_hw_events *cpuc) ...@@ -422,9 +422,10 @@ static void maybe_change_configuration(struct cpu_hw_events *cpuc)
static int alpha_pmu_add(struct perf_event *event, int flags) static int alpha_pmu_add(struct perf_event *event, int flags)
{ {
struct cpu_hw_events *cpuc = &__get_cpu_var(cpu_hw_events); struct cpu_hw_events *cpuc = &__get_cpu_var(cpu_hw_events);
struct hw_perf_event *hwc = &event->hw;
int n0; int n0;
int ret; int ret;
unsigned long flags; unsigned long irq_flags;
/* /*
* The Sparc code has the IRQ disable first followed by the perf * The Sparc code has the IRQ disable first followed by the perf
...@@ -435,7 +436,7 @@ static int alpha_pmu_add(struct perf_event *event, int flags) ...@@ -435,7 +436,7 @@ static int alpha_pmu_add(struct perf_event *event, int flags)
* final PMI to occur before we disable interrupts. * final PMI to occur before we disable interrupts.
*/ */
perf_pmu_disable(event->pmu); perf_pmu_disable(event->pmu);
local_irq_save(flags); local_irq_save(irq_flags);
/* Default to error to be returned */ /* Default to error to be returned */
ret = -EAGAIN; ret = -EAGAIN;
...@@ -458,7 +459,7 @@ static int alpha_pmu_add(struct perf_event *event, int flags) ...@@ -458,7 +459,7 @@ static int alpha_pmu_add(struct perf_event *event, int flags)
if (!(flags & PERF_EF_START)) if (!(flags & PERF_EF_START))
hwc->state |= PERF_HES_STOPPED; hwc->state |= PERF_HES_STOPPED;
local_irq_restore(flags); local_irq_restore(irq_flags);
perf_pmu_enable(event->pmu); perf_pmu_enable(event->pmu);
return ret; return ret;
...@@ -474,11 +475,11 @@ static void alpha_pmu_del(struct perf_event *event, int flags) ...@@ -474,11 +475,11 @@ static void alpha_pmu_del(struct perf_event *event, int flags)
{ {
struct cpu_hw_events *cpuc = &__get_cpu_var(cpu_hw_events); struct cpu_hw_events *cpuc = &__get_cpu_var(cpu_hw_events);
struct hw_perf_event *hwc = &event->hw; struct hw_perf_event *hwc = &event->hw;
unsigned long flags; unsigned long irq_flags;
int j; int j;
perf_pmu_disable(event->pmu); perf_pmu_disable(event->pmu);
local_irq_save(flags); local_irq_save(irq_flags);
for (j = 0; j < cpuc->n_events; j++) { for (j = 0; j < cpuc->n_events; j++) {
if (event == cpuc->event[j]) { if (event == cpuc->event[j]) {
...@@ -504,7 +505,7 @@ static void alpha_pmu_del(struct perf_event *event, int flags) ...@@ -504,7 +505,7 @@ static void alpha_pmu_del(struct perf_event *event, int flags)
} }
} }
local_irq_restore(flags); local_irq_restore(irq_flags);
perf_pmu_enable(event->pmu); perf_pmu_enable(event->pmu);
} }
...@@ -523,7 +524,7 @@ static void alpha_pmu_stop(struct perf_event *event, int flags) ...@@ -523,7 +524,7 @@ static void alpha_pmu_stop(struct perf_event *event, int flags)
struct cpu_hw_events *cpuc = &__get_cpu_var(cpu_hw_events); struct cpu_hw_events *cpuc = &__get_cpu_var(cpu_hw_events);
if (!(hwc->state & PERF_HES_STOPPED)) { if (!(hwc->state & PERF_HES_STOPPED)) {
cpuc->idx_mask &= !(1UL<<hwc->idx); cpuc->idx_mask &= ~(1UL<<hwc->idx);
hwc->state |= PERF_HES_STOPPED; hwc->state |= PERF_HES_STOPPED;
} }
...@@ -533,7 +534,7 @@ static void alpha_pmu_stop(struct perf_event *event, int flags) ...@@ -533,7 +534,7 @@ static void alpha_pmu_stop(struct perf_event *event, int flags)
} }
if (cpuc->enabled) if (cpuc->enabled)
wrperfmon(PERFMON_CMD_ENABLE, (1UL<<hwc->idx)); wrperfmon(PERFMON_CMD_DISABLE, (1UL<<hwc->idx));
} }
...@@ -849,7 +850,7 @@ static void alpha_perf_event_irq_handler(unsigned long la_ptr, ...@@ -849,7 +850,7 @@ static void alpha_perf_event_irq_handler(unsigned long la_ptr,
/* Interrupts coming too quickly; "throttle" the /* Interrupts coming too quickly; "throttle" the
* counter, i.e., disable it for a little while. * counter, i.e., disable it for a little while.
*/ */
cpuc->idx_mask &= ~(1UL<<idx); alpha_pmu_stop(event, 0);
} }
} }
wrperfmon(PERFMON_CMD_ENABLE, cpuc->idx_mask); wrperfmon(PERFMON_CMD_ENABLE, cpuc->idx_mask);
......
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