Skip to content

Commit 5bfcdcc

Browse files
Sebastian Andrzej SiewiorThomas Gleixner
authored andcommitted
iommu/amd: Use core's primary handler and set IRQF_ONESHOT
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: 72fe00f ("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
1 parent f6bc712 commit 5bfcdcc

3 files changed

Lines changed: 4 additions & 14 deletions

File tree

drivers/iommu/amd/amd_iommu.h

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,6 @@ irqreturn_t amd_iommu_int_thread(int irq, void *data);
1515
irqreturn_t amd_iommu_int_thread_evtlog(int irq, void *data);
1616
irqreturn_t amd_iommu_int_thread_pprlog(int irq, void *data);
1717
irqreturn_t amd_iommu_int_thread_galog(int irq, void *data);
18-
irqreturn_t amd_iommu_int_handler(int irq, void *data);
1918
void amd_iommu_restart_log(struct amd_iommu *iommu, const char *evt_type,
2019
u8 cntrl_intr, u8 cntrl_log,
2120
u32 status_run_mask, u32 status_overflow_mask);

drivers/iommu/amd/init.c

Lines changed: 4 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -2356,12 +2356,8 @@ static int iommu_setup_msi(struct amd_iommu *iommu)
23562356
if (r)
23572357
return r;
23582358

2359-
r = request_threaded_irq(iommu->dev->irq,
2360-
amd_iommu_int_handler,
2361-
amd_iommu_int_thread,
2362-
0, "AMD-Vi",
2363-
iommu);
2364-
2359+
r = request_threaded_irq(iommu->dev->irq, NULL, amd_iommu_int_thread,
2360+
IRQF_ONESHOT, "AMD-Vi", iommu);
23652361
if (r) {
23662362
pci_disable_msi(iommu->dev);
23672363
return r;
@@ -2535,8 +2531,8 @@ static int __iommu_setup_intcapxt(struct amd_iommu *iommu, const char *devname,
25352531
return irq;
25362532
}
25372533

2538-
ret = request_threaded_irq(irq, amd_iommu_int_handler,
2539-
thread_fn, 0, devname, iommu);
2534+
ret = request_threaded_irq(irq, NULL, thread_fn, IRQF_ONESHOT, devname,
2535+
iommu);
25402536
if (ret) {
25412537
irq_domain_free_irqs(irq, 1);
25422538
irq_domain_remove(domain);

drivers/iommu/amd/iommu.c

Lines changed: 0 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1151,11 +1151,6 @@ irqreturn_t amd_iommu_int_thread(int irq, void *data)
11511151
return IRQ_HANDLED;
11521152
}
11531153

1154-
irqreturn_t amd_iommu_int_handler(int irq, void *data)
1155-
{
1156-
return IRQ_WAKE_THREAD;
1157-
}
1158-
11591154
/****************************************************************************
11601155
*
11611156
* IOMMU command queuing functions

0 commit comments

Comments
 (0)