From: Marcelo Tosatti <mtosatti@redhat.com>
To: Jan Kiszka <jan.kiszka@siemens.com>
Cc: kvm <kvm@vger.kernel.org>, Avi Kivity <avi@redhat.com>,
Zachary Amsden <zamsden@gmail.com>
Subject: Re: KVM: x86: fix kvm_write_tsc() TSC matching thinko
Date: Wed, 14 Mar 2012 22:42:25 -0300 [thread overview]
Message-ID: <20120315014225.GA10879@amt.cnet> (raw)
In-Reply-To: <4F607AD1.5050605@siemens.com>
On Wed, Mar 14, 2012 at 12:02:41PM +0100, Jan Kiszka wrote:
> On 2012-03-08 22:46, Marcelo Tosatti wrote:
> >
> > kvm_write_tsc() converts from guest TSC to microseconds, not nanoseconds
> > as intended. The result is that the window for matching is 1000 seconds,
> > not 1 second.
> >
> > Microsecond precision is enough for checking whether the TSC write delta
> > is within the heuristic values, so use it instead of nanoseconds.
> >
> > Noted by Avi Kivity.
> >
> > Signed-off-by: Marcelo Tosatti <mtosatti@redhat.com>
> >
> > diff --git a/arch/x86/kvm/x86.c b/arch/x86/kvm/x86.c
> > index 32096cf..9732e98 100644
> > --- a/arch/x86/kvm/x86.c
> > +++ b/arch/x86/kvm/x86.c
> > @@ -1025,7 +1025,7 @@ void kvm_write_tsc(struct kvm_vcpu *vcpu, u64 data)
> > struct kvm *kvm = vcpu->kvm;
> > u64 offset, ns, elapsed;
> > unsigned long flags;
> > - s64 nsdiff;
> > + s64 usdiff;
> >
> > raw_spin_lock_irqsave(&kvm->arch.tsc_write_lock, flags);
> > offset = kvm_x86_ops->compute_tsc_offset(vcpu, data);
> > @@ -1033,18 +1033,18 @@ void kvm_write_tsc(struct kvm_vcpu *vcpu, u64 data)
> > elapsed = ns - kvm->arch.last_tsc_nsec;
> >
> > /* n.b - signed multiplication and division required */
> > - nsdiff = data - kvm->arch.last_tsc_write;
> > + usdiff = data - kvm->arch.last_tsc_write;
> > #ifdef CONFIG_X86_64
> > - nsdiff = (nsdiff * 1000) / vcpu->arch.virtual_tsc_khz;
> > + usdiff = (usdiff * 1000) / vcpu->arch.virtual_tsc_khz;
> > #else
> > /* do_div() only does unsigned */
> > asm("idivl %2; xor %%edx, %%edx"
> > - : "=A"(nsdiff)
> > - : "A"(nsdiff * 1000), "rm"(vcpu->arch.virtual_tsc_khz));
> > + : "=A"(usdiff)
> > + : "A"(usdiff * 1000), "rm"(vcpu->arch.virtual_tsc_khz));
> > #endif
> > - nsdiff -= elapsed;
> > - if (nsdiff < 0)
> > - nsdiff = -nsdiff;
> > + usdiff -= elapsed / 1000;
>
> do_div, to please x86-32.
>
> Jan
Fixed, thanks Jan.
prev parent reply other threads:[~2012-03-15 1:45 UTC|newest]
Thread overview: 3+ messages / expand[flat|nested] mbox.gz Atom feed top
2012-03-08 21:46 KVM: x86: fix kvm_write_tsc() TSC matching thinko Marcelo Tosatti
2012-03-14 11:02 ` Jan Kiszka
2012-03-15 1:42 ` Marcelo Tosatti [this message]
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=20120315014225.GA10879@amt.cnet \
--to=mtosatti@redhat.com \
--cc=avi@redhat.com \
--cc=jan.kiszka@siemens.com \
--cc=kvm@vger.kernel.org \
--cc=zamsden@gmail.com \
/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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.