Message ID | 20190325182338.13609-1-bp@alien8.de (mailing list archive) |
---|---|
State | New, archived |
Delegated to: | Bjorn Helgaas |
Headers | show |
Series | PCI/LINK: Request a one-shot IRQ with NULL handler | expand |
Hi Borislav, Thanks for the update. We've settled on a different fix [1], since Lukas was not happy with IRQF_ONESHOT [2]. Alex [1] https://lore.kernel.org/linux-pci/20190323003700.7294-1-mr.nuke.me@gmail.com/ [2] https://lore.kernel.org/linux-pci/20190318043314.noyj6t4sh26spuzt@wunner.de/ On 3/25/19 1:23 PM, Borislav Petkov wrote: > From: Borislav Petkov <bp@suse.de> > > Booting v5.1-rc1 causes these new messages in dmesg here: > > genirq: Threaded irq requested with handler=NULL and !ONESHOT for irq 24 > pcie_bw_notification: probe of 0000:00:02.0:pcie010 failed with error -22 > > because requesting a threaded IRQ with NULL handler needs to be oneshot. > Otherwise a level-triggered interrupt endless loop can happen, see the > detailed explanation above the "Threaded irq... " error message in > kernel/irq/manage.c. > > And PCI-MSI type interrupts are one-shot safe but not in the IOAPIC > case: > > 24: ... IO-APIC 28-fasteoi PCIe BW notif, PCIe BW notif, PCIe BW notif > 25: ... IO-APIC 29-fasteoi PCIe BW notif, PCIe BW notif > > Make the BW notification handler oneshot too. > > Fixes: e8303bb7a75c ("PCI/LINK: Report degraded links via link bandwidth notification") > Suggested-by: Thomas Gleixner <tglx@linutronix.de> > Signed-off-by: Borislav Petkov <bp@suse.de> > Cc: Bjorn Helgaas <bhelgaas@google.com> > Cc: Lukas Wunner <lukas@wunner.de> > Cc: Alexandru Gagniuc <mr.nuke.me@gmail.com> > Cc: linux-pci@vger.kernel.org > --- > drivers/pci/pcie/bw_notification.c | 2 +- > 1 file changed, 1 insertion(+), 1 deletion(-) > > diff --git a/drivers/pci/pcie/bw_notification.c b/drivers/pci/pcie/bw_notification.c > index d2eae3b7cc0f..16e11c09f6bd 100644 > --- a/drivers/pci/pcie/bw_notification.c > +++ b/drivers/pci/pcie/bw_notification.c > @@ -81,7 +81,7 @@ static int pcie_bandwidth_notification_probe(struct pcie_device *srv) > return -ENODEV; > > ret = request_threaded_irq(srv->irq, NULL, pcie_bw_notification_handler, > - IRQF_SHARED, "PCIe BW notif", srv); > + IRQF_SHARED | IRQF_ONESHOT, "PCIe BW notif", srv); > if (ret) > return ret; > >
diff --git a/drivers/pci/pcie/bw_notification.c b/drivers/pci/pcie/bw_notification.c index d2eae3b7cc0f..16e11c09f6bd 100644 --- a/drivers/pci/pcie/bw_notification.c +++ b/drivers/pci/pcie/bw_notification.c @@ -81,7 +81,7 @@ static int pcie_bandwidth_notification_probe(struct pcie_device *srv) return -ENODEV; ret = request_threaded_irq(srv->irq, NULL, pcie_bw_notification_handler, - IRQF_SHARED, "PCIe BW notif", srv); + IRQF_SHARED | IRQF_ONESHOT, "PCIe BW notif", srv); if (ret) return ret;