summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--arch/x86/oprofile/nmi_int.c15
1 files changed, 13 insertions, 2 deletions
diff --git a/arch/x86/oprofile/nmi_int.c b/arch/x86/oprofile/nmi_int.c
index 6890d8498e0b..379e8bd0deea 100644
--- a/arch/x86/oprofile/nmi_int.c
+++ b/arch/x86/oprofile/nmi_int.c
@@ -494,14 +494,19 @@ static int nmi_setup(void)
494 if (err) 494 if (err)
495 goto fail; 495 goto fail;
496 496
497 cpu_notifier_register_begin();
498
499 /* Use get/put_online_cpus() to protect 'nmi_enabled' */
497 get_online_cpus(); 500 get_online_cpus();
498 register_cpu_notifier(&oprofile_cpu_nb);
499 nmi_enabled = 1; 501 nmi_enabled = 1;
500 /* make nmi_enabled visible to the nmi handler: */ 502 /* make nmi_enabled visible to the nmi handler: */
501 smp_mb(); 503 smp_mb();
502 on_each_cpu(nmi_cpu_setup, NULL, 1); 504 on_each_cpu(nmi_cpu_setup, NULL, 1);
505 __register_cpu_notifier(&oprofile_cpu_nb);
503 put_online_cpus(); 506 put_online_cpus();
504 507
508 cpu_notifier_register_done();
509
505 return 0; 510 return 0;
506fail: 511fail:
507 free_msrs(); 512 free_msrs();
@@ -512,12 +517,18 @@ static void nmi_shutdown(void)
512{ 517{
513 struct op_msrs *msrs; 518 struct op_msrs *msrs;
514 519
520 cpu_notifier_register_begin();
521
522 /* Use get/put_online_cpus() to protect 'nmi_enabled' & 'ctr_running' */
515 get_online_cpus(); 523 get_online_cpus();
516 unregister_cpu_notifier(&oprofile_cpu_nb);
517 on_each_cpu(nmi_cpu_shutdown, NULL, 1); 524 on_each_cpu(nmi_cpu_shutdown, NULL, 1);
518 nmi_enabled = 0; 525 nmi_enabled = 0;
519 ctr_running = 0; 526 ctr_running = 0;
527 __unregister_cpu_notifier(&oprofile_cpu_nb);
520 put_online_cpus(); 528 put_online_cpus();
529
530 cpu_notifier_register_done();
531
521 /* make variables visible to the nmi handler: */ 532 /* make variables visible to the nmi handler: */
522 smp_mb(); 533 smp_mb();
523 unregister_nmi_handler(NMI_LOCAL, "oprofile"); 534 unregister_nmi_handler(NMI_LOCAL, "oprofile");