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

Re: [Xen-devel] [PATCH v9 10/11] viridian: add implementation of synthetic timers



> -----Original Message-----
> From: Xen-devel [mailto:xen-devel-bounces@xxxxxxxxxxxxxxxxxxxx] On Behalf Of 
> Paul Durrant
> Sent: 19 March 2019 12:47
> To: 'Jan Beulich' <JBeulich@xxxxxxxx>
> Cc: Stefano Stabellini <sstabellini@xxxxxxxxxx>; Wei Liu 
> <wei.liu2@xxxxxxxxxx>; Konrad Rzeszutek Wilk
> <konrad.wilk@xxxxxxxxxx>; Andrew Cooper <Andrew.Cooper3@xxxxxxxxxx>; Tim 
> (Xen.org) <tim@xxxxxxx>;
> George Dunlap <George.Dunlap@xxxxxxxxxx>; Julien Grall 
> <julien.grall@xxxxxxx>; xen-devel <xen-
> devel@xxxxxxxxxxxxxxxxxxxx>; Ian Jackson <Ian.Jackson@xxxxxxxxxx>; Roger Pau 
> Monne
> <roger.pau@xxxxxxxxxx>
> Subject: Re: [Xen-devel] [PATCH v9 10/11] viridian: add implementation of 
> synthetic timers
> 
> > -----Original Message-----
> > From: Jan Beulich [mailto:JBeulich@xxxxxxxx]
> > Sent: 19 March 2019 12:18
> > To: Paul Durrant <Paul.Durrant@xxxxxxxxxx>
> > Cc: Julien Grall <julien.grall@xxxxxxx>; Andrew Cooper 
> > <Andrew.Cooper3@xxxxxxxxxx>; Roger Pau Monne
> > <roger.pau@xxxxxxxxxx>; Wei Liu <wei.liu2@xxxxxxxxxx>; George Dunlap 
> > <George.Dunlap@xxxxxxxxxx>; Ian
> > Jackson <Ian.Jackson@xxxxxxxxxx>; Stefano Stabellini 
> > <sstabellini@xxxxxxxxxx>; xen-devel <xen-
> > devel@xxxxxxxxxxxxxxxxxxxx>; Konrad Rzeszutek Wilk 
> > <konrad.wilk@xxxxxxxxxx>; Tim (Xen.org)
> > <tim@xxxxxxx>
> > Subject: Re: [PATCH v9 10/11] viridian: add implementation of synthetic 
> > timers
> >
> > >>> On 19.03.19 at 10:21, <paul.durrant@xxxxxxxxxx> wrote:
> > > +static void poll_stimer(struct vcpu *v, unsigned int stimerx)
> > > +{
> > > +    struct viridian_vcpu *vv = v->arch.hvm.viridian;
> > > +    struct viridian_stimer *vs = &vv->stimer[stimerx];
> > > +
> > > +    /*
> > > +     * Timer expiry may race with the timer being disabled. If the timer
> > > +     * is disabled make sure the pending bit is cleared to avoid re-
> > > +     * polling.
> > > +     */
> > > +    if ( !vs->config.enabled )
> > > +    {
> > > +        clear_bit(stimerx, &vv->stimer_pending);
> > > +        return;
> > > +    }
> >
> > It feels a little odd to squash an already pending event like this,
> > but I think I see why you want/need it this way. Of course the
> > question is whether an MSR write (turning the enabled bit off)
> > after the timer has expired should cancel the sending of a
> > notification message. I could imagine this not even being spelled
> > out anywhere in the spec...
> 
> No, it's not but it seems like the right thing to do.
> 
> >
> > > +    if ( !test_bit(stimerx, &vv->stimer_pending) )
> > > +        return;
> > > +
> > > +    if ( !viridian_synic_deliver_timer_msg(v, vs->config.sintx,
> > > +                                           stimerx, vs->expiration,
> > > +                                           time_now(v->domain)) )
> > > +        return;
> > > +
> > > +    clear_bit(stimerx, &vv->stimer_pending);
> > > +
> > > +    if ( vs->config.periodic )
> > > +        start_stimer(vs);
> > > +    else
> > > +        vs->config.enabled = 0;
> >
> > In v8 you started the timer here when config.enabled is true. Was
> > that with the implicit assumption that the bit would still have been
> > off from stimer_expire() for non-periodic timers? If so, the above
> > would indeed be a sufficiently close equivalent, while if not I would
> > be a little confused by this construct.
> 
> This should be a reversion to the v7 construct. The expiration function no 
> longer updates the config
> so the poll clears the enable bit for single-shot timers instead whereas 
> periodic times stay enabled
> (until an MSR write disables them) and get re-scheduled.
> 
> >
> > Is clearing the enabled bit appropriate here? stimer_expire() and
> > this function are asynchronous with one another, i.e. there's a
> > window where the guest may write the MSR again (with the enabled
> > bit set) after stimer_expire() has run but before we make it here.
> > I think the overall outcome is fine, but wouldn't start_stimer() better
> > clear the enabled bit right away after having called stimer_expire()?
> > Or wait - doing so would conflict with the enabled bit check at the
> > top of this function. Otoh an MSR read immediately following such
> > an MSR write should observe the enabled bit clear for a non-periodic
> > timer that was set in the past, shouldn't it?
> 
> I'm not sure about that because it's not clear when the timer expires as 
> such. The spec is not clear
> whether timer expiry means the point when it times out or when the message is 
> delivered.
> 
> > So perhaps a set
> > pending bit should result in the RDMSR handling to clear the enabled
> > bit in the returned value for a non-periodic timer?
> 
> I get tied in knots every time I think about this and without waiting for a 
> pending timer to stop when
> it is disabled I see no way of the race, but I think doing that would be 
> prohibitively slow because

                                ^ avoiding

> windows seems to flip between single-shot and periodic timers on quite a 
> frequent basis. At this point
> I'd prefer to leave the code as-is and run some tests. We've already had a 
> prior incarnation running
> in XenServer automated tests for several weeks with no discovered problems.
> 
>   Paul
> 
> >
> > Jan
> >
> 
> 
> _______________________________________________
> Xen-devel mailing list
> Xen-devel@xxxxxxxxxxxxxxxxxxxx
> https://lists.xenproject.org/mailman/listinfo/xen-devel
_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxxxxxxxxx
https://lists.xenproject.org/mailman/listinfo/xen-devel

 


Rackspace

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