Hi Thomas, On Wed, 06 Dec 2023 21:44:02 +0100, Thomas Gleixner <tglx@xxxxxxxxxxxxx> wrote: > On Sat, Nov 11 2023 at 20:16, Jacob Pan wrote: > > static void fill_msi_msg(struct msi_msg *msg, u32 index, u32 subhandle) > > { > > memset(msg, 0, sizeof(*msg)); > > @@ -1361,7 +1397,7 @@ static int intel_irq_remapping_alloc(struct > > irq_domain *domain, > > irq_data->hwirq = (index << 16) + i; > > irq_data->chip_data = ird; > > - irq_data->chip = &intel_ir_chip; > > + irq_data->chip = posted_msi_supported() ? > > &intel_ir_chip_post_msi : &intel_ir_chip; > > This is just wrong because you change the chip to posted for _ALL_ > domains unconditionally. > > The only domains which want this chip are the PCI/MSI domains. And those > are distinct from the domains which serve IO/APIC, HPET, no? > > So you can set that chip only for PCI/MSI and just let IO/APIC, HPET > domains keep the original chip, which spares any modification of the > IO/APIC domain. > > make sense. - irq_data->chip = posted_msi_supported() ? &intel_ir_chip_post_msi : &intel_ir_chip; + if ((info->type == X86_IRQ_ALLOC_TYPE_PCI_MSI) && posted_msi_supported()) + irq_data->chip = &intel_ir_chip_post_msi; + else + irq_data->chip = &intel_ir_chip; Now in IRQ debugfs, I can see the correct IR chips for IOAPIC IRQs and MSIs. e.g domain: IO-APIC-8 hwirq: 0x9 chip: IR-IO-APIC flags: 0x410 IRQCHIP_SKIP_SET_WAKE parent: domain: INTEL-IR-9-13 hwirq: 0x80000 chip: INTEL-IR flags: 0x0 parent: domain: VECTOR domain: IR-PCI-MSI-0000:3d:00.4-11 hwirq: 0x0 chip: IR-PCI-MSI-0000:3d:00.4 flags: 0x430 IRQCHIP_SKIP_SET_WAKE IRQCHIP_ONESHOT_SAFE parent: domain: INTEL-IR-4-13 hwirq: 0x0 chip: INTEL-IR-POST flags: 0x0 parent: domain: VECTOR Thanks, Jacob