void sched_clock_init(void) { u64 ktime_now = ktime_to_ns(ktime_get()); int cpu; for_each_possible_cpu(cpu) { struct sched_clock_data *scd = cpu_sdc(cpu); scd->tick_raw = 0; scd->tick_gtod = ktime_now; scd->clock = ktime_now; } sched_clock_running = 1; /* * Ensure that it is impossible to not do a static_key update. * * Either {set,clear}_sched_clock_stable() must see sched_clock_running * and do the update, or we must see their __sched_clock_stable_early * and do the update, or both. */ smp_mb(); /* matches {set,clear}_sched_clock_stable() */ if (__sched_clock_stable_early) __set_sched_clock_stable(); else __clear_sched_clock_stable(NULL); }
void set_sched_clock_stable(void) { __sched_clock_stable_early = 1; smp_mb(); /* matches sched_clock_init() */ if (!sched_clock_running) return; __set_sched_clock_stable(); }
void sched_clock_init_late(void) { sched_clock_running = 2; /* * Ensure that it is impossible to not do a static_key update. * * Either {set,clear}_sched_clock_stable() must see sched_clock_running * and do the update, or we must see their __sched_clock_stable_early * and do the update, or both. */ smp_mb(); /* matches {set,clear}_sched_clock_stable() */ if (__sched_clock_stable_early) __set_sched_clock_stable(); }