On 26/01/19 18:49, Pavel Tatashin wrote: > VMs may show incorrect uptime and dmesg printk offsets on hypervisors with > unstable clock. The problem is produced when VM is rebooted without exiting > from qemu. > > The fix is to calculate clock offset not only for stable clock but for > unstable clock as well, and use kvm_sched_clock_read() which substracts > the offset for both clocks. > > This is safe, because pvclock_clocksource_read() does the right thing and > makes sure that clock always goes forward, so once offset is calculated > with unstable clock, we won't get new reads that are smaller than offset, > and thus won't get negative results. > > Thank you Jon DeVree for helping to reproduce this issue. > > Fixes: 857baa87b642 ("sched/clock: Enable sched clock early") > > Reported-by: Dominique Martinet <asmadeus@xxxxxxxxxxxxx> > Signed-off-by: Pavel Tatashin <pasha.tatashin@xxxxxxxxxx> > --- > arch/x86/kernel/kvmclock.c | 6 +----- > 1 file changed, 1 insertion(+), 5 deletions(-) > > diff --git a/arch/x86/kernel/kvmclock.c b/arch/x86/kernel/kvmclock.c > index e811d4d1c824..d908a37bf3f3 100644 > --- a/arch/x86/kernel/kvmclock.c > +++ b/arch/x86/kernel/kvmclock.c > @@ -104,12 +104,8 @@ static u64 kvm_sched_clock_read(void) > > static inline void kvm_sched_clock_init(bool stable) > { > - if (!stable) { > - pv_ops.time.sched_clock = kvm_clock_read; > + if (!stable) > clear_sched_clock_stable(); > - return; > - } > - > kvm_sched_clock_offset = kvm_clock_read(); > pv_ops.time.sched_clock = kvm_sched_clock_read; > > Queued, thanks. Pa