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

Re: [Xen-devel] [PATCH v6 13/18] Update IRTE according to guest interrupt config changes



>>> On 06.09.15 at 06:54, <feng.wu@xxxxxxxxx> wrote:
>> From: Jan Beulich [mailto:JBeulich@xxxxxxxx]
>> Sent: Friday, September 04, 2015 11:59 PM
>> >>> On 25.08.15 at 03:57, <feng.wu@xxxxxxxxx> wrote:
>> 
>> First of all - an empty Cc list on a patch is suspicious.
> 
> I did Cc you for this patch. Why do you say "an empty Cc list"?

Oops, sorry - this really belongs to patch 12.

>> > +static struct vcpu *pi_find_dest_vcpu(const struct domain *d, uint32_t
>> dest_id,
>> > +                                      bool_t dest_mode, uint8_t
>> delivery_mode,
>> > +                                      uint8_t gvec)
>> > +{
>> > +    unsigned int dest_vcpus = 0;
>> > +    struct vcpu *v, *dest = NULL;
>> > +
>> > +    if ( delivery_mode == dest_LowestPrio )
>> > +        return vector_hashing_dest(d, dest_id, dest_mode, gvec);
>> 
>> So at this point delivery_mode == dest_Fixed, right?
> 
> It won't be dest_LowestPrio here, so it might be proper to add
> else if (delivery_mode == dest_Fixed) for the code below. So the
> question is: Can deliver modes other than lowest priority and fixed,
> such as NMI, SMI, etc. hit here? Any ideas?

That's for you to validate. If it can't, add an ASSERT(). If it can, use
an if() as you suggest.

>> > +    for_each_vcpu ( d, v )
>> > +    {
>> > +        if ( !vlapic_match_dest(vcpu_vlapic(v), NULL,
>> APIC_DEST_NOSHORT,
>> > +                                dest_id, dest_mode) )
>> > +            continue;
>> > +
>> > +        dest_vcpus++;
>> > +        dest = v;
>> > +    }
>> > +
>> > +    /*
>> > +     * For fixed destination, we only handle single-destination
>> > +     * interrupts.
>> > +     */
>> > +    if ( dest_vcpus == 1 )
>> > +        return dest;
>> 
>> Is it thus even possible for the if() condition to be false? 
> 
> It can be false if the interrupts has multiple destination with Fixed
> deliver mode.
> 
>> If it isn't,
>> returning early from the loop would seem the better option. And
>> even if it is, I would question whether delivering the interrupt to
>> the first match isn't going to be better than dropping it.
> 
> Here, if we deliver all the interrupts to the first match, only this
> vCPU will receive all the interrupts, even though the irq affinity
> shows it has multiple destination. I don't think this is correct.
> Furthermore, is there any performance issues if the interrupt frequency
> is high and the matched vCPU cannot handle them in time? So here, I
> just leave these kind of interrupts to legacy interrupt remapping
> mechanism.

Oh, okay, if they're not getting lost, that's fine then.

>> >          dest_vcpu_id = hvm_girq_dest_2_vcpu_id(d, dest, dest_mode);
>> >          pirq_dpci->gmsi.dest_vcpu_id = dest_vcpu_id;
>> >          spin_unlock(&d->event_lock);
>> >          if ( dest_vcpu_id >= 0 )
>> >              hvm_migrate_pirqs(d->vcpu[dest_vcpu_id]);
>> > +
>> > +        /* Use interrupt posting if it is supported. */
>> > +        if ( iommu_intpost )
>> > +        {
>> > +            const struct vcpu *vcpu = pi_find_dest_vcpu(d, dest,
>> dest_mode,
>> > +                                          delivery_mode,
>> pirq_dpci->gmsi.gvec);
>> > +
>> > +            if ( vcpu )
>> > +            {
>> > +                rc = pi_update_irte( vcpu, info, pirq_dpci->gmsi.gvec );
>> > +                if ( unlikely(rc) )
>> > +                    dprintk(XENLOG_G_INFO,
>> > +                            "%pv: failed to update PI IRTE,
>> gvec:%02x\n",
>> > +                            vcpu, pirq_dpci->gmsi.gvec);
>> 
>> Even if only a debug build printk() - aren't you afraid that if this
>> ever triggers, it will trigger a lot? And hence be pretty useless?
> 
> I think it reaches this debug printk rarely, but a least, when it is really 
> failed, it
> can give people some hints about why we are using interrupt remapping 
> instead
> of interrupt posing for the external interrupts.

I understand your motivation, but you don't really answer my
question. (And btw., if you really mean "rarely", then there's a bug
somewhere that you need to fix. It should _never_ trigger if
everything is working correctly.)

>> > +            }
>> 
>> (Not only) depending on the answer, I'd consider adding an "else
>> printk()" here.
> 
> So do you mean something like this:
> 
>             if ( vcpu )
>             {
>                 rc = pi_update_irte( vcpu, info, pirq_dpci->gmsi.gvec );
>                 if ( unlikely(rc) )
>                     dprintk(XENLOG_G_INFO,
>                             "%pv: failed to update PI IRTE, gvec:%02x, use 
> interrupt remapping\n",
>                             vcpu, pirq_dpci->gmsi.gvec);
>                 else
>                     dprintk(XENLOG_G_INFO,
>                             "%pv: Succeed to update PI IRTE, gvec:%02x, use 
> interrupt posting\n",
>                             vcpu, pirq_dpci->gmsi.gvec);
>             }

No. I intentionally placed my question _after_ the closing brace, i.e.
I suggested an "else" to the outer "if".

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