|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [Xen-devel] [PATCH v3 13/13] xen/arm: initialize virt_timer and phys_timer with the same values on all vcpus
On Thu, 25 Apr 2013, Ian Campbell wrote:
> On Wed, 2013-04-24 at 20:07 +0100, Stefano Stabellini wrote:
> > Signed-off-by: Stefano Stabellini <stefano.stabellini@xxxxxxxxxxxxx>
> > ---
> > xen/arch/arm/vtimer.c | 18 ++++++++++++++----
> > xen/include/asm-arm/domain.h | 26 +++++++++++++++++---------
> > 2 files changed, 31 insertions(+), 13 deletions(-)
> >
> > diff --git a/xen/arch/arm/vtimer.c b/xen/arch/arm/vtimer.c
> > index 2444851..49858e7 100644
> > --- a/xen/arch/arm/vtimer.c
> > +++ b/xen/arch/arm/vtimer.c
> > @@ -46,20 +46,30 @@ static void virt_timer_expired(void *data)
> >
> > int vcpu_vtimer_init(struct vcpu *v)
> > {
> > + struct vtimer_base *b = &v->domain->arch.phys_timer_base;
> > struct vtimer *t = &v->arch.phys_timer;
> >
> > + if ( !b->offset )
> > + b->offset = NOW();
> > + if ( !b->cval )
> > + b->cval = NOW();
>
> Initialisation of domain global state should be done in
> domain_vtimer_init (which you may need to add) IMHO.
Right, that would be nicer
> > init_timer(&t->timer, phys_timer_expired, t, v->processor);
> > t->ctl = 0;
> > - t->offset = NOW();
> > - t->cval = NOW();
> > + t->offset = b->offset;
> >
> > + t->cval = b->cval;
> > t->irq = 30;
> > t->v = v;
> >
> > + b = &v->domain->arch.virt_timer_base;
> > + if ( !b->offset )
> > + b->offset = READ_SYSREG64(CNTVCT_EL0) + READ_SYSREG64(CNTVOFF_EL2);
> > + if ( !b->cval )
> > + b->cval = 0;
> > t = &v->arch.virt_timer;
> > init_timer(&t->timer, virt_timer_expired, t, v->processor);
> > t->ctl = 0;
> > - t->offset = READ_SYSREG64(CNTVCT_EL0) + READ_SYSREG64(CNTVOFF_EL2);
> > - t->cval = 0;
> > + t->offset = b->offset;
> > + t->cval = b->cval;
>
> Are you sure this is as simple as this?
>
> At the very least I'm surprised that we don't need to consult b->offset
> anywhere other than at init time, if vcpus are supposed to see a uniform
> view of time.
>
> Or is it the case that what actually needs to happen is that t->offset
> goes away and b->offset is used everywhere?
That would be another (probably better) way of doing it: the only important
thing is that the start time on both vcpus is the same.
>
> > t->irq = 27;
> > t->v = v;
> >
> > diff --git a/xen/include/asm-arm/domain.h b/xen/include/asm-arm/domain.h
> > index 3fa266c2..d001802 100644
> > --- a/xen/include/asm-arm/domain.h
> > +++ b/xen/include/asm-arm/domain.h
> > @@ -47,6 +47,20 @@ enum domain_type {
> > #define is_pv64_domain(d) (0)
> > #endif
> >
> > +struct vtimer {
> > + struct vcpu *v;
> > + int irq;
> > + struct timer timer;
> > + uint32_t ctl;
> > + uint64_t offset;
> > + uint64_t cval;
> > +};
> > +
> > +struct vtimer_base {
> > + uint64_t offset;
> > + uint64_t cval;
> > +};
>
> It would be consistent with what is there to inline this into
> arch_domain.
OK
_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxx
http://lists.xen.org/xen-devel
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |