Re: obtain the timestamp counter of physical/host machine inside the VMs.

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



On Tue, Jan 02, 2024, Tao Lyu wrote:
> 
> Hi Dongli,
> 
> > On 1/1/24 14:06, Tao Lyu wrote:
> >> Hello Arnabjyoti, Sean, and everyone,
> >> 
> >> I'm having a similiar but slightly differnt issue about the rdtsc in KVM.
> >> 
> >> I want to obtain the timestamp counter of physical/host machine inside the VMs.
> >> 
> >> Acccording to the previous threads, I know I need to disable the offsetting, VM exit, and scaling.
> >> I specify the correspoding parameters in the qemu arguments.
> >> The booting command is listed below:
> >> 
> >> qemu-system-x86_64 -m 10240 -smp 4 -chardev socket,id=SOCKSYZ,server=on,nowait,host=localhost,port=3258 -mon chardev=SOCKSYZ,mode=control -display none -serial stdio -device virtio-rng-pci -enable-kvm -cpu host,migratable=off,tsc=on,rdtscp=on,vmx-tsc-offset=off,vmx-rdtsc-exit=off,tsc-scale=off,tsc-adjust=off,vmx-rdtscp-exit=off  -netdev bridge,id=hn40 -device virtio-net,netdev=hn40,mac=e6:c8:ff:09:76:38 -hda XXX -kernel XXX -append "root=/dev/sda console=ttyS0"
> >> 
> >> 
> >> But the rdtsc still returns the adjusted tsc.
> >> The vmxcap script shows the TSC settings as below:
> >>   
> >>   Use TSC offsetting                       no
> >>   RDTSC exiting                            no
> >>   Enable RDTSCP                            no
> >>   TSC scaling                              yes
> >> 
> >> 
> >> I would really appreciate it if anyone can tell me whether and how I can get the tsc of physical machine insdie the VM.
> 
> > If the objective is to obtain the same tsc at both VM and host side (that is, to
> > avoid any offset or scaling), I can obtain quite close tsc at both VM and host
> > side with the below linux-6.6 change.
> 
> > My env does not use tsc scaling.
> 
> > diff --git a/arch/x86/kvm/x86.c b/arch/x86/kvm/x86.c
> > index 41cce50..b102dcd 100644
> > --- a/arch/x86/kvm/x86.c
> > +++ b/arch/x86/kvm/x86.c
> >@@ -2723,7 +2723,7 @@ static void kvm_synchronize_tsc(struct kvm_vcpu *vcpu, u64
> data)
> >        bool synchronizing = false;
> >
> >       raw_spin_lock_irqsave(&kvm->arch.tsc_write_lock, flags);
> > -       offset = kvm_compute_l1_tsc_offset(vcpu, data);
> > +       offset = 0;
> >        ns = get_kvmclock_base_ns();
> >        elapsed = ns - kvm->arch.last_tsc_nsec;
> >
> > Dongli Zhang
> 
> 
> Hi Dongli,
> 
> Thank you so much for the explanation and for providing a patch.
> It works for me now.

Yeah, during vCPU creation KVM sets a target guest TSC of '0', i.e. sets the TSC
offset to "0 - HOST_TSC".  As of commit 828ca89628bf ("KVM: x86: Expose TSC offset
controls to userspace"), userspace can explicitly set an offset of '0' via
KVM_VCPU_TSC_CTRL+KVM_VCPU_TSC_OFFSET, but AFAIK QEMU doesn't support that API.

All the other methods for setting the TSC offset are indirect, i.e. userspace
provides the target TSC and KVM computes the offset.  So even if QEMU provides a
way to specify an explicit TSC (or offset), there will be a healthy amount of slop.





[Index of Archives]     [KVM ARM]     [KVM ia64]     [KVM ppc]     [Virtualization Tools]     [Spice Development]     [Libvirt]     [Libvirt Users]     [Linux USB Devel]     [Linux Audio Users]     [Yosemite Questions]     [Linux Kernel]     [Linux SCSI]     [XFree86]

  Powered by Linux