All of lore.kernel.org
 help / color / mirror / Atom feed
From: Bjorn Helgaas <helgaas@kernel.org>
To: Marek Vasut <marek.vasut+renesas@gmail.com>,
	Yoshihiro Shimoda <yoshihiro.shimoda.uh@renesas.com>
Cc: "Liang He" <windhl@126.com>,
	"Geert Uytterhoeven" <geert+renesas@glider.be>,
	"Lorenzo Pieralisi" <lpieralisi@kernel.org>,
	"Rob Herring" <robh@kernel.org>,
	"Krzysztof Wilczyński" <kw@linux.com>,
	linux-pci@vger.kernel.org, linux-renesas-soc@vger.kernel.org,
	linux-kernel@vger.kernel.org,
	"Bjorn Helgaas" <bhelgaas@google.com>,
	"Geert Uytterhoeven" <geert@linux-m68k.org>
Subject: [PATCH 2/2] PCI: rcar: Resolve of_find_matching_node() reference leak
Date: Tue, 21 Jun 2022 21:57:32 -0500	[thread overview]
Message-ID: <20220622025732.1359389-3-helgaas@kernel.org> (raw)
In-Reply-To: <20220622025732.1359389-1-helgaas@kernel.org>

From: Bjorn Helgaas <bhelgaas@google.com>

Previously, rcar_pcie_init() used of_find_matching_node() to search the
entire device tree for compatible strings for which we need to install an
abort handler.  If we found one, we got a device_node with refcount
incremented, but we discarded the pointer and never released that
reference.

Extend the struct rcar_variant to indicate whether each variant requires an
abort handler.  Install the handler in rcar_pcie_probe() when needed.

Signed-off-by: Bjorn Helgaas <bhelgaas@google.com>
Cc: Liang He <windhl@126.com>
Cc: Geert Uytterhoeven <geert@linux-m68k.org>
---
 drivers/pci/controller/pcie-rcar-host.c | 60 +++++++++++--------------
 1 file changed, 27 insertions(+), 33 deletions(-)

diff --git a/drivers/pci/controller/pcie-rcar-host.c b/drivers/pci/controller/pcie-rcar-host.c
index ccf13aafa1e5..139a0274b9e0 100644
--- a/drivers/pci/controller/pcie-rcar-host.c
+++ b/drivers/pci/controller/pcie-rcar-host.c
@@ -60,6 +60,7 @@ struct rcar_pcie_host;
 
 struct rcar_variant {
 	int	(*phy_init_fn)(struct rcar_pcie_host *host);
+	bool	hook_aborts;
 };
 
 /* Structure representing the PCIe interface */
@@ -964,12 +965,35 @@ static int rcar_pcie_parse_map_dma_ranges(struct rcar_pcie_host *host)
 	return err;
 }
 
+#ifdef CONFIG_ARM
+static int rcar_pcie_aarch32_abort_handler(unsigned long addr,
+		unsigned int fsr, struct pt_regs *regs)
+{
+	return !fixup_exception(regs);
+}
+#endif
+
+static void rcar_pcie_hook_aborts(void)
+{
+#ifdef CONFIG_ARM
+#ifdef CONFIG_ARM_LPAE
+	hook_fault_code(17, rcar_pcie_aarch32_abort_handler, SIGBUS, 0,
+			"asynchronous external abort");
+#else
+	hook_fault_code(22, rcar_pcie_aarch32_abort_handler, SIGBUS, 0,
+			"imprecise external abort");
+#endif
+#endif
+}
+
 static const struct rcar_variant rcar_h1_data = {
 	.phy_init_fn = rcar_pcie_phy_init_h1,
+	.hook_aborts = true,
 };
 
 static const struct rcar_variant rcar_gen2_data = {
 	.phy_init_fn = rcar_pcie_phy_init_gen2,
+	.hook_aborts = true,
 };
 
 static const struct rcar_variant rcar_gen3_data = {
@@ -1035,6 +1059,9 @@ static int rcar_pcie_probe(struct platform_device *pdev)
 		goto err_clk_disable;
 	}
 
+	if (host->variant->hook_aborts)
+		rcar_pcie_hook_aborts();
+
 	/* Failure to get a link might just be that no cards are inserted */
 	if (rcar_pcie_hw_init(pcie)) {
 		dev_info(dev, "PCIe link down\n");
@@ -1153,37 +1180,4 @@ static struct platform_driver rcar_pcie_driver = {
 	},
 	.probe = rcar_pcie_probe,
 };
-
-#ifdef CONFIG_ARM
-static int rcar_pcie_aarch32_abort_handler(unsigned long addr,
-		unsigned int fsr, struct pt_regs *regs)
-{
-	return !fixup_exception(regs);
-}
-
-static const struct of_device_id rcar_pcie_abort_handler_of_match[] __initconst = {
-	{ .compatible = "renesas,pcie-r8a7779" },
-	{ .compatible = "renesas,pcie-r8a7790" },
-	{ .compatible = "renesas,pcie-r8a7791" },
-	{ .compatible = "renesas,pcie-rcar-gen2" },
-	{},
-};
-
-static int __init rcar_pcie_init(void)
-{
-	if (of_find_matching_node(NULL, rcar_pcie_abort_handler_of_match)) {
-#ifdef CONFIG_ARM_LPAE
-		hook_fault_code(17, rcar_pcie_aarch32_abort_handler, SIGBUS, 0,
-				"asynchronous external abort");
-#else
-		hook_fault_code(22, rcar_pcie_aarch32_abort_handler, SIGBUS, 0,
-				"imprecise external abort");
-#endif
-	}
-
-	return platform_driver_register(&rcar_pcie_driver);
-}
-device_initcall(rcar_pcie_init);
-#else
 builtin_platform_driver(rcar_pcie_driver);
-#endif
-- 
2.25.1


  parent reply	other threads:[~2022-06-22  2:58 UTC|newest]

Thread overview: 5+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2022-06-22  2:57 [PATCH 0/2] PCI: rcar: Fix of_find_matching_node() reference leak Bjorn Helgaas
2022-06-22  2:57 ` [PATCH 1/2] PCI: rcar: Add dev struct for of_device_get_match_data() Bjorn Helgaas
2022-06-22  2:57 ` Bjorn Helgaas [this message]
2022-06-22  7:45   ` [PATCH 2/2] PCI: rcar: Resolve of_find_matching_node() reference leak Geert Uytterhoeven
2022-06-22 11:05     ` Bjorn Helgaas

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=20220622025732.1359389-3-helgaas@kernel.org \
    --to=helgaas@kernel.org \
    --cc=bhelgaas@google.com \
    --cc=geert+renesas@glider.be \
    --cc=geert@linux-m68k.org \
    --cc=kw@linux.com \
    --cc=linux-kernel@vger.kernel.org \
    --cc=linux-pci@vger.kernel.org \
    --cc=linux-renesas-soc@vger.kernel.org \
    --cc=lpieralisi@kernel.org \
    --cc=marek.vasut+renesas@gmail.com \
    --cc=robh@kernel.org \
    --cc=windhl@126.com \
    --cc=yoshihiro.shimoda.uh@renesas.com \
    /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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.