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

Re: [Xen-devel] [RFC PATCH] dpci: Put the dpci back on the list if running on another CPU.



>>> On 02.02.15 at 16:31, <konrad.wilk@xxxxxxxxxx> wrote:
> On Mon, Feb 02, 2015 at 03:19:33PM +0000, Jan Beulich wrote:
>> >>> On 02.02.15 at 15:29, <konrad.wilk@xxxxxxxxxx> wrote:
>> > --- a/xen/drivers/passthrough/io.c
>> > +++ b/xen/drivers/passthrough/io.c
>> > @@ -63,10 +63,37 @@ enum {
>> >  static void raise_softirq_for(struct hvm_pirq_dpci *pirq_dpci)
>> >  {
>> >      unsigned long flags;
>> > +    unsigned long old, new, val = pirq_dpci->state;
>> >  
>> > -    if ( test_and_set_bit(STATE_SCHED, &pirq_dpci->state) )
>> > -        return;
>> > +    /*
>> > +     * This cmpxch is a more clear version of:
>> > +     * if ( test_and_set_bit(STATE_SCHED, &pirq_dpci->state) )
>> > +     *         return;
>> > +     * since it also checks for STATE_RUN conditions.
>> > +     */
>> > +    for ( ;; )
>> > +    {
>> > +        new = 1 << STATE_SCHED;
>> > +        if ( val )
>> > +            new |= val;
>> 
>> Why the if()?
> 
> To 'or' the variable new with '1 << STATE_RUN' in case 'val' changed from
> the first read ('val = pirq_dpci->state') to the moment when
> we do the cmpxchg.

But if "val" is zero, the | simply will do nothing.

>> > +        old = cmpxchg(&pirq_dpci->state, val, new);
>> > +        switch ( old )
>> > +        {
>> > +        case (1 << STATE_SCHED):
>> > +        case (1 << STATE_RUN) | (1 << STATE_SCHED):
>> > +            /*
>> > +             * Whenever STATE_SCHED is set we MUST not schedule it.
>> > +             */
>> > +            return;
>> > +        }
>> > +        /*
>> > +         * If the 'state' is 0 or (1 << STATE_RUN) we can schedule it.
>> > +         */
>> 
>> Really? Wasn't the intention to _not_ schedule when STATE_RUN is
>> set? (Also the above is a only line comment, i.e. wants different style.)
> 
> I must confess I must have misread your last review. You said:
> 
>       > Here is a patch that does this. I don't yet have an setup to test
>       > the failing scenario (working on that). I removed the part in
>       > the softirq because with this patch I cannot see a way it would
>       > ever get there (in the softirq hitting the BUG).
> 
>       Hmm, but how do you now schedule the second instance that needed ...
> 
>       > +    case (1 << STATE_RUN):
> 
>       ... in this case?
> 
> which to me implied you still want to schedule an 'dpci' when STATE_RUN is 
> set?
> 
> My thinking is that we should still schedule an 'dpci' when STATE_RUN is set
> as that is inline with what the old tasklet code did. It would
> schedule the tasklet the moment said tasklet was off the global list (but
> it would not add it in the global list - that would be the job of the
> tasklet function wrapper to detect and insert said tasklet back on
> the global list).

Didn't the original discussion (and issue) revolve around scheduling
while STATE_RUN was set? Hence the intention to wait for the flag
to clear - but preferably in an explicit rather than implicit (as your
current and previous patch do) manner.

Jan


_______________________________________________
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®.