summaryrefslogtreecommitdiff
path: root/arch/x86/oprofile
diff options
context:
space:
mode:
authorRobert Richter <robert.richter@amd.com>2010-05-03 12:41:22 (GMT)
committerRobert Richter <robert.richter@amd.com>2010-05-04 09:39:38 (GMT)
commitde654649737696ecf32873c341b305e30f3dc777 (patch)
tree242e9a9f7d03b4da10b9786c895f46a8451a1725 /arch/x86/oprofile
parent6ae56b55bc364bc2f2342f599b46581627ba22da (diff)
downloadlinux-de654649737696ecf32873c341b305e30f3dc777.tar.xz
oprofile/x86: stop disabled counters in nmi handler
This patch adds checks to the nmi handler. Now samples are only generated and counters reenabled, if the counters are running. Otherwise the counters are stopped, if oprofile is using the nmi. In other cases it will ignore the nmi notification. Cc: Andi Kleen <andi@firstfloor.org> Signed-off-by: Robert Richter <robert.richter@amd.com>
Diffstat (limited to 'arch/x86/oprofile')
-rw-r--r--arch/x86/oprofile/nmi_int.c12
1 files changed, 10 insertions, 2 deletions
diff --git a/arch/x86/oprofile/nmi_int.c b/arch/x86/oprofile/nmi_int.c
index b56601e..94b5481 100644
--- a/arch/x86/oprofile/nmi_int.c
+++ b/arch/x86/oprofile/nmi_int.c
@@ -62,12 +62,16 @@ static int profile_exceptions_notify(struct notifier_block *self,
{
struct die_args *args = (struct die_args *)data;
int ret = NOTIFY_DONE;
- int cpu = smp_processor_id();
switch (val) {
case DIE_NMI:
case DIE_NMI_IPI:
- model->check_ctrs(args->regs, &per_cpu(cpu_msrs, cpu));
+ if (ctr_running)
+ model->check_ctrs(args->regs, &__get_cpu_var(cpu_msrs));
+ else if (!nmi_enabled)
+ break;
+ else
+ model->stop(&__get_cpu_var(cpu_msrs));
ret = NOTIFY_STOP;
break;
default:
@@ -392,6 +396,9 @@ static int nmi_setup(void)
mux_clone(cpu);
}
+ nmi_enabled = 0;
+ ctr_running = 0;
+ barrier();
err = register_die_notifier(&profile_exceptions_nb);
if (err)
goto fail;
@@ -451,6 +458,7 @@ static void nmi_shutdown(void)
nmi_enabled = 0;
ctr_running = 0;
put_online_cpus();
+ barrier();
unregister_die_notifier(&profile_exceptions_nb);
msrs = &get_cpu_var(cpu_msrs);
model->shutdown(msrs);