[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 20:22, Jan Beulich wrote: > On 29.05.2024 13:13, Chen, Jiqian wrote: >> 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: >>>>>> 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? > > This looks plausible, yes. I dump all mpc_config_intsrc of array mp_irqs, it shows: (XEN) find_irq_entry type 3 irqtype 0 irqflag 0 srcbus 0 srcbusirq 0 dstapic 33 dstirq 2 (XEN) find_irq_entry type 3 irqtype 0 irqflag 15 srcbus 0 srcbusirq 9 dstapic 33 dstirq 9 (XEN) find_irq_entry type 3 irqtype 0 irqflag 0 srcbus 0 srcbusirq 1 dstapic 33 dstirq 1 (XEN) find_irq_entry type 3 irqtype 0 irqflag 0 srcbus 0 srcbusirq 3 dstapic 33 dstirq 3 (XEN) find_irq_entry type 3 irqtype 0 irqflag 0 srcbus 0 srcbusirq 4 dstapic 33 dstirq 4 (XEN) find_irq_entry type 3 irqtype 0 irqflag 0 srcbus 0 srcbusirq 5 dstapic 33 dstirq 5 (XEN) find_irq_entry type 3 irqtype 0 irqflag 0 srcbus 0 srcbusirq 6 dstapic 33 dstirq 6 (XEN) find_irq_entry type 3 irqtype 0 irqflag 0 srcbus 0 srcbusirq 7 dstapic 33 dstirq 7 (XEN) find_irq_entry type 3 irqtype 0 irqflag 0 srcbus 0 srcbusirq 8 dstapic 33 dstirq 8 (XEN) find_irq_entry type 3 irqtype 0 irqflag 0 srcbus 0 srcbusirq 10 dstapic 33 dstirq 10 (XEN) find_irq_entry type 3 irqtype 0 irqflag 0 srcbus 0 srcbusirq 11 dstapic 33 dstirq 11 (XEN) find_irq_entry type 3 irqtype 0 irqflag 0 srcbus 0 srcbusirq 12 dstapic 33 dstirq 12 (XEN) find_irq_entry type 3 irqtype 0 irqflag 0 srcbus 0 srcbusirq 13 dstapic 33 dstirq 13 (XEN) find_irq_entry type 3 irqtype 0 irqflag 0 srcbus 0 srcbusirq 14 dstapic 33 dstirq 14 (XEN) find_irq_entry type 3 irqtype 0 irqflag 0 srcbus 0 srcbusirq 15 dstapic 33 dstirq 15 It seems only Legacy irq and gsi[0:15] has a mapping in mp_irqs. Other gsi can be considered 1:1 mapping with irq? Or are there other places reflect the mapping between irq and gsi? And my code will be: case XEN_DOMCTL_gsi_permission: { unsigned int gsi = domctl->u.gsi_permission.gsi; int irq; bool allow = domctl->u.gsi_permission.allow_access; /* * gsi[0,15] is not 1:1 mapping to legacy irq[0,15], it need a * transformation. Other gsi is considered be 1:1 mapping to irq */ if ( gsi < 16 ) irq = gsi_2_irq(gsi); else irq = gsi; /* * If current domain is PV or it has PIRQ flag, it has a mapping * of gsi, pirq and irq, so it should use XEN_DOMCTL_irq_permission * to grant irq permission. */ if ( is_pv_domain(current->domain) || has_pirq(current->domain) ) { ret = -EOPNOTSUPP; break; } if ( gsi >= nr_irqs_gsi || irq < 0 ) { ret = -EINVAL; break; } if ( !irq_access_permitted(current->domain, irq) || xsm_irq_permission(XSM_HOOK, d, irq, allow) ) { ret = -EPERM; break; } if ( allow ) ret = irq_permit_access(d, irq); else ret = irq_deny_access(d, irq); break; } Is above acceptable? > > Jan -- Best regards, Jiqian Chen.
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |