|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [Xen-devel] [PATCH 06/13] x86/hvm: Scale host TSC when setting/getting guest TSC
On Thu, Oct 22, 2015 at 08:17:29AM -0600, Jan Beulich wrote:
> >>> On 28.09.15 at 09:13, <haozhong.zhang@xxxxxxxxx> wrote:
> > The existing hvm_set_guest_tsc_fixed() and hvm_get_guest_tsc_fixed()
> > calculate the guest TSC by adding the TSC offset to the host TSC. When
> > the TSC scaling is enabled, the host TSC should be scaled first. This
> > patch adds the scaling logic to those two functions.
>
> Just like mentioned for the first twp patches - I'd first of all like to
> understand why the lack of scaling this wasn't an issue for SVM so
> far. What you reads plausible, but assuming that SVM TSC scaling
> code was tested, I'm hesitant to apply changes to it without
> understanding the details (or at least without SVM maintainers'
> consent).
>
The current SVM TSC ratio code does not seem correct w/o patch 6 (as
well as patch 2, but I only analyze patch 6 here). Following is the
explanation.
When SVM TSC ratio is used and the ratio is not 1,
1. The original hvm_get_guest_tsc_fixed(v, at_tsc) returns
(at_tsc ? : rdtsc()) + v->arch.hvm_vcpu.cache_tsc_offset
It's called in following control flows:
* hvm_msr_write_intercept(MSR_IA32_TSC_DEADLINE, msr_content, ...)
vlapic_tdt_msr_set(..., msr_content)
guest_tsc = hvm_get_guest_tsc(...)
hvm_get_guest_tsc_fixed(..., 0)
* hvm_save_cpu_ctxt()
svm_save_vmcb_ctxt(v, ...)
svm_save_cpu_state(v, data)
data->tsc = hvm_get_guest_tsc_fixed(v,
v->domain->arch.hvm_domain.sync_tsc)
* svm_set_tsc_offset(v, offset, at_tsc)
guest_tsc = hvm_get_guest_tsc_fixed(v, at_tsc)
In all above control flows, hvm_get_guest_tsc_fixed() is expected
to return the guest TSC. And if its 2nd argument at_tsc is not
zero, at_tsc is always a host TSC value. Thus,
hvm_get_guest_tsc_fixed() should scale at_tsc or rdtsc() in order
to get the correct guest TSC, but it doesn't.
2. In the original hvm_set_guest_tsc_fixed(v, guest_tsc, at_tsc),
v->arch.hvm_vcpu.cache_tsc_offset = guest_tsc - (at_tsc ? : rdtsc())
It's called in following control flows:
* hvm_set_guest_tsc(v, t)
hvm_set_guest_tsc_fixed(v, t, 0)
* hvm_load_cpu_ctxt()
svm_load_vmcb_ctxt(v, ctxt)
svm_load_cpu_state(v, ctxt)
hvm_set_guest_tsc_fixed(v, ctxt->tsc,
v->domain->arch.hvm_domain.sync_tsc)
In all above control flows, if the 3rd argument at_tsc of
hvm_set_guest_tsc_fixed() is not zero, it's always a host TSC
value. In order to get the correct TSC offset,
hvm_set_guest_tsc_fixed() should scale at_tsc or rdtsc(), but it
doesn't.
So this patch 6 is necessary to fix hvm_[g|s]et_guest_tsc_fixed() in
the TSC scaling circumstance.
Haozhong
_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxx
http://lists.xen.org/xen-devel
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |