diff options
-rw-r--r-- | arch/x86/oprofile/nmi_int.c | 15 |
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; |
506 | fail: | 511 | fail: |
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"); |