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 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.

Wish you a happy new year.

Best,
Tao




[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