|
@@ -31,6 +31,8 @@
|
|
|
/* Xen may fire a timer up to this many ns early */
|
|
|
#define TIMER_SLOP 100000
|
|
|
|
|
|
+static u64 xen_sched_clock_offset __read_mostly;
|
|
|
+
|
|
|
/* Get the TSC speed from Xen */
|
|
|
static unsigned long xen_tsc_khz(void)
|
|
|
{
|
|
@@ -57,6 +59,11 @@ static u64 xen_clocksource_get_cycles(struct clocksource *cs)
|
|
|
return xen_clocksource_read();
|
|
|
}
|
|
|
|
|
|
+static u64 xen_sched_clock(void)
|
|
|
+{
|
|
|
+ return xen_clocksource_read() - xen_sched_clock_offset;
|
|
|
+}
|
|
|
+
|
|
|
static void xen_read_wallclock(struct timespec64 *ts)
|
|
|
{
|
|
|
struct shared_info *s = HYPERVISOR_shared_info;
|
|
@@ -367,7 +374,7 @@ void xen_timer_resume(void)
|
|
|
}
|
|
|
|
|
|
static const struct pv_time_ops xen_time_ops __initconst = {
|
|
|
- .sched_clock = xen_clocksource_read,
|
|
|
+ .sched_clock = xen_sched_clock,
|
|
|
.steal_clock = xen_steal_clock,
|
|
|
};
|
|
|
|
|
@@ -505,6 +512,7 @@ static void __init xen_time_init(void)
|
|
|
|
|
|
void __init xen_init_time_ops(void)
|
|
|
{
|
|
|
+ xen_sched_clock_offset = xen_clocksource_read();
|
|
|
pv_time_ops = xen_time_ops;
|
|
|
|
|
|
x86_init.timers.timer_init = xen_time_init;
|
|
@@ -546,6 +554,7 @@ void __init xen_hvm_init_time_ops(void)
|
|
|
return;
|
|
|
}
|
|
|
|
|
|
+ xen_sched_clock_offset = xen_clocksource_read();
|
|
|
pv_time_ops = xen_time_ops;
|
|
|
x86_init.timers.setup_percpu_clockev = xen_time_init;
|
|
|
x86_cpuinit.setup_percpu_clockev = xen_hvm_setup_cpu_clockevents;
|