diff options
Diffstat (limited to 'arch/x86/oprofile/nmi_int.c')
| -rw-r--r-- | arch/x86/oprofile/nmi_int.c | 14 |
1 files changed, 10 insertions, 4 deletions
diff --git a/arch/x86/oprofile/nmi_int.c b/arch/x86/oprofile/nmi_int.c index cf9750004a08..68894fdc034b 100644 --- a/arch/x86/oprofile/nmi_int.c +++ b/arch/x86/oprofile/nmi_int.c | |||
| @@ -112,8 +112,10 @@ static void nmi_cpu_start(void *dummy) | |||
| 112 | static int nmi_start(void) | 112 | static int nmi_start(void) |
| 113 | { | 113 | { |
| 114 | get_online_cpus(); | 114 | get_online_cpus(); |
| 115 | on_each_cpu(nmi_cpu_start, NULL, 1); | ||
| 116 | ctr_running = 1; | 115 | ctr_running = 1; |
| 116 | /* make ctr_running visible to the nmi handler: */ | ||
| 117 | smp_mb(); | ||
| 118 | on_each_cpu(nmi_cpu_start, NULL, 1); | ||
| 117 | put_online_cpus(); | 119 | put_online_cpus(); |
| 118 | return 0; | 120 | return 0; |
| 119 | } | 121 | } |
| @@ -504,15 +506,18 @@ static int nmi_setup(void) | |||
| 504 | 506 | ||
| 505 | nmi_enabled = 0; | 507 | nmi_enabled = 0; |
| 506 | ctr_running = 0; | 508 | ctr_running = 0; |
| 507 | barrier(); | 509 | /* make variables visible to the nmi handler: */ |
| 510 | smp_mb(); | ||
| 508 | err = register_die_notifier(&profile_exceptions_nb); | 511 | err = register_die_notifier(&profile_exceptions_nb); |
| 509 | if (err) | 512 | if (err) |
| 510 | goto fail; | 513 | goto fail; |
| 511 | 514 | ||
| 512 | get_online_cpus(); | 515 | get_online_cpus(); |
| 513 | register_cpu_notifier(&oprofile_cpu_nb); | 516 | register_cpu_notifier(&oprofile_cpu_nb); |
| 514 | on_each_cpu(nmi_cpu_setup, NULL, 1); | ||
| 515 | nmi_enabled = 1; | 517 | nmi_enabled = 1; |
| 518 | /* make nmi_enabled visible to the nmi handler: */ | ||
| 519 | smp_mb(); | ||
| 520 | on_each_cpu(nmi_cpu_setup, NULL, 1); | ||
| 516 | put_online_cpus(); | 521 | put_online_cpus(); |
| 517 | 522 | ||
| 518 | return 0; | 523 | return 0; |
| @@ -531,7 +536,8 @@ static void nmi_shutdown(void) | |||
| 531 | nmi_enabled = 0; | 536 | nmi_enabled = 0; |
| 532 | ctr_running = 0; | 537 | ctr_running = 0; |
| 533 | put_online_cpus(); | 538 | put_online_cpus(); |
| 534 | barrier(); | 539 | /* make variables visible to the nmi handler: */ |
| 540 | smp_mb(); | ||
| 535 | unregister_die_notifier(&profile_exceptions_nb); | 541 | unregister_die_notifier(&profile_exceptions_nb); |
| 536 | msrs = &get_cpu_var(cpu_msrs); | 542 | msrs = &get_cpu_var(cpu_msrs); |
| 537 | model->shutdown(msrs); | 543 | model->shutdown(msrs); |
