[PATCH next v2 1/2] mmc: sunplus: Fix error handling in spmmc_drv_probe()

Subsystems: multimedia card (mmc), secure digital (sd) and sdio subsystem, sunplus mmc driver, the rest

STALE1156d LANDED

Landed in mainline as cf3f15b8c660 on 2023-08-09.

8 messages, 3 authors, 2023-08-09 · open the first message on its own page

[PATCH next v2 1/2] mmc: sunplus: Fix error handling in spmmc_drv_probe()

From: Harshit Mogalapalli <hidden>
Date: 2023-08-09 07:18:57

When mmc allocation succeeds, the error paths are not freeing mmc.

Fix the above issue by changing mmc_alloc_host() to devm_mmc_alloc_host()
to simplify the error handling. Remove label 'probe_free_host' as devm_*
api takes care of freeing, also remove mmc_free_host() from remove
function as devm_* takes care of freeing.

Fixes: 4e268fed8b18 ("mmc: Add mmc driver for Sunplus SP7021")
Reported-by: Dan Carpenter <redacted>
Closes: https://lore.kernel.org/all/a3829ed3-d827-4b9d-827e-9cc24a3ec3bc@moroto.mountain/
Signed-off-by: Harshit Mogalapalli <redacted>
---
This is based on static analysis with smatch, only compile tested.

v1->v2: Simplify code by using devm_mmc_alloc_host() instead of
mmc_alloc_host() (Ulf Hansson's suggestion)
---
 drivers/mmc/host/sunplus-mmc.c | 14 +++-----------
 1 file changed, 3 insertions(+), 11 deletions(-)
diff --git a/drivers/mmc/host/sunplus-mmc.c b/drivers/mmc/host/sunplus-mmc.c
index a55a87f64d2a..2bdebeb1f8e4 100644
--- a/drivers/mmc/host/sunplus-mmc.c
+++ b/drivers/mmc/host/sunplus-mmc.c
@@ -863,11 +863,9 @@ static int spmmc_drv_probe(struct platform_device *pdev)
 	struct spmmc_host *host;
 	int ret = 0;
 
-	mmc = mmc_alloc_host(sizeof(*host), &pdev->dev);
-	if (!mmc) {
-		ret = -ENOMEM;
-		goto probe_free_host;
-	}
+	mmc = devm_mmc_alloc_host(&pdev->dev, sizeof(struct spmmc_host));
+	if (!mmc)
+		return -ENOMEM;
 
 	host = mmc_priv(mmc);
 	host->mmc = mmc;
@@ -938,11 +936,6 @@ static int spmmc_drv_probe(struct platform_device *pdev)
 
 clk_disable:
 	clk_disable_unprepare(host->clk);
-
-probe_free_host:
-	if (mmc)
-		mmc_free_host(mmc);
-
 	return ret;
 }
 
@@ -956,7 +949,6 @@ static int spmmc_drv_remove(struct platform_device *dev)
 	pm_runtime_put_noidle(&dev->dev);
 	pm_runtime_disable(&dev->dev);
 	platform_set_drvdata(dev, NULL);
-	mmc_free_host(host->mmc);
 
 	return 0;
 }
-- 
2.39.3

[PATCH next v2 2/2] mmc: sunplus: Fix platform_get_irq() error checking

From: Harshit Mogalapalli <hidden>
Date: 2023-08-09 07:19:07

The platform_get_irq() function returns negative error codes on failure.

Fixes: 4e268fed8b18 ("mmc: Add mmc driver for Sunplus SP7021")
Reported-by: Dan Carpenter <redacted>
Closes: https://lore.kernel.org/all/a3829ed3-d827-4b9d-827e-9cc24a3ec3bc@moroto.mountain/
Signed-off-by: Harshit Mogalapalli <redacted>
---
v1->v2: Split into two patches as they are doing different things.

This is based on static analysis with smatch, only compile tested.
---
 drivers/mmc/host/sunplus-mmc.c | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/drivers/mmc/host/sunplus-mmc.c b/drivers/mmc/host/sunplus-mmc.c
index 2bdebeb1f8e4..e9cb1a57cb75 100644
--- a/drivers/mmc/host/sunplus-mmc.c
+++ b/drivers/mmc/host/sunplus-mmc.c
@@ -885,7 +885,7 @@ static int spmmc_drv_probe(struct platform_device *pdev)
 		return dev_err_probe(&pdev->dev, PTR_ERR(host->rstc), "rst get fail\n");
 
 	host->irq = platform_get_irq(pdev, 0);
-	if (host->irq <= 0)
+	if (host->irq < 0)
 		return host->irq;
 
 	ret = devm_request_threaded_irq(&pdev->dev, host->irq,
-- 
2.39.3

Re: [PATCH next v2 1/2] mmc: sunplus: Fix error handling in spmmc_drv_probe()

From: Dan Carpenter <hidden>
Date: 2023-08-09 07:40:40

On Wed, Aug 09, 2023 at 12:18:11AM -0700, Harshit Mogalapalli wrote:
When mmc allocation succeeds, the error paths are not freeing mmc.

Fix the above issue by changing mmc_alloc_host() to devm_mmc_alloc_host()
to simplify the error handling. Remove label 'probe_free_host' as devm_*
api takes care of freeing, also remove mmc_free_host() from remove
function as devm_* takes care of freeing.

Fixes: 4e268fed8b18 ("mmc: Add mmc driver for Sunplus SP7021")
Reported-by: Dan Carpenter <redacted>
Closes: https://lore.kernel.org/all/a3829ed3-d827-4b9d-827e-9cc24a3ec3bc@moroto.mountain/
Signed-off-by: Harshit Mogalapalli <redacted>
---
This is based on static analysis with smatch, only compile tested.

v1->v2: Simplify code by using devm_mmc_alloc_host() instead of
mmc_alloc_host() (Ulf Hansson's suggestion)
Nice.

Both patches look good to me.
Reviewed-by: Dan Carpenter <redacted>

regards,
dan carpenter

Re: [PATCH next v2 1/2] mmc: sunplus: Fix error handling in spmmc_drv_probe()

From: Ulf Hansson <hidden>
Date: 2023-08-09 11:08:40

On Wed, 9 Aug 2023 at 09:18, Harshit Mogalapalli
[off-list ref] wrote:
When mmc allocation succeeds, the error paths are not freeing mmc.

Fix the above issue by changing mmc_alloc_host() to devm_mmc_alloc_host()
to simplify the error handling. Remove label 'probe_free_host' as devm_*
api takes care of freeing, also remove mmc_free_host() from remove
function as devm_* takes care of freeing.

Fixes: 4e268fed8b18 ("mmc: Add mmc driver for Sunplus SP7021")
Reported-by: Dan Carpenter <redacted>
Closes: https://lore.kernel.org/all/a3829ed3-d827-4b9d-827e-9cc24a3ec3bc@moroto.mountain/
Signed-off-by: Harshit Mogalapalli <redacted>
This doesn't apply on my next branch, please rebase it.

Moreover, it looks like you should replace a few more "goto
probe_free_host;" with "return ret;". Please have a closer look.

Kind regards
Uffe
quoted hunk
---
This is based on static analysis with smatch, only compile tested.

v1->v2: Simplify code by using devm_mmc_alloc_host() instead of
mmc_alloc_host() (Ulf Hansson's suggestion)
---
 drivers/mmc/host/sunplus-mmc.c | 14 +++-----------
 1 file changed, 3 insertions(+), 11 deletions(-)
diff --git a/drivers/mmc/host/sunplus-mmc.c b/drivers/mmc/host/sunplus-mmc.c
index a55a87f64d2a..2bdebeb1f8e4 100644
--- a/drivers/mmc/host/sunplus-mmc.c
+++ b/drivers/mmc/host/sunplus-mmc.c
@@ -863,11 +863,9 @@ static int spmmc_drv_probe(struct platform_device *pdev)
        struct spmmc_host *host;
        int ret = 0;

-       mmc = mmc_alloc_host(sizeof(*host), &pdev->dev);
-       if (!mmc) {
-               ret = -ENOMEM;
-               goto probe_free_host;
-       }
+       mmc = devm_mmc_alloc_host(&pdev->dev, sizeof(struct spmmc_host));
+       if (!mmc)
+               return -ENOMEM;

        host = mmc_priv(mmc);
        host->mmc = mmc;
@@ -938,11 +936,6 @@ static int spmmc_drv_probe(struct platform_device *pdev)

 clk_disable:
        clk_disable_unprepare(host->clk);
-
-probe_free_host:
-       if (mmc)
-               mmc_free_host(mmc);
-
        return ret;
 }
@@ -956,7 +949,6 @@ static int spmmc_drv_remove(struct platform_device *dev)
        pm_runtime_put_noidle(&dev->dev);
        pm_runtime_disable(&dev->dev);
        platform_set_drvdata(dev, NULL);
-       mmc_free_host(host->mmc);

        return 0;
 }
--
2.39.3

Re: [PATCH next v2 1/2] mmc: sunplus: Fix error handling in spmmc_drv_probe()

From: Ulf Hansson <hidden>
Date: 2023-08-09 11:18:21

On Wed, 9 Aug 2023 at 13:08, Ulf Hansson [off-list ref] wrote:
On Wed, 9 Aug 2023 at 09:18, Harshit Mogalapalli
[off-list ref] wrote:
quoted
When mmc allocation succeeds, the error paths are not freeing mmc.

Fix the above issue by changing mmc_alloc_host() to devm_mmc_alloc_host()
to simplify the error handling. Remove label 'probe_free_host' as devm_*
api takes care of freeing, also remove mmc_free_host() from remove
function as devm_* takes care of freeing.

Fixes: 4e268fed8b18 ("mmc: Add mmc driver for Sunplus SP7021")
Reported-by: Dan Carpenter <redacted>
Closes: https://lore.kernel.org/all/a3829ed3-d827-4b9d-827e-9cc24a3ec3bc@moroto.mountain/
Signed-off-by: Harshit Mogalapalli <redacted>
This doesn't apply on my next branch, please rebase it.

Moreover, it looks like you should replace a few more "goto
probe_free_host;" with "return ret;". Please have a closer look.
Oh, my bad, please ignore the above!

I had another fix for the sunplus driver queued on my next branch. I
have moved that patch to fixes and applied your patch on top, thanks!

Kind regards
Uffe
quoted
---
This is based on static analysis with smatch, only compile tested.

v1->v2: Simplify code by using devm_mmc_alloc_host() instead of
mmc_alloc_host() (Ulf Hansson's suggestion)
---
 drivers/mmc/host/sunplus-mmc.c | 14 +++-----------
 1 file changed, 3 insertions(+), 11 deletions(-)
diff --git a/drivers/mmc/host/sunplus-mmc.c b/drivers/mmc/host/sunplus-mmc.c
index a55a87f64d2a..2bdebeb1f8e4 100644
--- a/drivers/mmc/host/sunplus-mmc.c
+++ b/drivers/mmc/host/sunplus-mmc.c
@@ -863,11 +863,9 @@ static int spmmc_drv_probe(struct platform_device *pdev)
        struct spmmc_host *host;
        int ret = 0;

-       mmc = mmc_alloc_host(sizeof(*host), &pdev->dev);
-       if (!mmc) {
-               ret = -ENOMEM;
-               goto probe_free_host;
-       }
+       mmc = devm_mmc_alloc_host(&pdev->dev, sizeof(struct spmmc_host));
+       if (!mmc)
+               return -ENOMEM;

        host = mmc_priv(mmc);
        host->mmc = mmc;
@@ -938,11 +936,6 @@ static int spmmc_drv_probe(struct platform_device *pdev)

 clk_disable:
        clk_disable_unprepare(host->clk);
-
-probe_free_host:
-       if (mmc)
-               mmc_free_host(mmc);
-
        return ret;
 }
@@ -956,7 +949,6 @@ static int spmmc_drv_remove(struct platform_device *dev)
        pm_runtime_put_noidle(&dev->dev);
        pm_runtime_disable(&dev->dev);
        platform_set_drvdata(dev, NULL);
-       mmc_free_host(host->mmc);

        return 0;
 }
--
2.39.3

Re: [PATCH next v2 2/2] mmc: sunplus: Fix platform_get_irq() error checking

From: Ulf Hansson <hidden>
Date: 2023-08-09 11:34:30

On Wed, 9 Aug 2023 at 09:19, Harshit Mogalapalli
[off-list ref] wrote:
The platform_get_irq() function returns negative error codes on failure.

Fixes: 4e268fed8b18 ("mmc: Add mmc driver for Sunplus SP7021")
Reported-by: Dan Carpenter <redacted>
Closes: https://lore.kernel.org/all/a3829ed3-d827-4b9d-827e-9cc24a3ec3bc@moroto.mountain/
Signed-off-by: Harshit Mogalapalli <redacted>
Applied for fixes and by adding a stable tag, thanks!

Kind regards
Uffe

quoted hunk
---
v1->v2: Split into two patches as they are doing different things.

This is based on static analysis with smatch, only compile tested.
---
 drivers/mmc/host/sunplus-mmc.c | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/drivers/mmc/host/sunplus-mmc.c b/drivers/mmc/host/sunplus-mmc.c
index 2bdebeb1f8e4..e9cb1a57cb75 100644
--- a/drivers/mmc/host/sunplus-mmc.c
+++ b/drivers/mmc/host/sunplus-mmc.c
@@ -885,7 +885,7 @@ static int spmmc_drv_probe(struct platform_device *pdev)
                return dev_err_probe(&pdev->dev, PTR_ERR(host->rstc), "rst get fail\n");

        host->irq = platform_get_irq(pdev, 0);
-       if (host->irq <= 0)
+       if (host->irq < 0)
                return host->irq;

        ret = devm_request_threaded_irq(&pdev->dev, host->irq,
--
2.39.3

Re: [PATCH next v2 2/2] mmc: sunplus: Fix platform_get_irq() error checking

From: Dan Carpenter <hidden>
Date: 2023-08-09 11:51:45

On Wed, Aug 09, 2023 at 01:33:51PM +0200, Ulf Hansson wrote:
On Wed, 9 Aug 2023 at 09:19, Harshit Mogalapalli
[off-list ref] wrote:
quoted
The platform_get_irq() function returns negative error codes on failure.

Fixes: 4e268fed8b18 ("mmc: Add mmc driver for Sunplus SP7021")
Reported-by: Dan Carpenter <redacted>
Closes: https://lore.kernel.org/all/a3829ed3-d827-4b9d-827e-9cc24a3ec3bc@moroto.mountain/
Signed-off-by: Harshit Mogalapalli <redacted>
Applied for fixes and by adding a stable tag, thanks!
It's not really a fix.  The platform_get_irq() function can't actually
return zero.

I asked Arnd about this and he said that there were some arches where
zero was a valid IRQ but they're not in the upstream kernel any more and
we're hopefully not going to do that again.

regards,
dan carpenter

Re: [PATCH next v2 2/2] mmc: sunplus: Fix platform_get_irq() error checking

From: Ulf Hansson <hidden>
Date: 2023-08-09 13:42:37

On Wed, 9 Aug 2023 at 13:51, Dan Carpenter [off-list ref] wrote:
On Wed, Aug 09, 2023 at 01:33:51PM +0200, Ulf Hansson wrote:
quoted
On Wed, 9 Aug 2023 at 09:19, Harshit Mogalapalli
[off-list ref] wrote:
quoted
The platform_get_irq() function returns negative error codes on failure.

Fixes: 4e268fed8b18 ("mmc: Add mmc driver for Sunplus SP7021")
Reported-by: Dan Carpenter <redacted>
Closes: https://lore.kernel.org/all/a3829ed3-d827-4b9d-827e-9cc24a3ec3bc@moroto.mountain/
Signed-off-by: Harshit Mogalapalli <redacted>
Applied for fixes and by adding a stable tag, thanks!
It's not really a fix.  The platform_get_irq() function can't actually
return zero.

I asked Arnd about this and he said that there were some arches where
zero was a valid IRQ but they're not in the upstream kernel any more and
we're hopefully not going to do that again.
Alright, I moved this to the next branch and dropped the fixes and stable tags.

Kind regards
Uffe
Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help