From: Gerd Hoffmann <kraxel@redhat.com>
To: Avi Kivity <avi@qumranet.com>
Cc: kvm-devel <kvm-devel@lists.sourceforge.net>,
Jeremy Fitzhardinge <jeremy@goop.org>,
Glauber de Oliveira Costa <gcosta@redhat.com>
Subject: Re: pv clock: kvm is incompatible with xen :-(
Date: Fri, 11 Apr 2008 15:44:35 +0200 [thread overview]
Message-ID: <47FF6B43.1070305@redhat.com> (raw)
In-Reply-To: <47FF545C.3010107@qumranet.com>
[-- Attachment #1: Type: text/plain, Size: 1169 bytes --]
Avi Kivity wrote:
> Gerd Hoffmann wrote:
>> Hi,
>>
>> Tried to use kvmclock with xenner and noticed that the kvmclock
>> (MSR_KVM_SYSTEM_TIME msr) is incompatible with xen.
>
> Patches are welcome, especially as kvmclock isn't merged yet, so there
> are no backward compatibility issues.
Great, so I'll happily go break kvm guests ;)
Patch revision #1 attached. It changes the way the tsc-delta-scaling
fields are calculated to be compatible with xen. Code is taken from
xenner (which got it from xen) and adapted a bit. Host only, kvm guest
side not done (yet).
With that patch applied xen guests with pv clock enabled happily boot to
the login prompt, without complains about time going backwards. Fine.
Wall clock is off a few hours though. Oops.
I think the way wall clock and system clock work together in xen (Jeremy
correct me if I'm wrong) is that the wall clock specifies the point in
time where the system clock started going. As kvm fills in host system
time into the guest system time fields the guest wall clock fields
should be filled with the host boot time timestamp I'd say.
Comments?
Gerd
--
http://kraxel.fedorapeople.org/xenner/
[-- Attachment #2: kvmclock-1.diff --]
[-- Type: text/x-patch, Size: 1664 bytes --]
diff -up kvm-65/kernel/x86.c.fix kvm-65/kernel/x86.c
--- kvm-65/kernel/x86.c.fix 2008-04-06 21:23:07.000000000 +0200
+++ kvm-65/kernel/x86.c 2008-04-11 15:18:23.000000000 +0200
@@ -548,6 +548,44 @@ static void kvm_write_guest_time(struct
mark_page_dirty(v->kvm, vcpu->time >> PAGE_SHIFT);
}
+static uint32_t div_frac(uint32_t dividend, uint32_t divisor)
+{
+ uint32_t quotient, remainder;
+
+ __asm__ ( "divl %4"
+ : "=a" (quotient), "=d" (remainder)
+ : "0" (0), "1" (dividend), "r" (divisor) );
+ return quotient;
+}
+
+static void kvm_set_time_scale(uint32_t tsc_khz, struct kvm_vcpu_time_info *hv_clock)
+{
+ uint64_t nsecs = 1000000000LL;
+ int32_t shift = 0;
+ uint64_t tps64;
+ uint32_t tps32;
+
+ tps64 = tsc_khz * 1000LL;
+ while (tps64 > nsecs*2) {
+ tps64 >>= 1;
+ shift--;
+ }
+
+ tps32 = (uint32_t)tps64;
+ while (tps32 <= (uint32_t)nsecs) {
+ tps32 <<= 1;
+ shift++;
+ }
+
+ hv_clock->tsc_shift = shift;
+ hv_clock->tsc_to_system_mul = div_frac(nsecs, tps32);
+
+#if 0
+ printk(KERN_DEBUG "%s: tsc_khz %u, tsc_shift %d, tsc_mul %u\n",
+ __FUNCTION__, tsc_khz, hv_clock->tsc_shift,
+ hv_clock->tsc_to_system_mul);
+#endif
+}
int kvm_set_msr_common(struct kvm_vcpu *vcpu, u32 msr, u64 data)
{
@@ -596,9 +634,7 @@ int kvm_set_msr_common(struct kvm_vcpu *
/* ...but clean it before doing the actual write */
vcpu->arch.time_offset = data & ~(PAGE_MASK | 1);
- vcpu->arch.hv_clock.tsc_to_system_mul =
- clocksource_khz2mult(kvm_tsc_khz, 22);
- vcpu->arch.hv_clock.tsc_shift = 22;
+ kvm_set_time_scale(kvm_tsc_khz, &vcpu->arch.hv_clock);
down_read(¤t->mm->mmap_sem);
vcpu->arch.time_page =
[-- Attachment #3: Type: text/plain, Size: 320 bytes --]
-------------------------------------------------------------------------
This SF.net email is sponsored by the 2008 JavaOne(SM) Conference
Don't miss this year's exciting event. There's still time to save $100.
Use priority code J8TL2D2.
http://ad.doubleclick.net/clk;198757673;13503038;p?http://java.sun.com/javaone
[-- Attachment #4: Type: text/plain, Size: 158 bytes --]
_______________________________________________
kvm-devel mailing list
kvm-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/kvm-devel
next prev parent reply other threads:[~2008-04-11 13:44 UTC|newest]
Thread overview: 15+ messages / expand[flat|nested] mbox.gz Atom feed top
2008-04-11 7:33 pv clock: kvm is incompatible with xen :-( Gerd Hoffmann
2008-04-11 12:06 ` Avi Kivity
2008-04-11 13:44 ` Gerd Hoffmann [this message]
2008-04-11 15:01 ` Gerd Hoffmann
2008-04-11 19:02 ` Jeremy Fitzhardinge
2008-04-18 14:26 ` Gerd Hoffmann
2008-04-18 22:23 ` Jeremy Fitzhardinge
2008-04-21 7:31 ` Gerd Hoffmann
2008-04-21 11:46 ` Jeremy Fitzhardinge
2008-04-21 12:50 ` Gerd Hoffmann
2008-04-21 13:34 ` Jeremy Fitzhardinge
2008-04-21 14:20 ` Gerd Hoffmann
2008-04-22 17:54 ` Glauber Costa
2008-04-23 6:03 ` Gerd Hoffmann
2008-04-24 12:57 ` Glauber Costa
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=47FF6B43.1070305@redhat.com \
--to=kraxel@redhat.com \
--cc=avi@qumranet.com \
--cc=gcosta@redhat.com \
--cc=jeremy@goop.org \
--cc=kvm-devel@lists.sourceforge.net \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox