From mboxrd@z Thu Jan 1 00:00:00 1970 From: Peter Lieven Subject: Re: [RFC PATCH v2 1/2] add support for Hyper-V reference time counter Date: Thu, 23 May 2013 12:45:34 +0200 Message-ID: <519DF34E.9040409@dlhnet.de> References: <1368947197-9033-1-git-send-email-vrozenfe@redhat.com> <1368947197-9033-2-git-send-email-vrozenfe@redhat.com> <20130522004614.GA7322@amt.cnet> <745195650.5763962.1369207977883.JavaMail.root@redhat.com> <519D3ED6.8010804@redhat.com> <519DB495.8040708@dlhnet.de> <519DE747.9070303@redhat.com> Mime-Version: 1.0 Content-Type: text/plain; charset=UTF-8; format=flowed Content-Transfer-Encoding: QUOTED-PRINTABLE Cc: Vadim Rozenfeld , Marcelo Tosatti , kvm@vger.kernel.org, gleb@redhat.com, pl@dlh.net To: Paolo Bonzini Return-path: Received: from ssl.dlhnet.de ([91.198.192.8]:54747 "EHLO ssl.dlh.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1758386Ab3EWKpg (ORCPT ); Thu, 23 May 2013 06:45:36 -0400 In-Reply-To: <519DE747.9070303@redhat.com> Sender: kvm-owner@vger.kernel.org List-ID: On 23.05.2013 11:54, Paolo Bonzini wrote: > Il 23/05/2013 08:17, Peter Lieven ha scritto: >> On 22.05.2013 23:55, Paolo Bonzini wrote: >>> Il 22/05/2013 09:32, Vadim Rozenfeld ha scritto: >>>>>> @@ -1827,6 +1829,29 @@ static int set_msr_hyperv_pw(struct kvm_v= cpu >>>>>> *vcpu, u32 msr, u64 data) >>>>>> if (__copy_to_user((void __user *)addr, instructions,= 4)) >>>>>> return 1; >>>>>> kvm->arch.hv_hypercall =3D data; >>>>>> + local_irq_disable(); >>>>>> + kvm->arch.hv_ref_count =3D get_kernel_ns(); >>>>>> + local_irq_enable(); >>>>>> + break; >>>> local_irq_disable/local_irq_enable not needed. >>>> >>>> >>>> What is the reasoning behind reading this time value at msr write = time? >>>> [VR] Windows writs this MSR only once, during HAL initialization. >>>> So, I decided to treat this call as a partition crate event. >>>> >>> >>> But is it expected by Windows that the reference count starts count= ing >>> up from 0 at partition creation time? If you could just use >>> (get_kernel_ns() + kvm->arch.kvmclock_offset) / 100, it would also = be >>> simpler for migration purposes. >> >> I can just report, that I have used the patch that does it that way = and >> it works. > > What do you mean by "that way"? :) Ups sorry=E2=80=A6 I meant the way it was implemented in the old patch = (I sent a few days ago). @@ -1426,6 +1428,21 @@ static int set_msr_hyperv_pw(struct kvm_ if (__copy_to_user((void *)addr, instructions, 4)) return 1; kvm->arch.hv_hypercall =3D data; + kvm->arch.hv_ref_count =3D get_kernel_ns(); + break; + } + case HV_X64_MSR_REFERENCE_TSC: { + u64 gfn; + unsigned long addr; + u32 hv_tsc_sequence; + gfn =3D data >> HV_X64_MSR_HYPERCALL_PAGE_ADDRESS_SHIFT; + addr =3D gfn_to_hva(kvm, gfn); + if (kvm_is_error_hva(addr)) + return 1; + hv_tsc_sequence =3D 0x0; //invalid + if (__copy_to_user((void *)addr, (void __user *) &hv_tsc_sequence,= sizeof(hv_tsc_sequence))) + return 1; =09 + kvm->arch.hv_reference_tsc =3D data; break; } default: @@ -1826,6 +1843,17 @@ static int get_msr_hyperv_pw(struct kvm_ case HV_X64_MSR_HYPERCALL: data =3D kvm->arch.hv_hypercall; break; + case HV_X64_MSR_TIME_REF_COUNT: { + u64 now_ns; + local_irq_disable(); + now_ns =3D get_kernel_ns(); + data =3D div_u64(now_ns + kvm->arch.kvmclock_offset - kvm->arch.hv_r= ef_count,100); + local_irq_enable(); + break; + } + case HV_X64_MSR_REFERENCE_TSC: + data =3D kvm->arch.hv_reference_tsc; + break; default: pr_unimpl(vcpu, "Hyper-V unhandled rdmsr: 0x%x\n", msr); return 1; Peter