46 lines
1.6 KiB
Diff
46 lines
1.6 KiB
Diff
From: Pavel Tatashin <pasha.tatashin@soleen.com>
|
|
Date: Sat, 26 Jan 2019 12:49:56 -0500
|
|
Subject: x86/kvmclock: set offset for kvm unstable clock
|
|
Origin: https://patchwork.kernel.org/patch/10782557/
|
|
Bug-Debian: https://bugs.debian.org/918036
|
|
|
|
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@codewreck.org>
|
|
Signed-off-by: Pavel Tatashin <pasha.tatashin@soleen.com>
|
|
[carnil: Backport to 4.19 for context changes]
|
|
---
|
|
arch/x86/kernel/kvmclock.c | 6 +-----
|
|
1 file changed, 1 insertion(+), 5 deletions(-)
|
|
|
|
--- a/arch/x86/kernel/kvmclock.c
|
|
+++ b/arch/x86/kernel/kvmclock.c
|
|
@@ -117,11 +117,8 @@ static u64 kvm_sched_clock_read(void)
|
|
|
|
static inline void kvm_sched_clock_init(bool stable)
|
|
{
|
|
- if (!stable) {
|
|
- pv_time_ops.sched_clock = kvm_clock_read;
|
|
+ if (!stable)
|
|
clear_sched_clock_stable();
|
|
- return;
|
|
- }
|
|
|
|
kvm_sched_clock_offset = kvm_clock_read();
|
|
pv_time_ops.sched_clock = kvm_sched_clock_read;
|