Sophie

Sophie

distrib > Scientific%20Linux > 5x > x86_64 > by-pkgid > 27922b4260f65d317aabda37e42bbbff > files > 1671

kernel-2.6.18-238.el5.src.rpm

From: Glauber Costa <glommer@redhat.com>
Date: Mon, 25 Jan 2010 17:41:19 -0500
Subject: [kvm] kvmclock won't restore properly after resume
Message-id: <1264441279-12593-1-git-send-email-glommer@redhat.com>
Patchwork-id: 22798
O-Subject: [PATCH] RHEL5.5 BZ539521 kvmclock won't restore properly after resume
Bugzilla: 539521
RH-Acked-by: Rik van Riel <riel@redhat.com>
RH-Acked-by: Juan Quintela <quintela@redhat.com>
RH-Acked-by: Don Dutile <ddutile@redhat.com>

All other time sources grab their value explicitly after a suspend/resume
cycle, and can thus, calculate how much time they went down.
kvmclock is currently not doing it, which will result in the guest's
notion of time getting awkward after a suspend/resume cycle.

Slowness and even crashes were seen.

Signed-off-by: Glauber Costa <glommer@redhat.com>
RH-Bugzilla: 539521
RH-Upstream-status: N/A

diff --git a/arch/x86_64/kernel/time.c b/arch/x86_64/kernel/time.c
index 2f5a849..48cd2e1 100644
--- a/arch/x86_64/kernel/time.c
+++ b/arch/x86_64/kernel/time.c
@@ -1606,7 +1606,10 @@ static int timer_resume(struct sys_device *dev)
 	write_seqlock_irqsave(&xtime_lock,flags);
 	xtime.tv_sec = sec;
 	xtime.tv_nsec = 0;
-	if (vxtime.mode == VXTIME_HPET) {
+	if (vxtime.mode == VXTIME_KVM) {
+		vxtime.last_kvm = kvm_clock_read();
+		vxtime.last_tsc = get_cycles_sync();
+	} else if (vxtime.mode == VXTIME_HPET) {
 		if (hpet_use_timer)
 			vxtime.last = hpet_readl(HPET_T0_CMP) - hpet_tick_real;
 		else