Patch "PCI: host: Mark PCIe/PCI (MSI) IRQ cascade handlers as IRQF_NO_THREAD" has been added to the 4.3-stable tree
Subsystems (7)
This is a note to let you know that I've just added the patch titled
PCI: host: Mark PCIe/PCI (MSI) IRQ cascade handlers as IRQF_NO_THREAD
to the 4.3-stable tree which can be found at:
http://www.kernel.org/git/?p=linux/kernel/git/stable/stable-queue.git;a=summary
The filename of the patch is:
pci-host-mark-pcie-pci-msi-irq-cascade-handlers-as-irqf_no_thread.patch
and it can be found in the queue-4.3 subdirectory.
If you, or anyone else, feels it should not be added to the stable tree, please let <[email protected]> know about it.
Quoted 1 line
From
8ff0ef996ca00028519c70e8d51d32bd37eb51dcMon Sep 17 00:00:00 2001
From: Grygorii Strashko <[email protected]>
Date: Thu, 10 Dec 2015 21:18:20 +0200
Subject: PCI: host: Mark PCIe/PCI (MSI) IRQ cascade handlers as IRQF_NO_THREAD
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
From: Grygorii Strashko <[email protected]>
commit 8ff0ef996ca00028519c70e8d51d32bd37eb51dc upstream.
On -RT and if kernel is booting with "threadirqs" cmd line parameter, PCIe/PCI (MSI) IRQ cascade handlers (like dra7xx_pcie_msi_irq_handler()) will be forced threaded and, as result, will generate warnings like this:
WARNING: CPU: 1 PID: 82 at kernel/irq/handle.c:150 handle_irq_event_percpu+0x14c/0x174() irq 460 handler irq_default_primary_handler+0x0/0x14 enabled interrupts Backtrace: (warn_slowpath_common) from (warn_slowpath_fmt+0x38/0x40) (warn_slowpath_fmt) from (handle_irq_event_percpu+0x14c/0x174) (handle_irq_event_percpu) from (handle_irq_event+0x84/0xb8) (handle_irq_event) from (handle_simple_irq+0x90/0x118) (handle_simple_irq) from (generic_handle_irq+0x30/0x44) (generic_handle_irq) from (dra7xx_pcie_msi_irq_handler+0x7c/0x8c) (dra7xx_pcie_msi_irq_handler) from (irq_forced_thread_fn+0x28/0x5c) (irq_forced_thread_fn) from (irq_thread+0x128/0x204)
This happens because all of them invoke generic_handle_irq() from the requested handler. generic_handle_irq() grabs raw_locks and thus needs to run in raw-IRQ context.
This issue was originally reproduced on TI dra7-evem, but, as was identified during discussion [1], other hosts can also suffer from this issue. Fix all them at once by marking PCIe/PCI (MSI) IRQ cascade handlers IRQF_NO_THREAD explicitly.
[1] http://lkml.kernel.org/r/[email protected]
--- drivers/pci/host/pci-dra7xx.c | 3 ++- drivers/pci/host/pci-exynos.c | 3 ++- drivers/pci/host/pci-imx6.c | 3 ++- drivers/pci/host/pci-tegra.c | 2 +- drivers/pci/host/pcie-rcar.c | 6 ++++-- drivers/pci/host/pcie-spear13xx.c | 3 ++- drivers/pci/host/pcie-xilinx.c | 3 ++- 7 files changed, 15 insertions(+), 8 deletions(-)
drivers/pci/host/pci-dra7xx.c +2 -1
@@ -295,7 +295,8 @@ static int __init dra7xx_add_pcie_port(s } ret =devm_request_irq (&pdev->dev, pp->irq, - dra7xx_pcie_msi_irq_handler,IRQF_SHARED , + dra7xx_pcie_msi_irq_handler, +IRQF_SHARED |IRQF_NO_THREAD ,"dra7-pcie-msi" , pp);if (ret) {dev_err (&pdev->dev,"failed to request irq\n" );
drivers/pci/host/pci-exynos.c +2 -1
@@ -523,7 +523,8 @@ static int __init exynos_add_pcie_port(s ret =devm_request_irq (&pdev->dev, pp->msi_irq, exynos_pcie_msi_irq_handler, -IRQF_SHARED ,"exynos-pcie" , pp); +IRQF_SHARED |IRQF_NO_THREAD , +"exynos-pcie" , pp);if (ret) {dev_err (&pdev->dev,"failed to request msi irq\n" );return ret;
drivers/pci/host/pci-imx6.c +2 -1
@@ -536,7 +536,8 @@ static int __init imx6_add_pcie_port(str ret =devm_request_irq (&pdev->dev, pp->msi_irq, imx6_pcie_msi_handler, -IRQF_SHARED ,"mx6-pcie-msi" , pp); +IRQF_SHARED |IRQF_NO_THREAD , +"mx6-pcie-msi" , pp);if (ret) {dev_err (&pdev->dev,"failed to request MSI irq\n" );return -ENODEV ;
drivers/pci/host/pci-tegra.c +1 -1
@@ -1288,7 +1288,7 @@ static int tegra_pcie_enable_msi(struct msi->irq = err; - err =request_irq (msi->irq, tegra_pcie_msi_irq,0 , + err =request_irq (msi->irq, tegra_pcie_msi_irq,IRQF_NO_THREAD , tegra_msi_irq_chip.name, pcie);if (err <0 ) {dev_err (&pdev->dev,"failed to request IRQ: %d\n" , err);
drivers/pci/host/pcie-rcar.c +4 -2
@@ -694,14 +694,16 @@ static int rcar_pcie_enable_msi(struct r/* Two irqs are for MSI, but they are also used for non-MSI irqs */ err =devm_request_irq (&pdev->dev, msi->irq1, rcar_pcie_msi_irq, -IRQF_SHARED , rcar_msi_irq_chip.name, pcie); +IRQF_SHARED |IRQF_NO_THREAD , + rcar_msi_irq_chip.name, pcie);if (err <0 ) {dev_err (&pdev->dev,"failed to request IRQ: %d\n" , err); goto err; } err =devm_request_irq (&pdev->dev, msi->irq2, rcar_pcie_msi_irq, -IRQF_SHARED , rcar_msi_irq_chip.name, pcie); +IRQF_SHARED |IRQF_NO_THREAD , + rcar_msi_irq_chip.name, pcie);if (err <0 ) {dev_err (&pdev->dev,"failed to request IRQ: %d\n" , err); goto err;
drivers/pci/host/pcie-spear13xx.c +2 -1
@@ -281,7 +281,8 @@ static int spear13xx_add_pcie_port(strucreturn -ENODEV ; } ret =devm_request_irq (dev, pp->irq, spear13xx_pcie_irq_handler, -IRQF_SHARED ,"spear1340-pcie" , pp); +IRQF_SHARED |IRQF_NO_THREAD , +"spear1340-pcie" , pp);if (ret) {dev_err (dev,"failed to request irq %d\n" , pp->irq);return ret;
drivers/pci/host/pcie-xilinx.c +2 -1
@@ -781,7 +781,8 @@ static int xilinx_pcie_parse_dt(struct x port->irq =irq_of_parse_and_map (node,0 ); err =devm_request_irq (dev, port->irq, xilinx_pcie_intr_handler, -IRQF_SHARED ,"xilinx-pcie" , port); +IRQF_SHARED |IRQF_NO_THREAD , +"xilinx-pcie" , port);if (err) {dev_err (dev,"unable to request irq %d\n" , port->irq);return err;
Patches currently in stable-queue which might be from [email protected] are
queue-4.3/i2c-fix-wakeup-irq-parsing.patch queue-4.3/pci-host-mark-pcie-pci-msi-irq-cascade-handlers-as-irqf_no_thread.patch