|
@@ -108,8 +108,8 @@ static void nmi_timer_shutdown(void)
|
|
struct perf_event *event;
|
|
struct perf_event *event;
|
|
int cpu;
|
|
int cpu;
|
|
|
|
|
|
- get_online_cpus();
|
|
|
|
- unregister_cpu_notifier(&nmi_timer_cpu_nb);
|
|
|
|
|
|
+ cpu_notifier_register_begin();
|
|
|
|
+ __unregister_cpu_notifier(&nmi_timer_cpu_nb);
|
|
for_each_possible_cpu(cpu) {
|
|
for_each_possible_cpu(cpu) {
|
|
event = per_cpu(nmi_timer_events, cpu);
|
|
event = per_cpu(nmi_timer_events, cpu);
|
|
if (!event)
|
|
if (!event)
|
|
@@ -119,7 +119,7 @@ static void nmi_timer_shutdown(void)
|
|
perf_event_release_kernel(event);
|
|
perf_event_release_kernel(event);
|
|
}
|
|
}
|
|
|
|
|
|
- put_online_cpus();
|
|
|
|
|
|
+ cpu_notifier_register_done();
|
|
}
|
|
}
|
|
|
|
|
|
static int nmi_timer_setup(void)
|
|
static int nmi_timer_setup(void)
|
|
@@ -132,20 +132,23 @@ static int nmi_timer_setup(void)
|
|
do_div(period, HZ);
|
|
do_div(period, HZ);
|
|
nmi_timer_attr.sample_period = period;
|
|
nmi_timer_attr.sample_period = period;
|
|
|
|
|
|
- get_online_cpus();
|
|
|
|
- err = register_cpu_notifier(&nmi_timer_cpu_nb);
|
|
|
|
|
|
+ cpu_notifier_register_begin();
|
|
|
|
+ err = __register_cpu_notifier(&nmi_timer_cpu_nb);
|
|
if (err)
|
|
if (err)
|
|
goto out;
|
|
goto out;
|
|
|
|
+
|
|
/* can't attach events to offline cpus: */
|
|
/* can't attach events to offline cpus: */
|
|
for_each_online_cpu(cpu) {
|
|
for_each_online_cpu(cpu) {
|
|
err = nmi_timer_start_cpu(cpu);
|
|
err = nmi_timer_start_cpu(cpu);
|
|
- if (err)
|
|
|
|
- break;
|
|
|
|
|
|
+ if (err) {
|
|
|
|
+ cpu_notifier_register_done();
|
|
|
|
+ nmi_timer_shutdown();
|
|
|
|
+ return err;
|
|
|
|
+ }
|
|
}
|
|
}
|
|
- if (err)
|
|
|
|
- nmi_timer_shutdown();
|
|
|
|
|
|
+
|
|
out:
|
|
out:
|
|
- put_online_cpus();
|
|
|
|
|
|
+ cpu_notifier_register_done();
|
|
return err;
|
|
return err;
|
|
}
|
|
}
|
|
|
|
|