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

Re: [Xen-devel] [PATCH v4 12/12] xen/arm: initialize virt_timer and phys_timer with the same values on all vcpus



On Tue, 30 Apr 2013, Ian Campbell wrote:
> On Mon, 2013-04-29 at 17:14 +0100, Stefano Stabellini wrote:
> > On Mon, 29 Apr 2013, Ian Campbell wrote:
> > > On Fri, 2013-04-26 at 16:28 +0100, Stefano Stabellini wrote:
> > > > Introduce a domain wide vtimer initialization function to initialize
> > > > the phys_timer and the virt_timer offsets.
> > > > 
> > > > Use the domain phys_timer and virt_timer offsets throughout the vtimer
> > > > code instead of the per-vcpu offsets.
> > > > 
> > > > Remove the per-vcpu offsets from struct vtimer altogether.
> > > > 
> > > > Signed-off-by: Stefano Stabellini <stefano.stabellini@xxxxxxxxxxxxx>
> > > > 
> > > > Changes in v4:
> > > > - introduce vcpu_domain_init;
> > > > - inline phys_timer_base and virt_timer_base in arch_domain;
> > > > - use phys_timer_base.offset and virt_timer_base.offset directly in
> > > > vtimer code (remove offset field from struct vtimer).
> > > > ---
> > > >  xen/arch/arm/domain.c        |    3 +++
> > > >  xen/arch/arm/vtimer.c        |   26 +++++++++++++++++---------
> > > >  xen/arch/arm/vtimer.h        |    1 +
> > > >  xen/include/asm-arm/domain.h |   24 +++++++++++++++---------
> > > >  4 files changed, 36 insertions(+), 18 deletions(-)
> > > > 
> > > > diff --git a/xen/arch/arm/domain.c b/xen/arch/arm/domain.c
> > > > index f7ec979..f26222a 100644
> > > > --- a/xen/arch/arm/domain.c
> > > > +++ b/xen/arch/arm/domain.c
> > > > @@ -485,6 +485,9 @@ int arch_domain_create(struct domain *d, unsigned 
> > > > int domcr_flags)
> > > >      if ( (rc = domain_vgic_init(d)) != 0 )
> > > >          goto fail;
> > > >  
> > > > +    if ( (rc = vcpu_domain_init(d)) != 0 )
> > > > +        goto fail;
> > > > +
> > > >      /* Domain 0 gets a real UART not an emulated one */
> > > >      if ( d->domain_id && (rc = domain_uart0_init(d)) != 0 )
> > > >          goto fail;
> > > > diff --git a/xen/arch/arm/vtimer.c b/xen/arch/arm/vtimer.c
> > > > index 393aac3..782a255 100644
> > > > --- a/xen/arch/arm/vtimer.c
> > > > +++ b/xen/arch/arm/vtimer.c
> > > > @@ -44,21 +44,27 @@ static void virt_timer_expired(void *data)
> > > >      vgic_vcpu_inject_irq(t->v, 27, 1);
> > > >  }
> > > >  
> > > > +int vcpu_domain_init(struct domain *d)
> > > > +{
> > > > +    d->arch.phys_timer_base.offset = NOW();
> > > > +    d->arch.virt_timer_base.offset = READ_SYSREG64(CNTVCT_EL0) +
> > > > +                                     READ_SYSREG64(CNTVOFF_EL2);
> > > 
> > > I know you are just moving this code but I don't understand how this can
> > > make sense.
> > > 
> > > When initialising dom0 these are, AFAICT, uninitialised.
> > 
> > I don't think so: init_xen_time() is called before building dom0, so NOW()
> > should be returning proper values here.
> 
> I meant the reads of CNTVCT_EL0 and CNTVOFF_EL2, especially the second
> one which is reset to an unknown value and we don't set it.
> 
> > > When
> > > initialising domU these are whatever the current domain (so, dom0)
> > > happens to have here.
> > 
> > The offset is what we use to convert DomU time to Xen time and vice
> > versa.
> > Initializing phys_timer_base.offset to NOW() means that domU's physical
> > timer starts counting from NOW in terms of Xen time.
> > 
> > Initializing virt_timer_base.offset to CNTVCT_EL0 + CNTVOFF_EL2
> > accomplishes the same thing for vtimer:
> > 
> > offset = CNTVCT_EL0 + CNTVOFF_EL2
> >        = Phys Count - CNTVOFF_EL2 + CNTVOFF_EL2
> >        = Phys Count
> > 
> > > Also CNTVCT == Phys Count - Virt Offset, so adding Virt offset to it
> > > seems like an odd way to do it?
> > 
> > I think the reason for it is that in the old document it wasn't
> > explicitly stated that Phys Count is actually identical to CNTPCT.
> 
> So we could just read CNTPCT but don't because the docs at the time
> didn't suggest we could?

Right, I think so.


> By setting offset == phys-count we are making it so that virtual time
> for the domain appears to start from approx. 0, is that right?

Yes

> But then
> it ticks along at the same rate as phys time with no accounting for
> stolen or lost time etc? TBH I'm not even sure what stolen/lost time
> would be like for a clock which is supposed to be consistent across all
> VCPUs, or maybe that restriction is only for physical and hypervisor
> timers.

Right, no accounting. I don't know how the lost time accounting would
look like either.

_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxx
http://lists.xen.org/xen-devel


 


Rackspace

Lists.xenproject.org is hosted with RackSpace, monitoring our
servers 24x7x365 and backed by RackSpace's Fanatical Support®.