void __init sched_clock_init(void)
{
+ unsigned long flags;
+
+ /*
+ * Set __gtod_offset such that once we mark sched_clock_running,
+ * sched_clock_tick() continues where sched_clock() left off.
+ *
+ * Even if TSC is buggered, we're still UP at this point so it
+ * can't really be out of sync.
+ */
+ local_irq_save(flags);
+ __sched_clock_gtod_offset();
+ local_irq_restore(flags);
+
sched_clock_running = 1;
+
+ /* Now that sched_clock_running is set adjust scd */
+ local_irq_save(flags);
+ sched_clock_tick();
+ local_irq_restore(flags);
}
/*
* We run this as late_initcall() such that it runs after all built-in drivers,
return sched_clock() + __sched_clock_offset;
if (unlikely(!sched_clock_running))
- return 0ull;
+ return sched_clock();
preempt_disable_notrace();
scd = cpu_sdc(cpu);