* [PATCH v3] PCI: hosts: mark pcie/pci (msi) irq cascade handler as IRQF_NO_THREAD
@ 2015-12-10 19:18 Grygorii Strashko
2016-01-06 22:18 ` Bjorn Helgaas
2016-01-07 9:18 ` Lucas Stach
0 siblings, 2 replies; 8+ messages in thread
From: Grygorii Strashko @ 2015-12-10 19:18 UTC (permalink / raw)
To: linux-arm-kernel
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:
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 [<c0043758>] (warn_slowpath_fmt+0x38/0x40)
(warn_slowpath_fmt) from [<c0085fd0>] (handle_irq_event_percpu+0x14c/0x174)
(handle_irq_event_percpu) from [<c008607c>] (handle_irq_event+0x84/0xb8)
(handle_irq_event) from [<c0089240>] (handle_simple_irq+0x90/0x118)
(handle_simple_irq) from [<c0085514>] (generic_handle_irq+0x30/0x44)
(generic_handle_irq) from [<c034a7d4>] (dra7xx_pcie_msi_irq_handler+0x7c/0x8c)
(dra7xx_pcie_msi_irq_handler) from [<c0086f08>] (irq_forced_thread_fn+0x28/0x5c)
(irq_forced_thread_fn) from [<c00871dc>] (irq_thread+0x128/0x204)
This happens because all of them invoke generic_handle_irq() from the
requsted handler. generic_handle_irq grabs raw_locks and this needs to
run in raw-irq context.
This issue was originally reproduced on TI dra7-evem, but, as was
identified during dicussion [1], other PCI(e) hosts can also suffer
from this issue. So let's fix all them at once and mark pcie/pci (msi)
irq cascade handlers IRQF_NO_THREAD explicitly.
[1] https://lkml.org/lkml/2015/11/20/356
Cc: Kishon Vijay Abraham I <kishon@ti.com>
Cc: Bjorn Helgaas <bhelgaas@google.com>
Cc: Jingoo Han <jingoohan1@gmail.com>
Cc: Kukjin Kim <kgene@kernel.org>
Cc: Krzysztof Kozlowski <k.kozlowski@samsung.com>
Cc: Richard Zhu <Richard.Zhu@freescale.com>
Cc: Lucas Stach <l.stach@pengutronix.de>
Cc: Thierry Reding <thierry.reding@gmail.com>
Cc: Stephen Warren <swarren@wwwdotorg.org>
Cc: Alexandre Courbot <gnurou@gmail.com>
Cc: Simon Horman <horms@verge.net.au>
Cc: Pratyush Anand <pratyush.anand@gmail.com>
Cc: Michal Simek <michal.simek@xilinx.com>
Cc: "S?ren Brinkmann" <soren.brinkmann@xilinx.com>
Cc: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
Signed-off-by: Grygorii Strashko <grygorii.strashko@ti.com>
---
Changes in v3:
- change applied to all affected pci(e) host drivers in drivers/pci/hosts.
After some invsetigation I've decided to not touch arch code - it is not easy
to identify all places which need to be fixed.
if it's still required - i can send separate patches for
arch/mips/pci/msi-octeon.c and arch/sparc/kernel/pci_msi.c.
Links
v2: https://lkml.org/lkml/2015/11/20/356
v1: https://lkml.org/lkml/2015/11/5/593
ref: https://lkml.org/lkml/2015/11/3/660
drivers/pci/host/pci-dra7xx.c | 13 ++++++++++++-
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, 25 insertions(+), 8 deletions(-)
diff --git a/drivers/pci/host/pci-dra7xx.c b/drivers/pci/host/pci-dra7xx.c
index 8c36880..0415192 100644
--- a/drivers/pci/host/pci-dra7xx.c
+++ b/drivers/pci/host/pci-dra7xx.c
@@ -301,8 +301,19 @@ static int __init dra7xx_add_pcie_port(struct dra7xx_pcie *dra7xx,
return -EINVAL;
}
+ /*
+ * Mark dra7xx_pcie_msi IRQ as IRQF_NO_THREAD
+ * On -RT and if kernel is booting with "threadirqs" cmd line parameter
+ * the dra7xx_pcie_msi_irq_handler() will be forced threaded but,
+ * in the same time, it's IRQ dispatcher and calls generic_handle_irq(),
+ * which, in turn, will be resolved to handle_simple_irq() call.
+ * The handle_simple_irq() expected to be called with IRQ disabled, as
+ * result kernle will display warning:
+ * "irq XXX handler YYY+0x0/0x14 enabled interrupts".
+ */
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");
diff --git a/drivers/pci/host/pci-exynos.c b/drivers/pci/host/pci-exynos.c
index 01095e1..d997d22 100644
--- a/drivers/pci/host/pci-exynos.c
+++ b/drivers/pci/host/pci-exynos.c
@@ -522,7 +522,8 @@ static int __init exynos_add_pcie_port(struct pcie_port *pp,
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;
diff --git a/drivers/pci/host/pci-imx6.c b/drivers/pci/host/pci-imx6.c
index 22e8224..9ce7cd1 100644
--- a/drivers/pci/host/pci-imx6.c
+++ b/drivers/pci/host/pci-imx6.c
@@ -537,7 +537,8 @@ static int __init imx6_add_pcie_port(struct pcie_port *pp,
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 ret;
diff --git a/drivers/pci/host/pci-tegra.c b/drivers/pci/host/pci-tegra.c
index 3018ae5..3032311 100644
--- a/drivers/pci/host/pci-tegra.c
+++ b/drivers/pci/host/pci-tegra.c
@@ -1288,7 +1288,7 @@ static int tegra_pcie_enable_msi(struct tegra_pcie *pcie)
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);
diff --git a/drivers/pci/host/pcie-rcar.c b/drivers/pci/host/pcie-rcar.c
index f4fa6c5..414c336 100644
--- a/drivers/pci/host/pcie-rcar.c
+++ b/drivers/pci/host/pcie-rcar.c
@@ -720,14 +720,16 @@ static int rcar_pcie_enable_msi(struct rcar_pcie *pcie)
/* 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;
diff --git a/drivers/pci/host/pcie-spear13xx.c b/drivers/pci/host/pcie-spear13xx.c
index b95b756..a6cd823 100644
--- a/drivers/pci/host/pcie-spear13xx.c
+++ b/drivers/pci/host/pcie-spear13xx.c
@@ -279,7 +279,8 @@ static int spear13xx_add_pcie_port(struct pcie_port *pp,
return -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;
diff --git a/drivers/pci/host/pcie-xilinx.c b/drivers/pci/host/pcie-xilinx.c
index 3c7a0d5..4cfa463 100644
--- a/drivers/pci/host/pcie-xilinx.c
+++ b/drivers/pci/host/pcie-xilinx.c
@@ -781,7 +781,8 @@ static int xilinx_pcie_parse_dt(struct xilinx_pcie_port *port)
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;
--
2.6.4
^ permalink raw reply related [flat|nested] 8+ messages in thread
* [PATCH v3] PCI: hosts: mark pcie/pci (msi) irq cascade handler as IRQF_NO_THREAD
2015-12-10 19:18 [PATCH v3] PCI: hosts: mark pcie/pci (msi) irq cascade handler as IRQF_NO_THREAD Grygorii Strashko
@ 2016-01-06 22:18 ` Bjorn Helgaas
2016-01-13 13:39 ` Sebastian Andrzej Siewior
2016-01-07 9:18 ` Lucas Stach
1 sibling, 1 reply; 8+ messages in thread
From: Bjorn Helgaas @ 2016-01-06 22:18 UTC (permalink / raw)
To: linux-arm-kernel
Hi Grygorii,
On Thu, Dec 10, 2015 at 09:18:20PM +0200, Grygorii Strashko wrote:
> 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:
>
> 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 [<c0043758>] (warn_slowpath_fmt+0x38/0x40)
> (warn_slowpath_fmt) from [<c0085fd0>] (handle_irq_event_percpu+0x14c/0x174)
> (handle_irq_event_percpu) from [<c008607c>] (handle_irq_event+0x84/0xb8)
> (handle_irq_event) from [<c0089240>] (handle_simple_irq+0x90/0x118)
> (handle_simple_irq) from [<c0085514>] (generic_handle_irq+0x30/0x44)
> (generic_handle_irq) from [<c034a7d4>] (dra7xx_pcie_msi_irq_handler+0x7c/0x8c)
> (dra7xx_pcie_msi_irq_handler) from [<c0086f08>] (irq_forced_thread_fn+0x28/0x5c)
> (irq_forced_thread_fn) from [<c00871dc>] (irq_thread+0x128/0x204)
>
> This happens because all of them invoke generic_handle_irq() from the
> requsted handler. generic_handle_irq grabs raw_locks and this needs to
> run in raw-irq context.
>
> This issue was originally reproduced on TI dra7-evem, but, as was
> identified during dicussion [1], other PCI(e) hosts can also suffer
> from this issue. So let's fix all them at once and mark pcie/pci (msi)
> irq cascade handlers IRQF_NO_THREAD explicitly.
>
> [1] https://lkml.org/lkml/2015/11/20/356
>
> Cc: Kishon Vijay Abraham I <kishon@ti.com>
> Cc: Bjorn Helgaas <bhelgaas@google.com>
> Cc: Jingoo Han <jingoohan1@gmail.com>
> Cc: Kukjin Kim <kgene@kernel.org>
> Cc: Krzysztof Kozlowski <k.kozlowski@samsung.com>
> Cc: Richard Zhu <Richard.Zhu@freescale.com>
> Cc: Lucas Stach <l.stach@pengutronix.de>
> Cc: Thierry Reding <thierry.reding@gmail.com>
> Cc: Stephen Warren <swarren@wwwdotorg.org>
> Cc: Alexandre Courbot <gnurou@gmail.com>
> Cc: Simon Horman <horms@verge.net.au>
> Cc: Pratyush Anand <pratyush.anand@gmail.com>
> Cc: Michal Simek <michal.simek@xilinx.com>
> Cc: "S?ren Brinkmann" <soren.brinkmann@xilinx.com>
> Cc: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
> Signed-off-by: Grygorii Strashko <grygorii.strashko@ti.com>
> ---
> Changes in v3:
> - change applied to all affected pci(e) host drivers in drivers/pci/hosts.
> After some invsetigation I've decided to not touch arch code - it is not easy
> to identify all places which need to be fixed.
> if it's still required - i can send separate patches for
> arch/mips/pci/msi-octeon.c and arch/sparc/kernel/pci_msi.c.
> Links
> v2: https://lkml.org/lkml/2015/11/20/356
> v1: https://lkml.org/lkml/2015/11/5/593
> ref: https://lkml.org/lkml/2015/11/3/660
>
> drivers/pci/host/pci-dra7xx.c | 13 ++++++++++++-
> 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, 25 insertions(+), 8 deletions(-)
I applied this to pci/host for v4.5, thanks. I added a stable tag.
I haven't seen any acks from the host driver guys, but I will still add
them if I see any in the next few days.
Bjorn
> diff --git a/drivers/pci/host/pci-dra7xx.c b/drivers/pci/host/pci-dra7xx.c
> index 8c36880..0415192 100644
> --- a/drivers/pci/host/pci-dra7xx.c
> +++ b/drivers/pci/host/pci-dra7xx.c
> @@ -301,8 +301,19 @@ static int __init dra7xx_add_pcie_port(struct dra7xx_pcie *dra7xx,
> return -EINVAL;
> }
>
> + /*
> + * Mark dra7xx_pcie_msi IRQ as IRQF_NO_THREAD
> + * On -RT and if kernel is booting with "threadirqs" cmd line parameter
> + * the dra7xx_pcie_msi_irq_handler() will be forced threaded but,
> + * in the same time, it's IRQ dispatcher and calls generic_handle_irq(),
> + * which, in turn, will be resolved to handle_simple_irq() call.
> + * The handle_simple_irq() expected to be called with IRQ disabled, as
> + * result kernle will display warning:
> + * "irq XXX handler YYY+0x0/0x14 enabled interrupts".
> + */
> 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");
> diff --git a/drivers/pci/host/pci-exynos.c b/drivers/pci/host/pci-exynos.c
> index 01095e1..d997d22 100644
> --- a/drivers/pci/host/pci-exynos.c
> +++ b/drivers/pci/host/pci-exynos.c
> @@ -522,7 +522,8 @@ static int __init exynos_add_pcie_port(struct pcie_port *pp,
>
> 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;
> diff --git a/drivers/pci/host/pci-imx6.c b/drivers/pci/host/pci-imx6.c
> index 22e8224..9ce7cd1 100644
> --- a/drivers/pci/host/pci-imx6.c
> +++ b/drivers/pci/host/pci-imx6.c
> @@ -537,7 +537,8 @@ static int __init imx6_add_pcie_port(struct pcie_port *pp,
>
> 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 ret;
> diff --git a/drivers/pci/host/pci-tegra.c b/drivers/pci/host/pci-tegra.c
> index 3018ae5..3032311 100644
> --- a/drivers/pci/host/pci-tegra.c
> +++ b/drivers/pci/host/pci-tegra.c
> @@ -1288,7 +1288,7 @@ static int tegra_pcie_enable_msi(struct tegra_pcie *pcie)
>
> 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);
> diff --git a/drivers/pci/host/pcie-rcar.c b/drivers/pci/host/pcie-rcar.c
> index f4fa6c5..414c336 100644
> --- a/drivers/pci/host/pcie-rcar.c
> +++ b/drivers/pci/host/pcie-rcar.c
> @@ -720,14 +720,16 @@ static int rcar_pcie_enable_msi(struct rcar_pcie *pcie)
>
> /* 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;
> diff --git a/drivers/pci/host/pcie-spear13xx.c b/drivers/pci/host/pcie-spear13xx.c
> index b95b756..a6cd823 100644
> --- a/drivers/pci/host/pcie-spear13xx.c
> +++ b/drivers/pci/host/pcie-spear13xx.c
> @@ -279,7 +279,8 @@ static int spear13xx_add_pcie_port(struct pcie_port *pp,
> return -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;
> diff --git a/drivers/pci/host/pcie-xilinx.c b/drivers/pci/host/pcie-xilinx.c
> index 3c7a0d5..4cfa463 100644
> --- a/drivers/pci/host/pcie-xilinx.c
> +++ b/drivers/pci/host/pcie-xilinx.c
> @@ -781,7 +781,8 @@ static int xilinx_pcie_parse_dt(struct xilinx_pcie_port *port)
>
> 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;
> --
> 2.6.4
>
> --
> To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
> the body of a message to majordomo at vger.kernel.org
> More majordomo info at http://vger.kernel.org/majordomo-info.html
> Please read the FAQ at http://www.tux.org/lkml/
^ permalink raw reply [flat|nested] 8+ messages in thread
* [PATCH v3] PCI: hosts: mark pcie/pci (msi) irq cascade handler as IRQF_NO_THREAD
2015-12-10 19:18 [PATCH v3] PCI: hosts: mark pcie/pci (msi) irq cascade handler as IRQF_NO_THREAD Grygorii Strashko
2016-01-06 22:18 ` Bjorn Helgaas
@ 2016-01-07 9:18 ` Lucas Stach
1 sibling, 0 replies; 8+ messages in thread
From: Lucas Stach @ 2016-01-07 9:18 UTC (permalink / raw)
To: linux-arm-kernel
Am Donnerstag, den 10.12.2015, 21:18 +0200 schrieb Grygorii Strashko:
> 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:
>
> 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 [<c0043758>] (warn_slowpath_fmt+0x38/0x40)
> (warn_slowpath_fmt) from [<c0085fd0>] (handle_irq_event_percpu+0x14c/0x174)
> (handle_irq_event_percpu) from [<c008607c>] (handle_irq_event+0x84/0xb8)
> (handle_irq_event) from [<c0089240>] (handle_simple_irq+0x90/0x118)
> (handle_simple_irq) from [<c0085514>] (generic_handle_irq+0x30/0x44)
> (generic_handle_irq) from [<c034a7d4>] (dra7xx_pcie_msi_irq_handler+0x7c/0x8c)
> (dra7xx_pcie_msi_irq_handler) from [<c0086f08>] (irq_forced_thread_fn+0x28/0x5c)
> (irq_forced_thread_fn) from [<c00871dc>] (irq_thread+0x128/0x204)
>
> This happens because all of them invoke generic_handle_irq() from the
> requsted handler. generic_handle_irq grabs raw_locks and this needs to
> run in raw-irq context.
>
> This issue was originally reproduced on TI dra7-evem, but, as was
> identified during dicussion [1], other PCI(e) hosts can also suffer
> from this issue. So let's fix all them at once and mark pcie/pci (msi)
> irq cascade handlers IRQF_NO_THREAD explicitly.
>
> [1] https://lkml.org/lkml/2015/11/20/356
>
> Cc: Kishon Vijay Abraham I <kishon@ti.com>
> Cc: Bjorn Helgaas <bhelgaas@google.com>
> Cc: Jingoo Han <jingoohan1@gmail.com>
> Cc: Kukjin Kim <kgene@kernel.org>
> Cc: Krzysztof Kozlowski <k.kozlowski@samsung.com>
> Cc: Richard Zhu <Richard.Zhu@freescale.com>
> Cc: Lucas Stach <l.stach@pengutronix.de>
> Cc: Thierry Reding <thierry.reding@gmail.com>
> Cc: Stephen Warren <swarren@wwwdotorg.org>
> Cc: Alexandre Courbot <gnurou@gmail.com>
> Cc: Simon Horman <horms@verge.net.au>
> Cc: Pratyush Anand <pratyush.anand@gmail.com>
> Cc: Michal Simek <michal.simek@xilinx.com>
> Cc: "S?ren Brinkmann" <soren.brinkmann@xilinx.com>
> Cc: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
> Signed-off-by: Grygorii Strashko <grygorii.strashko@ti.com>
Sorry this fell through the cracks, so here is my late
Acked-by: Lucas Stach <l.stach@pengutronix.de>
for the imx6 part.
> ---
> Changes in v3:
> - change applied to all affected pci(e) host drivers in drivers/pci/hosts.
> After some invsetigation I've decided to not touch arch code - it is not easy
> to identify all places which need to be fixed.
> if it's still required - i can send separate patches for
> arch/mips/pci/msi-octeon.c and arch/sparc/kernel/pci_msi.c.
> Links
> v2: https://lkml.org/lkml/2015/11/20/356
> v1: https://lkml.org/lkml/2015/11/5/593
> ref: https://lkml.org/lkml/2015/11/3/660
>
> drivers/pci/host/pci-dra7xx.c | 13 ++++++++++++-
> 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, 25 insertions(+), 8 deletions(-)
>
> diff --git a/drivers/pci/host/pci-dra7xx.c b/drivers/pci/host/pci-dra7xx.c
> index 8c36880..0415192 100644
> --- a/drivers/pci/host/pci-dra7xx.c
> +++ b/drivers/pci/host/pci-dra7xx.c
> @@ -301,8 +301,19 @@ static int __init dra7xx_add_pcie_port(struct dra7xx_pcie *dra7xx,
> return -EINVAL;
> }
>
> + /*
> + * Mark dra7xx_pcie_msi IRQ as IRQF_NO_THREAD
> + * On -RT and if kernel is booting with "threadirqs" cmd line parameter
> + * the dra7xx_pcie_msi_irq_handler() will be forced threaded but,
> + * in the same time, it's IRQ dispatcher and calls generic_handle_irq(),
> + * which, in turn, will be resolved to handle_simple_irq() call.
> + * The handle_simple_irq() expected to be called with IRQ disabled, as
> + * result kernle will display warning:
> + * "irq XXX handler YYY+0x0/0x14 enabled interrupts".
> + */
> 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");
> diff --git a/drivers/pci/host/pci-exynos.c b/drivers/pci/host/pci-exynos.c
> index 01095e1..d997d22 100644
> --- a/drivers/pci/host/pci-exynos.c
> +++ b/drivers/pci/host/pci-exynos.c
> @@ -522,7 +522,8 @@ static int __init exynos_add_pcie_port(struct pcie_port *pp,
>
> 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;
> diff --git a/drivers/pci/host/pci-imx6.c b/drivers/pci/host/pci-imx6.c
> index 22e8224..9ce7cd1 100644
> --- a/drivers/pci/host/pci-imx6.c
> +++ b/drivers/pci/host/pci-imx6.c
> @@ -537,7 +537,8 @@ static int __init imx6_add_pcie_port(struct pcie_port *pp,
>
> 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 ret;
> diff --git a/drivers/pci/host/pci-tegra.c b/drivers/pci/host/pci-tegra.c
> index 3018ae5..3032311 100644
> --- a/drivers/pci/host/pci-tegra.c
> +++ b/drivers/pci/host/pci-tegra.c
> @@ -1288,7 +1288,7 @@ static int tegra_pcie_enable_msi(struct tegra_pcie *pcie)
>
> 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);
> diff --git a/drivers/pci/host/pcie-rcar.c b/drivers/pci/host/pcie-rcar.c
> index f4fa6c5..414c336 100644
> --- a/drivers/pci/host/pcie-rcar.c
> +++ b/drivers/pci/host/pcie-rcar.c
> @@ -720,14 +720,16 @@ static int rcar_pcie_enable_msi(struct rcar_pcie *pcie)
>
> /* 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;
> diff --git a/drivers/pci/host/pcie-spear13xx.c b/drivers/pci/host/pcie-spear13xx.c
> index b95b756..a6cd823 100644
> --- a/drivers/pci/host/pcie-spear13xx.c
> +++ b/drivers/pci/host/pcie-spear13xx.c
> @@ -279,7 +279,8 @@ static int spear13xx_add_pcie_port(struct pcie_port *pp,
> return -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;
> diff --git a/drivers/pci/host/pcie-xilinx.c b/drivers/pci/host/pcie-xilinx.c
> index 3c7a0d5..4cfa463 100644
> --- a/drivers/pci/host/pcie-xilinx.c
> +++ b/drivers/pci/host/pcie-xilinx.c
> @@ -781,7 +781,8 @@ static int xilinx_pcie_parse_dt(struct xilinx_pcie_port *port)
>
> 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;
--
Pengutronix e.K. | Lucas Stach |
Industrial Linux Solutions | http://www.pengutronix.de/ |
^ permalink raw reply [flat|nested] 8+ messages in thread
* [PATCH v3] PCI: hosts: mark pcie/pci (msi) irq cascade handler as IRQF_NO_THREAD
2016-01-06 22:18 ` Bjorn Helgaas
@ 2016-01-13 13:39 ` Sebastian Andrzej Siewior
2016-01-13 17:50 ` Bjorn Helgaas
0 siblings, 1 reply; 8+ messages in thread
From: Sebastian Andrzej Siewior @ 2016-01-13 13:39 UTC (permalink / raw)
To: linux-arm-kernel
* Bjorn Helgaas | 2016-01-06 16:18:27 [-0600]:
>Hi Bjorn,
>> diff --git a/drivers/pci/host/pci-dra7xx.c b/drivers/pci/host/pci-dra7xx.c
>> index 8c36880..0415192 100644
>> --- a/drivers/pci/host/pci-dra7xx.c
>> +++ b/drivers/pci/host/pci-dra7xx.c
>> @@ -301,8 +301,19 @@ static int __init dra7xx_add_pcie_port(struct dra7xx_pcie *dra7xx,
>> return -EINVAL;
>> }
>>
>> + /*
>> + * Mark dra7xx_pcie_msi IRQ as IRQF_NO_THREAD
>> + * On -RT and if kernel is booting with "threadirqs" cmd line parameter
>> + * the dra7xx_pcie_msi_irq_handler() will be forced threaded but,
>> + * in the same time, it's IRQ dispatcher and calls generic_handle_irq(),
>> + * which, in turn, will be resolved to handle_simple_irq() call.
>> + * The handle_simple_irq() expected to be called with IRQ disabled, as
>> + * result kernle will display warning:
>> + * "irq XXX handler YYY+0x0/0x14 enabled interrupts".
>> + */
could you _please_ remove this coment? This kind of comment (if at all)
should be part of the commit message (which is the case more or less).
>> 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");
>> diff --git a/drivers/pci/host/pci-exynos.c b/drivers/pci/host/pci-exynos.c
Sebastian
^ permalink raw reply [flat|nested] 8+ messages in thread
* [PATCH v3] PCI: hosts: mark pcie/pci (msi) irq cascade handler as IRQF_NO_THREAD
2016-01-13 13:39 ` Sebastian Andrzej Siewior
@ 2016-01-13 17:50 ` Bjorn Helgaas
2016-01-13 18:48 ` Grygorii Strashko
0 siblings, 1 reply; 8+ messages in thread
From: Bjorn Helgaas @ 2016-01-13 17:50 UTC (permalink / raw)
To: linux-arm-kernel
On Wed, Jan 13, 2016 at 02:39:04PM +0100, Sebastian Andrzej Siewior wrote:
> * Bjorn Helgaas | 2016-01-06 16:18:27 [-0600]:
>
> >Hi Bjorn,
>
> >> diff --git a/drivers/pci/host/pci-dra7xx.c b/drivers/pci/host/pci-dra7xx.c
> >> index 8c36880..0415192 100644
> >> --- a/drivers/pci/host/pci-dra7xx.c
> >> +++ b/drivers/pci/host/pci-dra7xx.c
> >> @@ -301,8 +301,19 @@ static int __init dra7xx_add_pcie_port(struct dra7xx_pcie *dra7xx,
> >> return -EINVAL;
> >> }
> >>
> >> + /*
> >> + * Mark dra7xx_pcie_msi IRQ as IRQF_NO_THREAD
> >> + * On -RT and if kernel is booting with "threadirqs" cmd line parameter
> >> + * the dra7xx_pcie_msi_irq_handler() will be forced threaded but,
> >> + * in the same time, it's IRQ dispatcher and calls generic_handle_irq(),
> >> + * which, in turn, will be resolved to handle_simple_irq() call.
> >> + * The handle_simple_irq() expected to be called with IRQ disabled, as
> >> + * result kernle will display warning:
> >> + * "irq XXX handler YYY+0x0/0x14 enabled interrupts".
> >> + */
>
> could you _please_ remove this coment? This kind of comment (if at all)
> should be part of the commit message (which is the case more or less).
IIRC, Grygorii specifically wanted to keep this comment in dra7xx, but
I do agree that this level of detail is more appropriate for a changelog.
If Grygorii and Kishon don't object, I can update the patch to remove it.
> >> 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");
> >> diff --git a/drivers/pci/host/pci-exynos.c b/drivers/pci/host/pci-exynos.c
>
> Sebastian
> --
> To unsubscribe from this list: send the line "unsubscribe linux-pci" in
> the body of a message to majordomo at vger.kernel.org
> More majordomo info at http://vger.kernel.org/majordomo-info.html
^ permalink raw reply [flat|nested] 8+ messages in thread
* [PATCH v3] PCI: hosts: mark pcie/pci (msi) irq cascade handler as IRQF_NO_THREAD
2016-01-13 17:50 ` Bjorn Helgaas
@ 2016-01-13 18:48 ` Grygorii Strashko
2016-01-14 6:19 ` Kishon Vijay Abraham I
0 siblings, 1 reply; 8+ messages in thread
From: Grygorii Strashko @ 2016-01-13 18:48 UTC (permalink / raw)
To: linux-arm-kernel
On 01/13/2016 07:50 PM, Bjorn Helgaas wrote:
> On Wed, Jan 13, 2016 at 02:39:04PM +0100, Sebastian Andrzej Siewior wrote:
>> * Bjorn Helgaas | 2016-01-06 16:18:27 [-0600]:
>>
>>> Hi Bjorn,
>>
>>>> diff --git a/drivers/pci/host/pci-dra7xx.c b/drivers/pci/host/pci-dra7xx.c
>>>> index 8c36880..0415192 100644
>>>> --- a/drivers/pci/host/pci-dra7xx.c
>>>> +++ b/drivers/pci/host/pci-dra7xx.c
>>>> @@ -301,8 +301,19 @@ static int __init dra7xx_add_pcie_port(struct dra7xx_pcie *dra7xx,
>>>> return -EINVAL;
>>>> }
>>>>
>>>> + /*
>>>> + * Mark dra7xx_pcie_msi IRQ as IRQF_NO_THREAD
>>>> + * On -RT and if kernel is booting with "threadirqs" cmd line parameter
>>>> + * the dra7xx_pcie_msi_irq_handler() will be forced threaded but,
>>>> + * in the same time, it's IRQ dispatcher and calls generic_handle_irq(),
>>>> + * which, in turn, will be resolved to handle_simple_irq() call.
>>>> + * The handle_simple_irq() expected to be called with IRQ disabled, as
>>>> + * result kernle will display warning:
>>>> + * "irq XXX handler YYY+0x0/0x14 enabled interrupts".
>>>> + */
>>
>> could you _please_ remove this coment? This kind of comment (if at all)
>> should be part of the commit message (which is the case more or less).
>
> IIRC, Grygorii specifically wanted to keep this comment in dra7xx, but
True.
> I do agree that this level of detail is more appropriate for a changelog.
>
> If Grygorii and Kishon don't object, I can update the patch to remove it.
But no objections from my side. Thanks a lot.
--
regards,
-grygorii
^ permalink raw reply [flat|nested] 8+ messages in thread
* [PATCH v3] PCI: hosts: mark pcie/pci (msi) irq cascade handler as IRQF_NO_THREAD
2016-01-13 18:48 ` Grygorii Strashko
@ 2016-01-14 6:19 ` Kishon Vijay Abraham I
2016-01-15 18:31 ` Bjorn Helgaas
0 siblings, 1 reply; 8+ messages in thread
From: Kishon Vijay Abraham I @ 2016-01-14 6:19 UTC (permalink / raw)
To: linux-arm-kernel
Hi,
On Thursday 14 January 2016 12:18 AM, Grygorii Strashko wrote:
> On 01/13/2016 07:50 PM, Bjorn Helgaas wrote:
>> On Wed, Jan 13, 2016 at 02:39:04PM +0100, Sebastian Andrzej Siewior wrote:
>>> * Bjorn Helgaas | 2016-01-06 16:18:27 [-0600]:
>>>
>>>> Hi Bjorn,
>>>
>>>>> diff --git a/drivers/pci/host/pci-dra7xx.c b/drivers/pci/host/pci-dra7xx.c
>>>>> index 8c36880..0415192 100644
>>>>> --- a/drivers/pci/host/pci-dra7xx.c
>>>>> +++ b/drivers/pci/host/pci-dra7xx.c
>>>>> @@ -301,8 +301,19 @@ static int __init dra7xx_add_pcie_port(struct
>>>>> dra7xx_pcie *dra7xx,
>>>>> return -EINVAL;
>>>>> }
>>>>>
>>>>> + /*
>>>>> + * Mark dra7xx_pcie_msi IRQ as IRQF_NO_THREAD
>>>>> + * On -RT and if kernel is booting with "threadirqs" cmd line parameter
>>>>> + * the dra7xx_pcie_msi_irq_handler() will be forced threaded but,
>>>>> + * in the same time, it's IRQ dispatcher and calls generic_handle_irq(),
>>>>> + * which, in turn, will be resolved to handle_simple_irq() call.
>>>>> + * The handle_simple_irq() expected to be called with IRQ disabled, as
>>>>> + * result kernle will display warning:
>>>>> + * "irq XXX handler YYY+0x0/0x14 enabled interrupts".
>>>>> + */
>>>
>>> could you _please_ remove this coment? This kind of comment (if at all)
>>> should be part of the commit message (which is the case more or less).
>>
>> IIRC, Grygorii specifically wanted to keep this comment in dra7xx, but
>
> True.
>
>> I do agree that this level of detail is more appropriate for a changelog.
>>
>> If Grygorii and Kishon don't object, I can update the patch to remove it.
>
> But no objections from my side. Thanks a lot.
I don't have any objections.
Thanks
Kishon
^ permalink raw reply [flat|nested] 8+ messages in thread
* [PATCH v3] PCI: hosts: mark pcie/pci (msi) irq cascade handler as IRQF_NO_THREAD
2016-01-14 6:19 ` Kishon Vijay Abraham I
@ 2016-01-15 18:31 ` Bjorn Helgaas
0 siblings, 0 replies; 8+ messages in thread
From: Bjorn Helgaas @ 2016-01-15 18:31 UTC (permalink / raw)
To: linux-arm-kernel
On Thu, Jan 14, 2016 at 11:49:24AM +0530, Kishon Vijay Abraham I wrote:
> Hi,
>
> On Thursday 14 January 2016 12:18 AM, Grygorii Strashko wrote:
> > On 01/13/2016 07:50 PM, Bjorn Helgaas wrote:
> >> On Wed, Jan 13, 2016 at 02:39:04PM +0100, Sebastian Andrzej Siewior wrote:
> >>> * Bjorn Helgaas | 2016-01-06 16:18:27 [-0600]:
> >>>
> >>>> Hi Bjorn,
> >>>
> >>>>> diff --git a/drivers/pci/host/pci-dra7xx.c b/drivers/pci/host/pci-dra7xx.c
> >>>>> index 8c36880..0415192 100644
> >>>>> --- a/drivers/pci/host/pci-dra7xx.c
> >>>>> +++ b/drivers/pci/host/pci-dra7xx.c
> >>>>> @@ -301,8 +301,19 @@ static int __init dra7xx_add_pcie_port(struct
> >>>>> dra7xx_pcie *dra7xx,
> >>>>> return -EINVAL;
> >>>>> }
> >>>>>
> >>>>> + /*
> >>>>> + * Mark dra7xx_pcie_msi IRQ as IRQF_NO_THREAD
> >>>>> + * On -RT and if kernel is booting with "threadirqs" cmd line parameter
> >>>>> + * the dra7xx_pcie_msi_irq_handler() will be forced threaded but,
> >>>>> + * in the same time, it's IRQ dispatcher and calls generic_handle_irq(),
> >>>>> + * which, in turn, will be resolved to handle_simple_irq() call.
> >>>>> + * The handle_simple_irq() expected to be called with IRQ disabled, as
> >>>>> + * result kernle will display warning:
> >>>>> + * "irq XXX handler YYY+0x0/0x14 enabled interrupts".
> >>>>> + */
> >>>
> >>> could you _please_ remove this coment? This kind of comment (if at all)
> >>> should be part of the commit message (which is the case more or less).
> >>
> >> IIRC, Grygorii specifically wanted to keep this comment in dra7xx, but
> >
> > True.
> >
> >> I do agree that this level of detail is more appropriate for a changelog.
> >>
> >> If Grygorii and Kishon don't object, I can update the patch to remove it.
> >
> > But no objections from my side. Thanks a lot.
>
> I don't have any objections.
OK, I dropped it, thanks guys!
Bjorn
^ permalink raw reply [flat|nested] 8+ messages in thread
end of thread, other threads:[~2016-01-15 18:31 UTC | newest]
Thread overview: 8+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2015-12-10 19:18 [PATCH v3] PCI: hosts: mark pcie/pci (msi) irq cascade handler as IRQF_NO_THREAD Grygorii Strashko
2016-01-06 22:18 ` Bjorn Helgaas
2016-01-13 13:39 ` Sebastian Andrzej Siewior
2016-01-13 17:50 ` Bjorn Helgaas
2016-01-13 18:48 ` Grygorii Strashko
2016-01-14 6:19 ` Kishon Vijay Abraham I
2016-01-15 18:31 ` Bjorn Helgaas
2016-01-07 9:18 ` Lucas Stach
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).