From: Bjorn Helgaas <bhelgaas@google.com>
To: Kevin Hao <haokexin@gmail.com>
Cc: linux-pci@vger.kernel.org,
Richard Zhu <Richard.Zhu@freescale.com>,
Lucas Stach <l.stach@pengutronix.de>,
Thomas Gleixner <tglx@linutronix.de>
Subject: Re: [PATCH 1/4] PCI: imx6: Mark the msi cascade handler IRQF_NO_THREAD
Date: Tue, 11 Aug 2015 15:07:28 -0500 [thread overview]
Message-ID: <20150811200728.GE13982@google.com> (raw)
In-Reply-To: <20150811080352.GB30310@pek-khao-d1.corp.ad.wrs.com>
On Tue, Aug 11, 2015 at 04:03:52PM +0800, Kevin Hao wrote:
> On Mon, Aug 10, 2015 at 06:26:15PM -0500, Bjorn Helgaas wrote:
> > [+cc Thomas]
> >
> > On Fri, Jul 24, 2015 at 01:29:33PM +0800, Kevin Hao wrote:
> > > The cascade handler must run in hard interrupt context, otherwise
> > > it will cause the following kernel warning if we force threading
> > > of all the interrupt handlers via kernel command parameter
> > > "threadirqs":
> >
> > I guess imx6_pcie_msi_handler() is the cascade handler?
>
> Yes.
>
> > What makes it
> > special so that it needs IRQF_NO_THREAD?
>
> Because it will cascade into another irq primary handler (PCIe device irq
> handler in this case). The irq primary handler must run in hard irq
> context. But if imx6_pcie_msi_handler() run in a thread context, it
> will cause the PCIe device primary irq handler also run in the same
> thread context. That is why we get the kernel warning.
>
> > static irqreturn_t imx6_pcie_msi_handler(int irq, void *arg)
> > {
> > struct pcie_port *pp = arg;
> >
> > return dw_handle_msi_irq(pp);
> > }
> >
> > So I guess whatever is special must be in dw_handle_msi_irq(). Is it
> > because dw_handle_msi_irq() calls generic_handle_irq()?
>
> Yes.
OK, you're going to have to help me out a bit. There are too many
dots here, and I can't get them all connected.
Is it a general rule that handlers that call generic_handle_irq() must
use IRQF_NO_THREAD? I'm trying to figure out how the writer of a
driver like imx6 is supposed to know to use IRQF_NO_THREAD.
This patch fixes an error in the driver, so the changelog should say
exactly what the error is. I don't completely understand the lockdep
output, but I think this will be along the lines of:
Path A disables IRQs in F1 and acquires desc->lock in F2.
Path B acquires desc->lock in F3 with IRQs enabled.
Path B may be interrupted after acquiring desc->lock, and
we may deadlock if we try to acquire desc->lock again in path A.
Can you sketch this out in the changelog, squash the other driver
patches into this one, and post a v2?
> > > [ INFO: inconsistent lock state ]
> > > 4.2.0-rc3-next-20150723 #28 Not tainted
> > > ---------------------------------
> > > inconsistent {IN-HARDIRQ-W} -> {HARDIRQ-ON-W} usage.
> > > irq/21-mx6-pcie/62 [HC0[0]:SC0[2]:HE1:SE0] takes:
> > > (&irq_desc_lock_class){?.-...}, at: [<80078d94>] handle_simple_irq+0x1c/0xc0
> > > {IN-HARDIRQ-W} state was registered at:
> > > [<8006aa70>] lock_acquire+0x74/0x94
> > > [<807acc6c>] _raw_spin_lock+0x34/0x44
> > > [<8007900c>] handle_fasteoi_irq+0x20/0x1b8
> > > [<80075720>] generic_handle_irq+0x28/0x38
> > > [<80075864>] __handle_domain_irq+0x6c/0xe0
> > > [<80009558>] gic_handle_irq+0x28/0x68
> > > [<80013b64>] __irq_svc+0x44/0x5c
> > > [<807ad400>] _raw_spin_unlock_irq+0x30/0x34
> > > [<8004cffc>] finish_task_switch+0xc0/0x218
> > > [<807a7a10>] __schedule+0x248/0x6e0
> > > [<807a7fac>] schedule+0x38/0x9c
> > > [<807a8240>] schedule_preempt_disabled+0x10/0x14
> > > [<80063f8c>] cpu_startup_entry+0xfc/0x1f8
> > > [<8079f640>] rest_init+0x130/0x16c
> > > [<80a55ca4>] start_kernel+0x374/0x3e8
> > > [<1000807c>] 0x1000807c
> > > irq event stamp: 16
> > > hardirqs last enabled at (15): [<807ad3fc>] _raw_spin_unlock_irq+0x2c/0x34
> > > hardirqs last disabled at (14): [<807acd80>] _raw_spin_lock_irq+0x20/0x58
> > > softirqs last enabled at (0): [<800283d8>] copy_process.isra.58+0x3bc/0x1504
> > > softirqs last disabled at (16): [<80076f08>] irq_forced_thread_fn+0x0/0x68
> > >
> > > other info that might help us debug this:
> > > Possible unsafe locking scenario:
> > >
> > > CPU0
> > > ----
> > > lock(&irq_desc_lock_class);
> > > <Interrupt>
> > > lock(&irq_desc_lock_class);
> > >
> > > *** DEADLOCK ***
> > >
> > > no locks held by irq/21-mx6-pcie/62.
> > >
> > > stack backtrace:
> > > CPU: 0 PID: 62 Comm: irq/21-mx6-pcie Not tainted 4.2.0-rc3-next-20150723 #28
> > > Hardware name: Freescale i.MX6 Quad/DualLite (Device Tree)
> > > Backtrace:
> > > [<80012dc4>] (dump_backtrace) from [<80012f64>] (show_stack+0x18/0x1c)
> > > r6:be3eeb78 r5:00000000 r4:00000000 r3:00000000
> > > [<80012f4c>] (show_stack) from [<807a4b50>] (dump_stack+0x80/0x9c)
> > > [<807a4ad0>] (dump_stack) from [<807a2efc>] (print_usage_bug+0x270/0x2e4)
> > > r5:be3ee780 r4:80c579ec
> > > [<807a2c8c>] (print_usage_bug) from [<8006874c>] (mark_lock+0x5b4/0x6e0)
> > > r10:80c579ec r9:800678e0 r8:be3ee780 r7:00000000 r6:80c579ec r5:be3eeb78
> > > r4:00000002
> > > [<80068198>] (mark_lock) from [<80068f70>] (__lock_acquire+0x6f8/0x1e20)
> > > r10:00000001 r9:be3eeb78 r8:be3ee780 r7:00000008 r6:000003f8 r5:be3ee780
> > > r4:00000000
> > > [<80068878>] (__lock_acquire) from [<8006aa70>] (lock_acquire+0x74/0x94)
> > > r10:00000001 r9:00000001 r8:00000000 r7:00000001 r6:00000001 r5:60030013
> > > r4:00000000
> > > [<8006a9fc>] (lock_acquire) from [<807acc6c>] (_raw_spin_lock+0x34/0x44)
> > > r6:0000012c r5:00000001 r4:be1f4d64
> > > [<807acc38>] (_raw_spin_lock) from [<80078d94>] (handle_simple_irq+0x1c/0xc0)
> > > r5:be1f4d64 r4:be1f4d00
> > > [<80078d78>] (handle_simple_irq) from [<80075720>] (generic_handle_irq+0x28/0x38)
> > > r5:be28ee20 r4:0000012c
> > > [<800756f8>] (generic_handle_irq) from [<80321914>] (dw_handle_msi_irq+0x68/0x90)
> > > r4:00000001 r3:00000002
> > > [<803218ac>] (dw_handle_msi_irq) from [<8032265c>] (imx6_pcie_msi_handler+0x14/0x18)
> > > r7:80076f08 r6:be39efc0 r5:be154000 r4:be39efc0
> > > [<80322648>] (imx6_pcie_msi_handler) from [<80076f38>] (irq_forced_thread_fn+0x30/0x68)
> > > [<80076f08>] (irq_forced_thread_fn) from [<80076cb4>] (irq_thread+0x14c/0x19c)
> > > r6:be39efc0 r5:be154000 r4:be39efe0 r3:00000004
> > > [<80076b68>] (irq_thread) from [<80047f80>] (kthread+0xdc/0xf8)
> > > r10:00000000 r9:00000000 r8:00000000 r7:80076b68 r6:be39efc0 r5:be3a1000
> > > r4:00000000
> > > [<80047ea4>] (kthread) from [<8000fa38>] (ret_from_fork+0x14/0x3c)
> > > r7:00000000 r6:00000000 r5:80047ea4 r4:be3a1000
> > >
> > > Signed-off-by: Kevin Hao <haokexin@gmail.com>
> > > ---
> > > drivers/pci/host/pci-imx6.c | 3 ++-
> > > 1 file changed, 2 insertions(+), 1 deletion(-)
> > >
> > > diff --git a/drivers/pci/host/pci-imx6.c b/drivers/pci/host/pci-imx6.c
> > > index 233a196c6e66..fd5eb2e34fc0 100644
> > > --- a/drivers/pci/host/pci-imx6.c
> > > +++ b/drivers/pci/host/pci-imx6.c
> > > @@ -544,7 +544,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 -ENODEV;
> > > --
> > > 2.1.0
> > >
next prev parent reply other threads:[~2015-08-11 20:07 UTC|newest]
Thread overview: 15+ messages / expand[flat|nested] mbox.gz Atom feed top
2015-07-24 5:29 [PATCH 0/4] PCI: Mark the msi cascade handler IRQF_NO_THREAD Kevin Hao
2015-07-24 5:29 ` [PATCH 1/4] PCI: imx6: " Kevin Hao
2015-07-24 8:00 ` Lucas Stach
2015-07-24 8:19 ` Kevin Hao
2015-07-24 8:22 ` Lucas Stach
2015-07-24 8:23 ` Lucas Stach
2015-08-10 23:26 ` Bjorn Helgaas
2015-08-11 8:01 ` Lucas Stach
2015-08-11 8:03 ` Kevin Hao
2015-08-11 14:38 ` Bjorn Helgaas
2015-08-11 20:07 ` Bjorn Helgaas [this message]
2015-08-12 1:25 ` Kevin Hao
2015-07-24 5:29 ` [PATCH 2/4] PCI: dra7xx: " Kevin Hao
2015-07-24 5:29 ` [PATCH 3/4] PCI: exynos: " Kevin Hao
2015-07-24 5:29 ` [PATCH 4/4] PCI: spear: " Kevin Hao
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20150811200728.GE13982@google.com \
--to=bhelgaas@google.com \
--cc=Richard.Zhu@freescale.com \
--cc=haokexin@gmail.com \
--cc=l.stach@pengutronix.de \
--cc=linux-pci@vger.kernel.org \
--cc=tglx@linutronix.de \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
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).