All of lore.kernel.org
 help / color / mirror / Atom feed
From: Gleb Natapov <gleb@redhat.com>
To: Vadim Rozenfeld <vrozenfe@redhat.com>
Cc: Eric Northup <digitaleric@google.com>, KVM <kvm@vger.kernel.org>,
	Marcelo Tosatti <mtosatti@redhat.com>,
	pl@dlh.net
Subject: Re: [RFC PATCH 1/2] Hyper-H reference counter
Date: Thu, 16 May 2013 11:18:07 +0300	[thread overview]
Message-ID: <20130516081807.GK26453@redhat.com> (raw)
In-Reply-To: <1368524796.7956.19.camel@localhost>

On Tue, May 14, 2013 at 07:46:36PM +1000, Vadim Rozenfeld wrote:
> On Mon, 2013-05-13 at 16:30 -0700, Eric Northup wrote:
> > On Mon, May 13, 2013 at 4:45 AM, Vadim Rozenfeld <vrozenfe@redhat.com> wrote:
> > > Signed-off: Peter Lieven <pl@dlh.net>
> > > Signed-off: Gleb Natapov <gleb@redhat.com>
> > > Signed-off: Vadim Rozenfeld <vrozenfe@redhat.com>
> > >
> > > The following patch allows to activate Hyper-V
> > > reference time counter
> > > ---
> > >  arch/x86/include/asm/kvm_host.h    |  2 ++
> > >  arch/x86/include/uapi/asm/hyperv.h |  3 +++
> > >  arch/x86/kvm/x86.c                 | 25 ++++++++++++++++++++++++-
> > >  3 files changed, 29 insertions(+), 1 deletion(-)
> > >
> > > diff --git a/arch/x86/include/asm/kvm_host.h b/arch/x86/include/asm/kvm_host.h
> > > index 3741c65..f0fee35 100644
> > > --- a/arch/x86/include/asm/kvm_host.h
> > > +++ b/arch/x86/include/asm/kvm_host.h
> > > @@ -575,6 +575,8 @@ struct kvm_arch {
> > >         /* fields used by HYPER-V emulation */
> > >         u64 hv_guest_os_id;
> > >         u64 hv_hypercall;
> > > +       u64 hv_ref_count;
> > > +       u64 hv_tsc_page;
> > >
> > >         #ifdef CONFIG_KVM_MMU_AUDIT
> > >         int audit_point;
> > > diff --git a/arch/x86/include/uapi/asm/hyperv.h b/arch/x86/include/uapi/asm/hyperv.h
> > > index b80420b..9711819 100644
> > > --- a/arch/x86/include/uapi/asm/hyperv.h
> > > +++ b/arch/x86/include/uapi/asm/hyperv.h
> > > @@ -136,6 +136,9 @@
> > >  /* MSR used to read the per-partition time reference counter */
> > >  #define HV_X64_MSR_TIME_REF_COUNT              0x40000020
> > >
> > > +/* A partition's reference time stamp counter (TSC) page */
> > > +#define HV_X64_MSR_REFERENCE_TSC               0x40000021
> > > +
> > >  /* Define the virtual APIC registers */
> > >  #define HV_X64_MSR_EOI                         0x40000070
> > >  #define HV_X64_MSR_ICR                         0x40000071
> > > diff --git a/arch/x86/kvm/x86.c b/arch/x86/kvm/x86.c
> > > index 094b5d9..1a4036d 100644
> > > --- a/arch/x86/kvm/x86.c
> > > +++ b/arch/x86/kvm/x86.c
> > > @@ -843,7 +843,7 @@ EXPORT_SYMBOL_GPL(kvm_rdpmc);
> > >  static u32 msrs_to_save[] = {
> > >         MSR_KVM_SYSTEM_TIME, MSR_KVM_WALL_CLOCK,
> > >         MSR_KVM_SYSTEM_TIME_NEW, MSR_KVM_WALL_CLOCK_NEW,
> > > -       HV_X64_MSR_GUEST_OS_ID, HV_X64_MSR_HYPERCALL,
> > > +       HV_X64_MSR_GUEST_OS_ID, HV_X64_MSR_HYPERCALL,HV_X64_MSR_TIME_REF_COUNT,
> > >         HV_X64_MSR_APIC_ASSIST_PAGE, MSR_KVM_ASYNC_PF_EN, MSR_KVM_STEAL_TIME,
> > >         MSR_KVM_PV_EOI_EN,
> > >         MSR_IA32_SYSENTER_CS, MSR_IA32_SYSENTER_ESP, MSR_IA32_SYSENTER_EIP,
> > > @@ -1764,6 +1764,8 @@ static bool kvm_hv_msr_partition_wide(u32 msr)
> > >         switch (msr) {
> > >         case HV_X64_MSR_GUEST_OS_ID:
> > >         case HV_X64_MSR_HYPERCALL:
> > > +       case HV_X64_MSR_REFERENCE_TSC:
> > > +       case HV_X64_MSR_TIME_REF_COUNT:
> > >                 r = true;
> > >                 break;
> > >         }
> > > @@ -1803,6 +1805,21 @@ static int set_msr_hyperv_pw(struct kvm_vcpu *vcpu, u32 msr, u64 data)
> > >                 if (__copy_to_user((void __user *)addr, instructions, 4))
> > >                         return 1;
> > >                 kvm->arch.hv_hypercall = data;
> > > +               kvm->arch.hv_ref_count = get_kernel_ns();
> > > +               break;
> > > +       }
> > > +       case HV_X64_MSR_REFERENCE_TSC: {
> > > +               u64 gfn;
> > > +               unsigned long addr;
> > > +               u32 tsc_ref;
> > > +               gfn = data >> HV_X64_MSR_HYPERCALL_PAGE_ADDRESS_SHIFT;
> > > +               addr = gfn_to_hva(kvm, gfn);
> > > +               if (kvm_is_error_hva(addr))
> > > +                       return 1;
> > > +               tsc_ref = 0;
> > > +               if(__copy_to_user((void __user *)addr, &tsc_ref, sizeof(tsc_ref)))
> > 
> > Does this do the right thing when we're migrating?  How does usermode
> > learn that the guest page has been dirtied?
> > 
> 
> No, it shouldn't be a problem for this patch. Guest allocates a page
> from nonpaged physical memory, maps it to the system address space, gets
> physical address and sends it to KVM. KVM sets the first DWORD
> (TscSequence) to zero, which means that guest will use reference time
> counter as a timestamp source even after migration.
> 
Eric is right, we need mark_page_dirty() here and in HV_X64_MSR_HYPERCALL
too.  Without it QEMU will not know that content of the page has changed
and will not migrate it.

--
			Gleb.

  reply	other threads:[~2013-05-16  8:18 UTC|newest]

Thread overview: 40+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2013-05-13 11:45 [RFC PATCH 0/2] Hyper-V timers Vadim Rozenfeld
2013-05-13 11:45 ` [RFC PATCH 1/2] Hyper-H reference counter Vadim Rozenfeld
2013-05-13 23:30   ` Eric Northup
2013-05-14  9:46     ` Vadim Rozenfeld
2013-05-16  8:18       ` Gleb Natapov [this message]
2013-05-16  8:53         ` Vadim Rozenfeld
2013-05-14 14:14   ` Peter Lieven
2013-05-15 10:24     ` Vadim Rozenfeld
2013-05-16  8:10     ` Gleb Natapov
2013-05-16  8:34   ` Gleb Natapov
2013-05-16  9:13     ` Vadim Rozenfeld
2013-05-16  9:21       ` Gleb Natapov
2013-05-16  9:28         ` Vadim Rozenfeld
2013-05-16 13:37           ` Paolo Bonzini
2013-05-16 14:22             ` Vadim Rozenfeld
2013-05-16 14:48               ` Paolo Bonzini
2013-05-16 13:44           ` Paolo Bonzini
2013-05-16 14:26             ` Vadim Rozenfeld
2013-05-16 14:45               ` Paolo Bonzini
2013-05-19  6:37                 ` Vadim Rozenfeld
2013-05-20  8:05                   ` Paolo Bonzini
2013-05-20  8:36                     ` Gleb Natapov
2013-05-20  8:42                       ` Paolo Bonzini
2013-05-20  8:49                         ` Gleb Natapov
2013-05-20  8:56                           ` Paolo Bonzini
2013-05-20  9:13                             ` Gleb Natapov
2013-05-20  9:25                             ` Gleb Natapov
2013-05-20  9:32                               ` Paolo Bonzini
2013-05-20  9:41                                 ` Gleb Natapov
2013-05-20 10:06                                   ` Peter Lieven
2013-05-20 10:25                               ` Vadim Rozenfeld
2013-05-20 10:27                                 ` Gleb Natapov
2013-05-20 10:44                                   ` Vadim Rozenfeld
2013-05-20 10:21                             ` Vadim Rozenfeld
2013-05-20  9:12                     ` Vadim Rozenfeld
2013-05-16 14:40   ` Paolo Bonzini
2013-05-13 11:45 ` [RFC PATCH 2/2] Hyper-V iTSC handler Vadim Rozenfeld
2013-05-16  8:33   ` Gleb Natapov
2013-05-16  8:58     ` Vadim Rozenfeld
2013-05-16  8:02 ` [RFC PATCH 0/2] Hyper-V timers Gleb Natapov

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20130516081807.GK26453@redhat.com \
    --to=gleb@redhat.com \
    --cc=digitaleric@google.com \
    --cc=kvm@vger.kernel.org \
    --cc=mtosatti@redhat.com \
    --cc=pl@dlh.net \
    --cc=vrozenfe@redhat.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.