diff mbox series

[1/4] PCI: exynos: Don't put .remove callback in .exit.text section

Message ID 20231001170254.2506508-2-u.kleine-koenig@pengutronix.de (mailing list archive)
State Accepted
Commit 83a939f0fdc208ff3639dd3d42ac9b3c35607fd2
Headers show
Series pci: Fix some section mismatches | expand

Commit Message

Uwe Kleine-König Oct. 1, 2023, 5:02 p.m. UTC
With CONFIG_PCI_EXYNOS=y and exynos_pcie_remove() marked with __exit,
the function is discarded from the driver. In this case a bound device
can still get unbound, e.g via sysfs. Then no cleanup code is run
resulting in resource leaks or worse.

The right thing to do is do always have the remove callback available.
This fixes the following warning by modpost:

	WARNING: modpost: drivers/pci/controller/dwc/pci-exynos: section mismatch in reference: exynos_pcie_driver+0x8 (section: .data) -> exynos_pcie_remove (section: .exit.text)

(with ARCH=x86_64 W=1 allmodconfig).

Fixes: 340cba6092c2 ("pci: Add PCIe driver for Samsung Exynos")
Signed-off-by: Uwe Kleine-König <u.kleine-koenig@pengutronix.de>
---
 drivers/pci/controller/dwc/pci-exynos.c | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

Comments

Alim Akhtar Oct. 2, 2023, 1:38 a.m. UTC | #1
> -----Original Message-----
> From: Uwe Kleine-König <u.kleine-koenig@pengutronix.de>
> Sent: Sunday, October 1, 2023 10:33 PM
> To: Jingoo Han <jingoohan1@gmail.com>; Lorenzo Pieralisi
> <lpieralisi@kernel.org>; Krzysztof Wilczyński <kw@linux.com>; Bjorn Helgaas
> <bhelgaas@google.com>; Krzysztof Kozlowski
> <krzysztof.kozlowski@linaro.org>; Kukjin Kim <kgene.kim@samsung.com>; Siva
> Reddy Kallam <siva.kallam@samsung.com>; Surendranath Gurivireddy Balla
> <suren.reddy@samsung.com>
> Cc: Rob Herring <robh@kernel.org>; Alim Akhtar <alim.akhtar@samsung.com>;
> linux-pci@vger.kernel.org; linux-arm-kernel@lists.infradead.org; linux-samsung-
> soc@vger.kernel.org; kernel@pengutronix.de
> Subject: [PATCH 1/4] PCI: exynos: Don't put .remove callback in .exit.text
> section
> 
> With CONFIG_PCI_EXYNOS=y and exynos_pcie_remove() marked with __exit,
> the function is discarded from the driver. In this case a bound device can still get
> unbound, e.g via sysfs. Then no cleanup code is run resulting in resource leaks or
> worse.
> 
> The right thing to do is do always have the remove callback available.
> This fixes the following warning by modpost:
> 
> 	WARNING: modpost: drivers/pci/controller/dwc/pci-exynos: section
> mismatch in reference: exynos_pcie_driver+0x8 (section: .data) ->
> exynos_pcie_remove (section: .exit.text)
> 
> (with ARCH=x86_64 W=1 allmodconfig).
> 
> Fixes: 340cba6092c2 ("pci: Add PCIe driver for Samsung Exynos")
> Signed-off-by: Uwe Kleine-König <u.kleine-koenig@pengutronix.de>
> ---
Thanks!

Reviewed-by: Alim Akhtar <alim.akhtar@samsung.com>

>  drivers/pci/controller/dwc/pci-exynos.c | 4 ++--
>  1 file changed, 2 insertions(+), 2 deletions(-)
> 
> diff --git a/drivers/pci/controller/dwc/pci-exynos.c
> b/drivers/pci/controller/dwc/pci-exynos.c
> index 6319082301d6..c6bede346932 100644
> --- a/drivers/pci/controller/dwc/pci-exynos.c
> +++ b/drivers/pci/controller/dwc/pci-exynos.c
> @@ -375,7 +375,7 @@ static int exynos_pcie_probe(struct platform_device
> *pdev)
>  	return ret;
>  }
> 
> -static int __exit exynos_pcie_remove(struct platform_device *pdev)
> +static int exynos_pcie_remove(struct platform_device *pdev)
>  {
>  	struct exynos_pcie *ep = platform_get_drvdata(pdev);
> 
> @@ -431,7 +431,7 @@ static const struct of_device_id
> exynos_pcie_of_match[] = {
> 
>  static struct platform_driver exynos_pcie_driver = {
>  	.probe		= exynos_pcie_probe,
> -	.remove		= __exit_p(exynos_pcie_remove),
> +	.remove		= exynos_pcie_remove,
>  	.driver = {
>  		.name	= "exynos-pcie",
>  		.of_match_table = exynos_pcie_of_match,
> --
> 2.40.1
diff mbox series

Patch

diff --git a/drivers/pci/controller/dwc/pci-exynos.c b/drivers/pci/controller/dwc/pci-exynos.c
index 6319082301d6..c6bede346932 100644
--- a/drivers/pci/controller/dwc/pci-exynos.c
+++ b/drivers/pci/controller/dwc/pci-exynos.c
@@ -375,7 +375,7 @@  static int exynos_pcie_probe(struct platform_device *pdev)
 	return ret;
 }
 
-static int __exit exynos_pcie_remove(struct platform_device *pdev)
+static int exynos_pcie_remove(struct platform_device *pdev)
 {
 	struct exynos_pcie *ep = platform_get_drvdata(pdev);
 
@@ -431,7 +431,7 @@  static const struct of_device_id exynos_pcie_of_match[] = {
 
 static struct platform_driver exynos_pcie_driver = {
 	.probe		= exynos_pcie_probe,
-	.remove		= __exit_p(exynos_pcie_remove),
+	.remove		= exynos_pcie_remove,
 	.driver = {
 		.name	= "exynos-pcie",
 		.of_match_table = exynos_pcie_of_match,