|
@@ -112,8 +112,10 @@ static void nmi_cpu_start(void *dummy)
|
|
|
static int nmi_start(void)
|
|
|
{
|
|
|
get_online_cpus();
|
|
|
- on_each_cpu(nmi_cpu_start, NULL, 1);
|
|
|
ctr_running = 1;
|
|
|
+ /* make ctr_running visible to the nmi handler: */
|
|
|
+ smp_mb();
|
|
|
+ on_each_cpu(nmi_cpu_start, NULL, 1);
|
|
|
put_online_cpus();
|
|
|
return 0;
|
|
|
}
|
|
@@ -504,15 +506,18 @@ static int nmi_setup(void)
|
|
|
|
|
|
nmi_enabled = 0;
|
|
|
ctr_running = 0;
|
|
|
- barrier();
|
|
|
+ /* make variables visible to the nmi handler: */
|
|
|
+ smp_mb();
|
|
|
err = register_die_notifier(&profile_exceptions_nb);
|
|
|
if (err)
|
|
|
goto fail;
|
|
|
|
|
|
get_online_cpus();
|
|
|
register_cpu_notifier(&oprofile_cpu_nb);
|
|
|
- on_each_cpu(nmi_cpu_setup, NULL, 1);
|
|
|
nmi_enabled = 1;
|
|
|
+ /* make nmi_enabled visible to the nmi handler: */
|
|
|
+ smp_mb();
|
|
|
+ on_each_cpu(nmi_cpu_setup, NULL, 1);
|
|
|
put_online_cpus();
|
|
|
|
|
|
return 0;
|
|
@@ -531,7 +536,8 @@ static void nmi_shutdown(void)
|
|
|
nmi_enabled = 0;
|
|
|
ctr_running = 0;
|
|
|
put_online_cpus();
|
|
|
- barrier();
|
|
|
+ /* make variables visible to the nmi handler: */
|
|
|
+ smp_mb();
|
|
|
unregister_die_notifier(&profile_exceptions_nb);
|
|
|
msrs = &get_cpu_var(cpu_msrs);
|
|
|
model->shutdown(msrs);
|