Received: by 10.213.65.68 with SMTP id h4csp323901imn; Fri, 16 Mar 2018 04:23:33 -0700 (PDT) X-Google-Smtp-Source: AG47ELsO9ny8qkqXwc2U7G0q4yTEAhbZlL6C0+JW56rp+MnS9ISZ9YP7VR2GlRpSAIlepFRf3E52 X-Received: by 2002:a17:902:529:: with SMTP id 38-v6mr1783661plf.64.1521199412962; Fri, 16 Mar 2018 04:23:32 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1521199412; cv=none; d=google.com; s=arc-20160816; b=1EPnaOqz4lHH8QawJdjhfFz6ZX9TxX4OZFwSVA8WLpNAzET0LueRmdb2kR3lPFgR2U 4QC4LpY75wWjg6SfdgCxbVGyCRqT73TGClySt/T6vxxgSl0HFm5YwIloUP2gCKjjwTup rtLMTz6wAQe+dK19rfYxu9uzxHdzbQl1iDiaxjWdFlRraD01LSkiie3/H2f/4o8n9MJM NNY0RsB4IAqGmnLX8NgOIOTDIh/QLGxYu/fo1BFKVnkjvTDBcbII38yqKnCp1Yp86Gse VErvYdg8RUi24iGJx+I7ZoSYdNIUyBbQqY1Q1VwuKd5VbQPB0wSFKtHmXqfxhQHYkb7H PdZw== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:user-agent:in-reply-to :content-disposition:mime-version:references:message-id:subject:cc :to:from:date:arc-authentication-results; bh=NxW2ZnCJKYBl+13KoZ6qxjmpjAsmBFvlDdcHPs6QbTg=; b=UrLEdqSDZsa4YJeU1SE7ktdIGfhTTN8z4UvgMu0b2zc0cO6h4qMhhhk7LeepN8iuz8 3rsOXWe6I7Cnf2EorNEwCglMkE9Qn3co81eW1nk/YVv8LXJOE+HnWfpFiBIOxhtAVYr9 4fRzEhHR/HF7vext95cpvKKEoQ9Eci0C8wxwbaysaqSTdHRvtfneQTmPufxKXVePjHPd YPq6mr4Va3v8wYJOm++FIjvRz7orZ+6bz2fuSMtATloUwZwMu3uLEHS/ei9XYzKNmEWs nZ18caFBR9sQL1zIL+usOuN2lzISoWJ7iN1Y4lGpHglRpmd1EUQYF0BtHpyhugBiDNSJ +hgw== ARC-Authentication-Results: i=1; mx.google.com; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id u7-v6si6194276plz.562.2018.03.16.04.23.18; Fri, 16 Mar 2018 04:23:32 -0700 (PDT) Received-SPF: pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) client-ip=209.132.180.67; Authentication-Results: mx.google.com; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1753835AbeCPLW1 (ORCPT + 99 others); Fri, 16 Mar 2018 07:22:27 -0400 Received: from usa-sjc-mx-foss1.foss.arm.com ([217.140.101.70]:54532 "EHLO foss.arm.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1753536AbeCPLWZ (ORCPT ); Fri, 16 Mar 2018 07:22:25 -0400 Received: from usa-sjc-imap-foss1.foss.arm.com (unknown [10.72.51.249]) by usa-sjc-mx-foss1.foss.arm.com (Postfix) with ESMTP id 022751529; Fri, 16 Mar 2018 04:22:25 -0700 (PDT) Received: from e107981-ln.cambridge.arm.com (e107981-ln.cambridge.arm.com [10.1.207.54]) by usa-sjc-imap-foss1.foss.arm.com (Postfix) with ESMTPSA id 0D9D83F25D; Fri, 16 Mar 2018 04:22:21 -0700 (PDT) Date: Fri, 16 Mar 2018 11:22:16 +0000 From: Lorenzo Pieralisi To: Honghui Zhang Cc: Marc Zyngier , bhelgaas@google.com, matthias.bgg@gmail.com, linux-arm-kernel@lists.infradead.org, linux-mediatek@lists.infradead.org, linux-pci@vger.kernel.org, linux-kernel@vger.kernel.org, devicetree@vger.kernel.org, yingjoe.chen@mediatek.com, eddie.huang@mediatek.com, ryder.lee@mediatek.com, hongkun.cao@mediatek.com, youlin.pei@mediatek.com, yong.wu@mediatek.com, yt.shen@mediatek.com, sean.wang@mediatek.com, xinping.qian@mediatek.com Subject: Re: [PATCH v5 1/2] PCI: mediatek: Clear IRQ status after IRQ dispatched to avoid reentry Message-ID: <20180316112216.GA24325@e107981-ln.cambridge.arm.com> References: <1514336394-17747-1-git-send-email-honghui.zhang@mediatek.com> <1514336394-17747-2-git-send-email-honghui.zhang@mediatek.com> <20180104184040.GE12239@red-moon> <88c84a3e-17ea-08f2-e5fc-4799b41de267@arm.com> <1515153107.25872.57.camel@mhfsdcap03> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1515153107.25872.57.camel@mhfsdcap03> User-Agent: Mutt/1.5.24 (2015-08-30) Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org On Fri, Jan 05, 2018 at 07:51:47PM +0800, Honghui Zhang wrote: > On Thu, 2018-01-04 at 19:04 +0000, Marc Zyngier wrote: > > On 04/01/18 18:40, Lorenzo Pieralisi wrote: > > > [+Marc] > > > > > > On Wed, Dec 27, 2017 at 08:59:53AM +0800, honghui.zhang@mediatek.com wrote: > > >> From: Honghui Zhang > > >> > > >> There maybe a same IRQ reentry scenario after IRQ received in current > > >> IRQ handle flow: > > >> EP device PCIe host driver EP driver > > >> 1. issue an IRQ > > >> 2. received IRQ > > >> 3. clear IRQ status > > >> 4. dispatch IRQ > > >> 5. clear IRQ source > > >> The IRQ status was not successfully cleared at step 2 since the IRQ > > >> source was not cleared yet. So the PCIe host driver may receive the > > >> same IRQ after step 5. Then there's an IRQ reentry occurred. > > >> Even worse, if the reentry IRQ was not an IRQ that EP driver expected, > > >> it may not handle the IRQ. Then we may run into the infinite loop from > > >> step 2 to step 4. > > >> Clear the IRQ status after IRQ have been dispatched to avoid the IRQ > > >> reentry. > > >> This patch also fix another INTx IRQ issue by initialize the iterate > > >> before the loop. If an INTx IRQ re-occurred while we are dispatching > > >> the INTx IRQ, then iterate may start from PCI_NUM_INTX + INTX_SHIFT > > >> instead of INTX_SHIFT for the second time entering the > > >> for_each_set_bit_from() loop. > > > > > > This looks like two different issues that should be fixed with two > > > patches. > > Ok, I split this into two patches and figure out a more reasonable > approach by using irq_chip solution. For the time being, I will mark this patch as "Changes Requested" waiting for a new version. Thanks, Lorenzo > > > > > > >> Signed-off-by: Honghui Zhang > > >> Acked-by: Ryder Lee > > >> --- > > >> drivers/pci/host/pcie-mediatek.c | 11 ++++++----- > > >> 1 file changed, 6 insertions(+), 5 deletions(-) > > > > > > For the sake of uniformity, I first want to understand why this > > > driver does not call: > > > > > > chained_irq_enter/exit() > > > > > > in the primary handler (mtk_pcie_intr_handler()). > > > > > > With the GIC as a primary interrupt controller we have not > > > even figured out how current code can actually work without > > > calling the chained_* API. > > > > > > I want to come up with a consistent handling of IRQ domains for > > > all host bridges and any discrepancy should be explained. > > > > That's because this driver is a huge hack, see below: > > > > > > > >> diff --git a/drivers/pci/host/pcie-mediatek.c b/drivers/pci/host/pcie-mediatek.c > > >> index db93efd..fc29a9a 100644 > > >> --- a/drivers/pci/host/pcie-mediatek.c > > >> +++ b/drivers/pci/host/pcie-mediatek.c > > >> @@ -601,15 +601,16 @@ static irqreturn_t mtk_pcie_intr_handler(int irq, void *data) > > > > This function is not a chained irqchip, but an interrupt handler... > > > > >> struct mtk_pcie_port *port = (struct mtk_pcie_port *)data; > > >> unsigned long status; > > >> u32 virq; > > >> - u32 bit = INTX_SHIFT; > > >> + u32 bit; > > >> > > >> while ((status = readl(port->base + PCIE_INT_STATUS)) & INTX_MASK) { > > >> + bit = INTX_SHIFT; > > >> for_each_set_bit_from(bit, &status, PCI_NUM_INTX + INTX_SHIFT) { > > >> - /* Clear the INTx */ > > >> - writel(1 << bit, port->base + PCIE_INT_STATUS); > > >> virq = irq_find_mapping(port->irq_domain, > > >> bit - INTX_SHIFT); > > >> generic_handle_irq(virq); > > > > and nonetheless, this calls into generic_handle_irq(). That's a complete > > violation of the interrupt layering. Maybe there is a good reason for > > it, but I'd like to know which one. > > > > Which means that all of the ack/mask has to be done outside of the > > irqchip framework too... Disgusting. > > > > >> + /* Clear the INTx */ > > >> + writel(1 << bit, port->base + PCIE_INT_STATUS); > > > > > > I think that these masking/acking should actually be done through > > > the irq_chip hooks (see for instance pci-ftpci100.c) - that would > > > make this kind of bugs much easier to prevent (because the IRQ > > > layer does the sequencing for you). > > > > +1. > > > > Thanks for your advice, I need to do some homework to have a better > understanding of the irq_chip approach. > > > > Marc (CC'ed) has a more comprehensive view on this than me - I would > > > like to get to a point where all host bridges uses a consistent > > > approach for chained IRQ handling and I hope this bug fix can be > > > a starting point. > > > > +1 again. We definitely need to come up with some form of common > > approach for all these host drivers, and maybe turn that into a library... > > > > Well, this is beyond my knowledge now, I guess I can figure out how to > using irq_chip for the first step, then I may following this "common > approach" after we have a solution for that? > > thanks. > > Thanks, > > > > M. > >