On 9/8/2026 1:24 AM, Michael Kelley wrote:
From: Naman Jain <[email protected]> Sent: Sunday, September 6, 2026 
11:51 PM

With fixup_irqs() and the generic resend path (try_retrigger()) now both
falling back to irq_chip_retrigger_hierarchy(), installing it as the
irq_retrigger() callback on the outermost domain chips is no longer
required. The hierarchy walk reaches the x86 vector domain's
apic_retrigger_irq() for all of these stacked domain chips.

Remove the now redundant irq_retrigger() initializations from the outermost
domain interrupt chips, including the Hyper-V root partition PCI/MSI chip.
msi_set_affinity() is the only site that invoked the outermost chip's
irq_retrigger() directly. Convert it to irq_chip_retrigger_hierarchy() so
the x86_init_dev_msi_info() initialization can be dropped as well.

No functional change intended.

Suggested-by: Thomas Gleixner <[email protected]>
Reviewed-by: Shradha Gupta <[email protected]>
Signed-off-by: Naman Jain <[email protected]>
---
  arch/x86/hyperv/irqdomain.c         | 1 -
  arch/x86/kernel/apic/io_apic.c      | 2 --
  arch/x86/kernel/apic/msi.c          | 4 +---
  arch/x86/kernel/hpet.c              | 1 -
  drivers/iommu/amd/init.c            | 1 -
  drivers/pci/controller/pci-hyperv.c | 1 -
  6 files changed, 1 insertion(+), 9 deletions(-)


[snip]

diff --git a/arch/x86/kernel/apic/msi.c b/arch/x86/kernel/apic/msi.c
index 66bc5d3e79db3..aad2f15eb2176 100644
--- a/arch/x86/kernel/apic/msi.c
+++ b/arch/x86/kernel/apic/msi.c
@@ -137,7 +137,7 @@ msi_set_affinity(struct irq_data *irqd, const struct 
cpumask *mask, bool force)
         * IRR.
         */
        if (lapic_vector_set_in_irr(cfg->vector))
-               irq_data_get_irq_chip(irqd)->irq_retrigger(irqd);
+               irq_chip_retrigger_hierarchy(irqd);

In v2 of this patch series, I commented about whether this code
should also check for irq_retrigger() being set in the outermost
domain before calling irq_chip_retrigger_hierarchy(). fixup_irqs()
in Patch 2 of this series has that check, and I think it should be
here as well. While there are no domains in the x86 world today
that have a custom irq_retrigger function, I'll argue the check
should be done so the infrastructure is correct if such a domain
were added in the future.

Michael


The reason I skipped changing this is because I realized that unlike
fixup_irqs(), this path is not generic, i.e. the chip you get here is
the same one as the one initialized in x86_init_dev_msi_info() below. So
someone adding a custom irq_retrigger function could simply change it in
above call site.
However, on looking at this again, I see if someone adds this custom
function again, it would be taken care of in fixup_irqs() but
msi_set_affinity() could silently be missed. I'll add the fallback soon
in next version.

Regards,
Naman


        return ret;
  }
@@ -246,7 +246,6 @@ static bool x86_init_dev_msi_info(struct device *dev, 
struct irq_domain *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;

@@ -313,7 +312,6 @@ static struct irq_chip dmar_msi_controller = {
        .irq_mask               = dmar_msi_mask,
        .irq_ack                = irq_chip_ack_parent,
        .irq_set_affinity       = msi_domain_set_affinity,
-       .irq_retrigger          = irq_chip_retrigger_hierarchy,
        .irq_compose_msi_msg    = dmar_msi_compose_msg,
        .irq_write_msi_msg      = dmar_msi_write_msg,
        .flags                  = IRQCHIP_SKIP_SET_WAKE |  
IRQCHIP_MOVE_DEFERRED |
diff --git a/arch/x86/kernel/hpet.c b/arch/x86/kernel/hpet.c
index 8dc7b710e1250..2bb7a6f466af3 100644
--- a/arch/x86/kernel/hpet.c
+++ b/arch/x86/kernel/hpet.c
@@ -509,7 +509,6 @@ static struct irq_chip hpet_msi_controller __ro_after_init 
= {
        .irq_mask = hpet_msi_mask,
        .irq_ack = irq_chip_ack_parent,
        .irq_set_affinity = msi_domain_set_affinity,
-       .irq_retrigger = irq_chip_retrigger_hierarchy,
        .irq_write_msi_msg = hpet_msi_write_msg,
        .flags = IRQCHIP_SKIP_SET_WAKE | IRQCHIP_AFFINITY_PRE_STARTUP,
  };
diff --git a/drivers/iommu/amd/init.c b/drivers/iommu/amd/init.c
index 40726dfef2733..a19e1faf98750 100644
--- a/drivers/iommu/amd/init.c
+++ b/drivers/iommu/amd/init.c
@@ -2471,7 +2471,6 @@ static struct irq_chip intcapxt_controller = {
        .irq_unmask             = intcapxt_unmask_irq,
        .irq_mask               = intcapxt_mask_irq,
        .irq_ack                = irq_chip_ack_parent,
-       .irq_retrigger          = irq_chip_retrigger_hierarchy,
        .irq_set_affinity       = intcapxt_set_affinity,
        .irq_set_wake           = intcapxt_set_wake,
        .flags                  = IRQCHIP_MASK_ON_SUSPEND |
IRQCHIP_MOVE_DEFERRED,
diff --git a/drivers/pci/controller/pci-hyperv.c 
b/drivers/pci/controller/pci-hyperv.c
index 89816a2bd7cd3..cfc8fa403dad6 100644
--- a/drivers/pci/controller/pci-hyperv.c
+++ b/drivers/pci/controller/pci-hyperv.c
@@ -2119,7 +2119,6 @@ static bool hv_pcie_init_dev_msi_info(struct device *dev,
struct irq_domain *dom
        info->ops->msi_prepare = hv_msi_prepare;

        chip->irq_set_affinity = irq_chip_set_affinity_parent;
-       chip->irq_retrigger = irq_chip_retrigger_hierarchy;

        if (IS_ENABLED(CONFIG_X86))
                chip->flags |= IRQCHIP_MOVE_DEFERRED;
--
2.43.0




Reply via email to