* Questions about TSC virtualization in KVM
@ 2023-10-24 17:15 Yifei Ma
2023-10-24 17:33 ` Sean Christopherson
0 siblings, 1 reply; 4+ messages in thread
From: Yifei Ma @ 2023-10-24 17:15 UTC (permalink / raw)
To: kvm
Hi KVM community,
I am trying to figure out how TSC is virtualized in KVM-VMX world.
According to the kernel documentation, reading TSC register through MSR can be trapped into KVM and VMX. I am trying to figure out the KVM code handing this trap.
In order to understand it, I have run a kernel traced by GDB, and added break points to the code I thought they may handle the MSR trap, e.g., kvm_get_msr, vmx_exec_control, etc. Then ran rdtsc from guest application, however, it didn’t trigger these breakpoints. I am a little lost in how TSC is virtualized.
Two questions:
- does the TSC MRS instructions are emulated and trapped into KVM?
- if TSC is trapped, which code handles it?
Any background about TSC virtualization and suggestions on tracing its virtualization are appreciated.
Thank you,
Yifei
^ permalink raw reply [flat|nested] 4+ messages in thread
* Re: Questions about TSC virtualization in KVM
2023-10-24 17:15 Questions about TSC virtualization in KVM Yifei Ma
@ 2023-10-24 17:33 ` Sean Christopherson
2023-10-25 23:11 ` Yifei Ma
0 siblings, 1 reply; 4+ messages in thread
From: Sean Christopherson @ 2023-10-24 17:33 UTC (permalink / raw)
To: Yifei Ma; +Cc: kvm
On Tue, Oct 24, 2023, Yifei Ma wrote:
> Hi KVM community,
>
> I am trying to figure out how TSC is virtualized in KVM-VMX world.
> According to the kernel documentation, reading TSC register through MSR
> can be trapped into KVM and VMX. I am trying to figure out the KVM code
> handing this trap.
Key word "can". KVM chooses not to intercept RDMSR to MSR_IA32_TSC because
hardware handles the necessary offset and scaling. KVM does still emulate reads
in kvm_get_msr_common(), e.g. if KVM is forced to emulate a RDMSR, but that's a
very, very uncommon path.
Ditto for the RDTSC instruction, which isn't subject to MSR intercpetion bitmaps
and has a dedicated control. KVM will emulate RDTSC if KVM is already emulating,
but otherwise the guest can execute RDTSC without triggering a VM-Exit.
Modern CPUs provide both a offset and a scaling factor for VMX guests, i.e. the
CPU itself virtualizes guest TSC. See the RDMSR and RDTSC bullet points in the
"CHANGES TO INSTRUCTION BEHAVIOR IN VMX NON-ROOT OPERATION" section of the SDM
for details.
> In order to understand it, I have run a kernel traced by GDB, and added
> break points to the code I thought they may handle the MSR trap, e.g.,
> kvm_get_msr, vmx_exec_control, etc. Then ran rdtsc from guest application,
> however, it didn’t trigger these breakpoints. I am a little lost in how
> TSC is virtualized.
>
> Two questions:
> - does the TSC MRS instructions are emulated and trapped into KVM?
Nope, see above.
> - if TSC is trapped, which code handles it?
Also see above :-)
> Any background about TSC virtualization and suggestions on tracing its
> virtualization are appreciated.
^ permalink raw reply [flat|nested] 4+ messages in thread
* Re: Questions about TSC virtualization in KVM
2023-10-24 17:33 ` Sean Christopherson
@ 2023-10-25 23:11 ` Yifei Ma
2023-10-26 13:35 ` Sean Christopherson
0 siblings, 1 reply; 4+ messages in thread
From: Yifei Ma @ 2023-10-25 23:11 UTC (permalink / raw)
To: Sean Christopherson; +Cc: kvm
Thank you for your input, Sean.
I went through the SDM virtual machine extensions chapter, and some KVM patches and it helped me a lot. My understanding is:
If the RDTSC existing flied in the VMCS is not set, then the rdtsc from non-root model won’t cause VM-exit. In this case, the TSC returned to non-root is the value of the physical TSC * scaling + offset, if scaling and offset are set by KVM.
The TSC offset and scaling of a vCPU can be set from root-mode through KVM APIs using command KVM_VCPU_TSC_CTRL & KVM_SET_TSC_KHZ , and they are written to the vCPU’s VMCS fields. Next time, non-root mode calls rdtsc, the VMX hardware will add the offset & scaling to the physical TSC.
Is my understanding correct? Of cause, I will do some testing to verify it.
Thank you,
Yifei
> On Oct 24, 2023, at 10:33 AM, Sean Christopherson <seanjc@google.com> wrote:
>
> On Tue, Oct 24, 2023, Yifei Ma wrote:
>> Hi KVM community,
>>
>> I am trying to figure out how TSC is virtualized in KVM-VMX world.
>> According to the kernel documentation, reading TSC register through MSR
>> can be trapped into KVM and VMX. I am trying to figure out the KVM code
>> handing this trap.
>
> Key word "can". KVM chooses not to intercept RDMSR to MSR_IA32_TSC because
> hardware handles the necessary offset and scaling. KVM does still emulate reads
> in kvm_get_msr_common(), e.g. if KVM is forced to emulate a RDMSR, but that's a
> very, very uncommon path.
>
> Ditto for the RDTSC instruction, which isn't subject to MSR intercpetion bitmaps
> and has a dedicated control. KVM will emulate RDTSC if KVM is already emulating,
> but otherwise the guest can execute RDTSC without triggering a VM-Exit.
>
> Modern CPUs provide both a offset and a scaling factor for VMX guests, i.e. the
> CPU itself virtualizes guest TSC. See the RDMSR and RDTSC bullet points in the
> "CHANGES TO INSTRUCTION BEHAVIOR IN VMX NON-ROOT OPERATION" section of the SDM
> for details.
>
>> In order to understand it, I have run a kernel traced by GDB, and added
>> break points to the code I thought they may handle the MSR trap, e.g.,
>> kvm_get_msr, vmx_exec_control, etc. Then ran rdtsc from guest application,
>> however, it didn’t trigger these breakpoints. I am a little lost in how
>> TSC is virtualized.
>>
>> Two questions:
>> - does the TSC MRS instructions are emulated and trapped into KVM?
>
> Nope, see above.
>
>> - if TSC is trapped, which code handles it?
>
> Also see above :-)
>
>> Any background about TSC virtualization and suggestions on tracing its
>> virtualization are appreciated.
^ permalink raw reply [flat|nested] 4+ messages in thread
* Re: Questions about TSC virtualization in KVM
2023-10-25 23:11 ` Yifei Ma
@ 2023-10-26 13:35 ` Sean Christopherson
0 siblings, 0 replies; 4+ messages in thread
From: Sean Christopherson @ 2023-10-26 13:35 UTC (permalink / raw)
To: Yifei Ma; +Cc: kvm
Please don't top post. https://people.kernel.org/tglx/notes-about-netiquette
On Wed, Oct 25, 2023, Yifei Ma wrote:
> > On Oct 24, 2023, at 10:33 AM, Sean Christopherson <seanjc@google.com> wrote:
> >
> > On Tue, Oct 24, 2023, Yifei Ma wrote:
> >> Hi KVM community,
> >>
> >> I am trying to figure out how TSC is virtualized in KVM-VMX world.
> >> According to the kernel documentation, reading TSC register through MSR
> >> can be trapped into KVM and VMX. I am trying to figure out the KVM code
> >> handing this trap.
> >
> > Key word "can". KVM chooses not to intercept RDMSR to MSR_IA32_TSC because
> > hardware handles the necessary offset and scaling. KVM does still emulate reads
> > in kvm_get_msr_common(), e.g. if KVM is forced to emulate a RDMSR, but that's a
> > very, very uncommon path.
> >
> > Ditto for the RDTSC instruction, which isn't subject to MSR intercpetion bitmaps
> > and has a dedicated control. KVM will emulate RDTSC if KVM is already emulating,
> > but otherwise the guest can execute RDTSC without triggering a VM-Exit.
> >
> > Modern CPUs provide both a offset and a scaling factor for VMX guests, i.e. the
> > CPU itself virtualizes guest TSC. See the RDMSR and RDTSC bullet points in the
> > "CHANGES TO INSTRUCTION BEHAVIOR IN VMX NON-ROOT OPERATION" section of the SDM
> > for details.
>
> I went through the SDM virtual machine extensions chapter, and some KVM
> patches and it helped me a lot. My understanding is:
>
> If the RDTSC existing flied in the VMCS is not set, then the rdtsc from
> non-root model won’t cause VM-exit. In this case, the TSC returned to
> non-root is the value of the physical TSC * scaling + offset, if scaling and
> offset are set by KVM.
Yes. Note, if hardware supports TSC offsetting and/or TSC scaling, they are
enabled by KVM. KVM simply uses an initial offset of '0' and a multiplier that
makes the guest TSC "run" at the same frequency as the host.
> The TSC offset and scaling of a vCPU can be set from root-mode through KVM
> APIs using command KVM_VCPU_TSC_CTRL & KVM_SET_TSC_KHZ , and they are written
> to the vCPU’s VMCS fields. Next time, non-root mode calls rdtsc, the VMX
> hardware will add the offset & scaling to the physical TSC.
Yes, with caveats. The guest can write MSR_IA32_TSC and/or MSR_IA32_TSC_ADJUST,
which KVM emulates by modifying TSC_OFFSET. If the CPU doesn't have a constant
TSC, KVM will adjust TSC_OFFSET before the next VM-Enter to try and keep guest
TSC consistent and monotonic. If the CPU doesn't support TSC scaling, KVM will
manually scale the guest TSC prior to every VM-Enter by again adjusting TSC_OFFSET
to "catch up" to what the guest TSC _should_ be given the guest TSC frequency.
^ permalink raw reply [flat|nested] 4+ messages in thread
end of thread, other threads:[~2023-10-26 13:35 UTC | newest]
Thread overview: 4+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2023-10-24 17:15 Questions about TSC virtualization in KVM Yifei Ma
2023-10-24 17:33 ` Sean Christopherson
2023-10-25 23:11 ` Yifei Ma
2023-10-26 13:35 ` Sean Christopherson
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox