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

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

 



Hi Tao,

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

> 
> Thanks a lot.
> 




[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