[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [RFC XEN PATCH v8 5/5] domctl: Add XEN_DOMCTL_gsi_permission to grant gsi
On 2024/5/29 15:10, Jan Beulich wrote: > On 29.05.2024 08:56, Chen, Jiqian wrote: >> On 2024/5/29 14:31, Jan Beulich wrote: >>> On 29.05.2024 04:41, Chen, Jiqian wrote: >>>> Hi, >>>> On 2024/5/17 19:50, Jan Beulich wrote: >>>>> On 17.05.2024 13:14, Chen, Jiqian wrote: >>>>>> On 2024/5/17 18:51, Jan Beulich wrote: >>>>>>> On 17.05.2024 12:45, Chen, Jiqian wrote: >>>>>>>> On 2024/5/16 22:01, Jan Beulich wrote: >>>>>>>>> On 16.05.2024 11:52, Jiqian Chen wrote: >>>>>>>>>> + if ( gsi >= nr_irqs_gsi ) >>>>>>>>>> + { >>>>>>>>>> + ret = -EINVAL; >>>>>>>>>> + break; >>>>>>>>>> + } >>>>>>>>>> + >>>>>>>>>> + if ( !irq_access_permitted(current->domain, gsi) || >>>>>>>>> >>>>>>>>> I.e. assuming IRQ == GSI? Is that a valid assumption when any number >>>>>>>>> of >>>>>>>>> source overrides may be surfaced by ACPI? >>>>>>>> All irqs smaller than nr_irqs_gsi are gsi, aren't they? >>>>>>> >>>>>>> They are, but there's not necessarily a 1:1 mapping. >>>>>> Oh, so do I need to add a new gsi_caps to store granted gsi? >>>>> >>>>> Probably not. You ought to be able to translate between GSI and IRQ, >>>>> and then continue to record in / check against IRQ permissions. >>>> But I found in function init_irq_data: >>>> for ( irq = 0; irq < nr_irqs_gsi; irq++ ) >>>> { >>>> int rc; >>>> >>>> desc = irq_to_desc(irq); >>>> desc->irq = irq; >>>> >>>> rc = init_one_irq_desc(desc); >>>> if ( rc ) >>>> return rc; >>>> } >>>> Does it mean that when irq < nr_irqs_gsi, the gsi and irq is a 1:1 mapping? >>> >>> No, as explained before. I also don't see how you would derive that from >>> the code above. >> Because here set desc->irq = irq, and it seems there is no other place to >> change this desc->irq, so, gsi 1 is considered to irq 1. > > What are you taking this from? The loop bound isn't nr_gsis, and the iteration > variable isn't in GSI space either; it's in IRQ numbering space. In this loop > we're merely leveraging that every GSI has a corresponding IRQ; > there are no assumptions made about the mapping between the two. Afaics at > least. > >>> "nr_irqs_gsi" describes what its name says: The number of >>> IRQs mapping to a (_some_) GSI. That's to tell them from the non-GSI (i.e. >>> mainly MSI) ones. There's no implication whatsoever on the IRQ <-> GSI >>> mapping. >>> >>>> What's more, when using PHYSDEVOP_setup_gsi, it calls mp_register_gsi, >>>> and in mp_register_gsi, it uses " desc = irq_to_desc(gsi); " to get >>>> irq_desc directly. >>> >>> Which may be wrong, while that wrong-ness may not have hit anyone in >>> practice (for reasons that would need working out). >>> >>>> Combining above, can we consider "gsi == irq" when irq < nr_irqs_gsi ? >>> >>> Again - no. >> Since you are certain that they are not equal, could you tell me where show >> they are not equal or where build their mappings, >> so that I can know how to do a conversion gsi from irq. > > I did point you at the ACPI Interrupt Source Override structure before. > We're parsing those in acpi_parse_int_src_ovr(), to give you a place to > start going from. Oh! I think I know. If I want to transform gsi to irq, I need to do below: int irq, entry, ioapic, pin; ioapic = mp_find_ioapic(gsi); pin = gsi - mp_ioapic_routing[ioapic].gsi_base; entry = find_irq_entry(ioapic, pin, mp_INT); irq = pin_2_irq(entry, ioapic, pin); Am I right? > > Jan -- Best regards, Jiqian Chen.
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |