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_setup(void) { int err; u64 period; /* clock cycles per tick: */ period = (u64)cpu_khz * 1000; do_div(period, HZ); nmi_timer_attr.sample_period = period; err = cpuhp_setup_state(CPUHP_AP_ONLINE_DYN, "oprofile/nmi:online", nmi_timer_cpu_online, nmi_timer_cpu_predown); if (err < 0) { nmi_timer_shutdown(); return err; } hp_online = err; return 0; }
int __init op_nmi_timer_init(struct oprofile_operations *ops) { int err = 0; err = nmi_timer_setup(); if (err) return err; nmi_timer_shutdown(); /* only check, don't alloc */ ops->create_files = NULL; ops->setup = nmi_timer_setup; ops->shutdown = nmi_timer_shutdown; ops->start = nmi_timer_start; ops->stop = nmi_timer_stop; ops->cpu_type = "timer"; printk(KERN_INFO "oprofile: using NMI timer interrupt.\n"); return 0; }