]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
iommu/amd: Use core's primary handler and set IRQF_ONESHOT
authorSebastian Andrzej Siewior <bigeasy@linutronix.de>
Wed, 28 Jan 2026 09:55:23 +0000 (10:55 +0100)
committerThomas Gleixner <tglx@kernel.org>
Sun, 1 Feb 2026 16:37:13 +0000 (17:37 +0100)
request_threaded_irq() is invoked with a primary and a secondary handler
and no flags are passed. The primary handler is the same as
irq_default_primary_handler() so there is no need to have an identical
copy.

The lack of the IRQF_ONESHOT can be dangerous because the interrupt
source is not masked while the threaded handler is active. This means,
especially on LEVEL typed interrupt lines, the interrupt can fire again
before the threaded handler had a chance to run.

Use the default primary interrupt handler by specifying NULL and set
IRQF_ONESHOT so the interrupt source is masked until the secondary
handler is done.

Fixes: 72fe00f01f9a3 ("x86/amd-iommu: Use threaded interupt handler")
Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
Signed-off-by: Thomas Gleixner <tglx@kernel.org>
Link: https://patch.msgid.link/20260128095540.863589-4-bigeasy@linutronix.de
drivers/iommu/amd/amd_iommu.h
drivers/iommu/amd/init.c
drivers/iommu/amd/iommu.c

index b742ef1adb352bce7fbb611040ff7a9b038a141a..df1c238dc888551d08a16d1d2345243d4993a404 100644 (file)
@@ -15,7 +15,6 @@ irqreturn_t amd_iommu_int_thread(int irq, void *data);
 irqreturn_t amd_iommu_int_thread_evtlog(int irq, void *data);
 irqreturn_t amd_iommu_int_thread_pprlog(int irq, void *data);
 irqreturn_t amd_iommu_int_thread_galog(int irq, void *data);
-irqreturn_t amd_iommu_int_handler(int irq, void *data);
 void amd_iommu_restart_log(struct amd_iommu *iommu, const char *evt_type,
                           u8 cntrl_intr, u8 cntrl_log,
                           u32 status_run_mask, u32 status_overflow_mask);
index 384c90b4f90a0a267177925da95225712f941219..62a7a718acf8fbea6f4a3455fca3fc6adc89a32a 100644 (file)
@@ -2356,12 +2356,8 @@ static int iommu_setup_msi(struct amd_iommu *iommu)
        if (r)
                return r;
 
-       r = request_threaded_irq(iommu->dev->irq,
-                                amd_iommu_int_handler,
-                                amd_iommu_int_thread,
-                                0, "AMD-Vi",
-                                iommu);
-
+       r = request_threaded_irq(iommu->dev->irq, NULL, amd_iommu_int_thread,
+                                IRQF_ONESHOT, "AMD-Vi", iommu);
        if (r) {
                pci_disable_msi(iommu->dev);
                return r;
@@ -2535,8 +2531,8 @@ static int __iommu_setup_intcapxt(struct amd_iommu *iommu, const char *devname,
                return irq;
        }
 
-       ret = request_threaded_irq(irq, amd_iommu_int_handler,
-                                  thread_fn, 0, devname, iommu);
+       ret = request_threaded_irq(irq, NULL, thread_fn, IRQF_ONESHOT, devname,
+                                  iommu);
        if (ret) {
                irq_domain_free_irqs(irq, 1);
                irq_domain_remove(domain);
index 5d45795c367a6be0acf32213556c2bd900d175b8..bd577852618b7549edb356ca44f314bf32fce2b0 100644 (file)
@@ -1151,11 +1151,6 @@ irqreturn_t amd_iommu_int_thread(int irq, void *data)
        return IRQ_HANDLED;
 }
 
-irqreturn_t amd_iommu_int_handler(int irq, void *data)
-{
-       return IRQ_WAKE_THREAD;
-}
-
 /****************************************************************************
  *
  * IOMMU command queuing functions