]> git.karo-electronics.de Git - mv-sheeva.git/commitdiff
oprofile/x86: stop disabled counters in nmi handler
authorRobert Richter <robert.richter@amd.com>
Mon, 3 May 2010 12:41:22 +0000 (14:41 +0200)
committerRobert Richter <robert.richter@amd.com>
Tue, 4 May 2010 09:39:38 +0000 (11:39 +0200)
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>
arch/x86/oprofile/nmi_int.c

index b56601eaf29d5719a7a6706a4854c3405f6da63a..94b5481bb6c6a99c51ad59441d2c9cfd59e09b2e 100644 (file)
@@ -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);