]> git.karo-electronics.de Git - mv-sheeva.git/blobdiff - arch/x86/oprofile/nmi_int.c
oprofile/x86: stop disabled counters in nmi handler
[mv-sheeva.git] / 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);