> From: Thomas Gleixner <tglx@xxxxxxxxxxxxx> > Sent: Wednesday, November 23, 2022 9:42 PM > > On Wed, Nov 23 2022 at 08:16, Kevin Tian wrote: > >> From: Thomas Gleixner <tglx@xxxxxxxxxxxxx> > >> Sent: Monday, November 21, 2022 10:38 PM > >> + > >> + /* > >> + * Mask out the domain specific MSI feature flags which are not > >> + * supported by the real parent. > >> + */ > >> + info->flags &= pops->supported_flags; > >> + /* Enforce the required flags */ > >> + info->flags |= > >> X86_VECTOR_MSI_FLAGS_REQUIRED; > >> + > >> + /* This is always invoked from the top level MSI domain! */ > >> + info->ops->msi_prepare = x86_msi_prepare; > >> + > >> + info->chip->irq_ack = irq_chip_ack_parent; > >> + info->chip->irq_retrigger = irq_chip_retrigger_hierarchy; > >> + info->chip->flags |= IRQCHIP_SKIP_SET_WAKE | > >> + IRQCHIP_AFFINITY_PRE_STARTUP; > > > > Above are executed twice for both IR and vector after next patch comes. > > Could skip it for IR. > > How so? > > +static const struct msi_parent_ops dmar_msi_parent_ops = { > + .supported_flags = X86_VECTOR_MSI_FLAGS_SUPPORTED | > MSI_FLAG_MULTI_PCI_MSI, > + .prefix = "IR-", > + .init_dev_msi_info = msi_parent_init_dev_msi_info, > +}; > > IR delegates the init to its parent domain, i.e. the vector domain. So > there is no double invocation. > oops. How come I read msi_parent_init_dev_msi_info() as x86_init_dev_msi_info(). 😊