Commit 43874d23 authored by Ingo Molnar's avatar Ingo Molnar

perfcounters: consolidate global-disable codepaths

Impact: cleanup

Simplify global disable handling.
Signed-off-by: default avatarIngo Molnar <mingo@elte.hu>
parent 1e125676
...@@ -33,7 +33,6 @@ static u32 perf_counter_mask __read_mostly; ...@@ -33,7 +33,6 @@ static u32 perf_counter_mask __read_mostly;
struct cpu_hw_counters { struct cpu_hw_counters {
struct perf_counter *counters[MAX_HW_COUNTERS]; struct perf_counter *counters[MAX_HW_COUNTERS];
unsigned long used[BITS_TO_LONGS(MAX_HW_COUNTERS)]; unsigned long used[BITS_TO_LONGS(MAX_HW_COUNTERS)];
int enable_all;
}; };
/* /*
...@@ -115,24 +114,13 @@ int hw_perf_counter_init(struct perf_counter *counter, s32 hw_event_type) ...@@ -115,24 +114,13 @@ int hw_perf_counter_init(struct perf_counter *counter, s32 hw_event_type)
return 0; return 0;
} }
static void __hw_perf_enable_all(void)
{
wrmsr(MSR_CORE_PERF_GLOBAL_CTRL, perf_counter_mask, 0);
}
void hw_perf_enable_all(void) void hw_perf_enable_all(void)
{ {
struct cpu_hw_counters *cpuc = &__get_cpu_var(cpu_hw_counters); wrmsr(MSR_CORE_PERF_GLOBAL_CTRL, perf_counter_mask, 0);
cpuc->enable_all = 1;
__hw_perf_enable_all();
} }
void hw_perf_disable_all(void) void hw_perf_disable_all(void)
{ {
struct cpu_hw_counters *cpuc = &__get_cpu_var(cpu_hw_counters);
cpuc->enable_all = 0;
wrmsr(MSR_CORE_PERF_GLOBAL_CTRL, 0, 0); wrmsr(MSR_CORE_PERF_GLOBAL_CTRL, 0, 0);
} }
...@@ -385,8 +373,10 @@ perf_handle_group(struct perf_counter *leader, u64 *status, u64 *overflown) ...@@ -385,8 +373,10 @@ perf_handle_group(struct perf_counter *leader, u64 *status, u64 *overflown)
static void __smp_perf_counter_interrupt(struct pt_regs *regs, int nmi) static void __smp_perf_counter_interrupt(struct pt_regs *regs, int nmi)
{ {
int bit, cpu = smp_processor_id(); int bit, cpu = smp_processor_id();
u64 ack, status, saved_global;
struct cpu_hw_counters *cpuc; struct cpu_hw_counters *cpuc;
u64 ack, status;
rdmsrl(MSR_CORE_PERF_GLOBAL_CTRL, saved_global);
/* Disable counters globally */ /* Disable counters globally */
wrmsr(MSR_CORE_PERF_GLOBAL_CTRL, 0, 0); wrmsr(MSR_CORE_PERF_GLOBAL_CTRL, 0, 0);
...@@ -445,10 +435,9 @@ static void __smp_perf_counter_interrupt(struct pt_regs *regs, int nmi) ...@@ -445,10 +435,9 @@ static void __smp_perf_counter_interrupt(struct pt_regs *regs, int nmi)
goto again; goto again;
out: out:
/* /*
* Do not reenable when global enable is off: * Restore - do not reenable when global enable is off:
*/ */
if (cpuc->enable_all) wrmsr(MSR_CORE_PERF_GLOBAL_CTRL, saved_global, 0);
__hw_perf_enable_all();
} }
void smp_perf_counter_interrupt(struct pt_regs *regs) void smp_perf_counter_interrupt(struct pt_regs *regs)
......
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