static int nmi_timer_setup(void) { int cpu, err; u64 period; /* clock cycles per tick: */ period = (u64)cpu_khz * 1000; do_div(period, HZ); nmi_timer_attr.sample_period = period; cpu_notifier_register_begin(); err = __register_cpu_notifier(&nmi_timer_cpu_nb); if (err) goto out; /* can't attach events to offline cpus: */ for_each_online_cpu(cpu) { err = nmi_timer_start_cpu(cpu); if (err) { cpu_notifier_register_done(); nmi_timer_shutdown(); return err; } } out: cpu_notifier_register_done(); return err; }
static int nmi_timer_start(void) { int cpu; get_online_cpus(); ctr_running = 1; for_each_online_cpu(cpu) nmi_timer_start_cpu(cpu); put_online_cpus(); return 0; }
static int nmi_timer_cpu_notifier(struct notifier_block *b, unsigned long action, void *data) { int cpu = (unsigned long)data; switch (action) { case CPU_DOWN_FAILED: case CPU_ONLINE: nmi_timer_start_cpu(cpu); break; case CPU_DOWN_PREPARE: nmi_timer_stop_cpu(cpu); break; } return NOTIFY_DONE; }
static int nmi_timer_cpu_online(unsigned int cpu) { nmi_timer_start_cpu(cpu); return 0; }