netdev.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* [PATCH net 0/3] net: ethernet: mtk_eth_wed: fixe some leaks
@ 2022-10-17  3:51 Yang Yingliang
  2022-10-17  3:51 ` [PATCH net 1/3] net: ethernet: mtk_eth_soc: fix possible memory leak in mtk_probe() Yang Yingliang
                   ` (3 more replies)
  0 siblings, 4 replies; 8+ messages in thread
From: Yang Yingliang @ 2022-10-17  3:51 UTC (permalink / raw)
  To: linux-mediatek, netdev; +Cc: nbd, davem

I found some leaks in mtk_eth_soc.c/mtk_wed.c.

 patch#1 - I found mtk_wed_exit() is never called, I think mtk_wed_exit() need
           be called in error path or module remove function to free the memory
           allocated in mtk_wed_add_hw().

 patch#2 - The device is not put in error path in mtk_wed_add_hw().

 patch#3 - The device_node pointer returned by of_parse_phandle() with refcount
           incremented, it should be decreased when it done.

This patchset was just compiled tested because I don't have any HW on which to do
the actual tests.

Yang Yingliang (3):
  net: ethernet: mtk_eth_soc: fix possible memory leak in mtk_probe()
  net: ethernet: mtk_eth_wed: add missing put_device() in
    mtk_wed_add_hw()
  net: ethernet: mtk_eth_wed: add missing of_node_put()

 drivers/net/ethernet/mediatek/mtk_eth_soc.c | 17 ++++++++++++-----
 drivers/net/ethernet/mediatek/mtk_wed.c     | 15 ++++++++++++---
 2 files changed, 24 insertions(+), 8 deletions(-)

-- 
2.25.1


^ permalink raw reply	[flat|nested] 8+ messages in thread

* [PATCH net 1/3] net: ethernet: mtk_eth_soc: fix possible memory leak in mtk_probe()
  2022-10-17  3:51 [PATCH net 0/3] net: ethernet: mtk_eth_wed: fixe some leaks Yang Yingliang
@ 2022-10-17  3:51 ` Yang Yingliang
  2022-10-17  9:55   ` AngeloGioacchino Del Regno
  2022-10-17  3:51 ` [PATCH net 2/3] net: ethernet: mtk_eth_wed: add missing put_device() in mtk_wed_add_hw() Yang Yingliang
                   ` (2 subsequent siblings)
  3 siblings, 1 reply; 8+ messages in thread
From: Yang Yingliang @ 2022-10-17  3:51 UTC (permalink / raw)
  To: linux-mediatek, netdev; +Cc: nbd, davem

If mtk_wed_add_hw() has been called, mtk_wed_exit() needs be called
in error path or removing module to free the memory allocated in
mtk_wed_add_hw().

Fixes: 804775dfc288 ("net: ethernet: mtk_eth_soc: add support for Wireless Ethernet Dispatch (WED)")
Signed-off-by: Yang Yingliang <yangyingliang@huawei.com>
---
 drivers/net/ethernet/mediatek/mtk_eth_soc.c | 17 ++++++++++++-----
 1 file changed, 12 insertions(+), 5 deletions(-)

diff --git a/drivers/net/ethernet/mediatek/mtk_eth_soc.c b/drivers/net/ethernet/mediatek/mtk_eth_soc.c
index 4fba7cb0144b..7cd381530aa4 100644
--- a/drivers/net/ethernet/mediatek/mtk_eth_soc.c
+++ b/drivers/net/ethernet/mediatek/mtk_eth_soc.c
@@ -4060,19 +4060,23 @@ static int mtk_probe(struct platform_device *pdev)
 			eth->irq[i] = platform_get_irq(pdev, i);
 		if (eth->irq[i] < 0) {
 			dev_err(&pdev->dev, "no IRQ%d resource found\n", i);
-			return -ENXIO;
+			err = -ENXIO;
+			goto err_wed_exit;
 		}
 	}
 	for (i = 0; i < ARRAY_SIZE(eth->clks); i++) {
 		eth->clks[i] = devm_clk_get(eth->dev,
 					    mtk_clks_source_name[i]);
 		if (IS_ERR(eth->clks[i])) {
-			if (PTR_ERR(eth->clks[i]) == -EPROBE_DEFER)
-				return -EPROBE_DEFER;
+			if (PTR_ERR(eth->clks[i]) == -EPROBE_DEFER) {
+				err = -EPROBE_DEFER;
+				goto err_wed_exit;
+			}
 			if (eth->soc->required_clks & BIT(i)) {
 				dev_err(&pdev->dev, "clock %s not found\n",
 					mtk_clks_source_name[i]);
-				return -EINVAL;
+				err = -EINVAL;
+				goto err_wed_exit;
 			}
 			eth->clks[i] = NULL;
 		}
@@ -4083,7 +4087,7 @@ static int mtk_probe(struct platform_device *pdev)
 
 	err = mtk_hw_init(eth);
 	if (err)
-		return err;
+		goto err_wed_exit;
 
 	eth->hwlro = MTK_HAS_CAPS(eth->soc->caps, MTK_HWLRO);
 
@@ -4179,6 +4183,8 @@ static int mtk_probe(struct platform_device *pdev)
 	mtk_free_dev(eth);
 err_deinit_hw:
 	mtk_hw_deinit(eth);
+err_wed_exit:
+	mtk_wed_exit();
 
 	return err;
 }
@@ -4198,6 +4204,7 @@ static int mtk_remove(struct platform_device *pdev)
 		phylink_disconnect_phy(mac->phylink);
 	}
 
+	mtk_wed_exit();
 	mtk_hw_deinit(eth);
 
 	netif_napi_del(&eth->tx_napi);
-- 
2.25.1


^ permalink raw reply related	[flat|nested] 8+ messages in thread

* [PATCH net 2/3] net: ethernet: mtk_eth_wed: add missing put_device() in mtk_wed_add_hw()
  2022-10-17  3:51 [PATCH net 0/3] net: ethernet: mtk_eth_wed: fixe some leaks Yang Yingliang
  2022-10-17  3:51 ` [PATCH net 1/3] net: ethernet: mtk_eth_soc: fix possible memory leak in mtk_probe() Yang Yingliang
@ 2022-10-17  3:51 ` Yang Yingliang
  2022-10-17  9:55   ` AngeloGioacchino Del Regno
  2022-10-17  3:51 ` [PATCH net 3/3] net: ethernet: mtk_eth_wed: add missing of_node_put() Yang Yingliang
  2022-10-17  8:40 ` [PATCH net 0/3] net: ethernet: mtk_eth_wed: fixe some leaks patchwork-bot+netdevbpf
  3 siblings, 1 reply; 8+ messages in thread
From: Yang Yingliang @ 2022-10-17  3:51 UTC (permalink / raw)
  To: linux-mediatek, netdev; +Cc: nbd, davem

After calling get_device() in mtk_wed_add_hw(), in error path, put_device()
needs be called.

Fixes: 804775dfc288 ("net: ethernet: mtk_eth_soc: add support for Wireless Ethernet Dispatch (WED)")
Signed-off-by: Yang Yingliang <yangyingliang@huawei.com>
---
 drivers/net/ethernet/mediatek/mtk_wed.c | 10 ++++++++--
 1 file changed, 8 insertions(+), 2 deletions(-)

diff --git a/drivers/net/ethernet/mediatek/mtk_wed.c b/drivers/net/ethernet/mediatek/mtk_wed.c
index 099b6e0df619..09bbd05bd83c 100644
--- a/drivers/net/ethernet/mediatek/mtk_wed.c
+++ b/drivers/net/ethernet/mediatek/mtk_wed.c
@@ -1077,11 +1077,11 @@ void mtk_wed_add_hw(struct device_node *np, struct mtk_eth *eth,
 	get_device(&pdev->dev);
 	irq = platform_get_irq(pdev, 0);
 	if (irq < 0)
-		return;
+		goto err_put_device;
 
 	regs = syscon_regmap_lookup_by_phandle(np, NULL);
 	if (IS_ERR(regs))
-		return;
+		goto err_put_device;
 
 	rcu_assign_pointer(mtk_soc_wed_ops, &wed_ops);
 
@@ -1124,8 +1124,14 @@ void mtk_wed_add_hw(struct device_node *np, struct mtk_eth *eth,
 
 	hw_list[index] = hw;
 
+	mutex_unlock(&hw_lock);
+
+	return;
+
 unlock:
 	mutex_unlock(&hw_lock);
+err_put_device:
+	put_device(&pdev->dev);
 }
 
 void mtk_wed_exit(void)
-- 
2.25.1


^ permalink raw reply related	[flat|nested] 8+ messages in thread

* [PATCH net 3/3] net: ethernet: mtk_eth_wed: add missing of_node_put()
  2022-10-17  3:51 [PATCH net 0/3] net: ethernet: mtk_eth_wed: fixe some leaks Yang Yingliang
  2022-10-17  3:51 ` [PATCH net 1/3] net: ethernet: mtk_eth_soc: fix possible memory leak in mtk_probe() Yang Yingliang
  2022-10-17  3:51 ` [PATCH net 2/3] net: ethernet: mtk_eth_wed: add missing put_device() in mtk_wed_add_hw() Yang Yingliang
@ 2022-10-17  3:51 ` Yang Yingliang
  2022-10-17  9:55   ` AngeloGioacchino Del Regno
  2022-10-17  8:40 ` [PATCH net 0/3] net: ethernet: mtk_eth_wed: fixe some leaks patchwork-bot+netdevbpf
  3 siblings, 1 reply; 8+ messages in thread
From: Yang Yingliang @ 2022-10-17  3:51 UTC (permalink / raw)
  To: linux-mediatek, netdev; +Cc: nbd, davem

The device_node pointer returned by of_parse_phandle() with refcount
incremented, when finish using it, the refcount need be decreased.

Fixes: 804775dfc288 ("net: ethernet: mtk_eth_soc: add support for Wireless Ethernet Dispatch (WED)")
Signed-off-by: Yang Yingliang <yangyingliang@huawei.com>
---
 drivers/net/ethernet/mediatek/mtk_wed.c | 5 ++++-
 1 file changed, 4 insertions(+), 1 deletion(-)

diff --git a/drivers/net/ethernet/mediatek/mtk_wed.c b/drivers/net/ethernet/mediatek/mtk_wed.c
index 09bbd05bd83c..65e01bf4b4d2 100644
--- a/drivers/net/ethernet/mediatek/mtk_wed.c
+++ b/drivers/net/ethernet/mediatek/mtk_wed.c
@@ -1072,7 +1072,7 @@ void mtk_wed_add_hw(struct device_node *np, struct mtk_eth *eth,
 
 	pdev = of_find_device_by_node(np);
 	if (!pdev)
-		return;
+		goto err_of_node_put;
 
 	get_device(&pdev->dev);
 	irq = platform_get_irq(pdev, 0);
@@ -1132,6 +1132,8 @@ void mtk_wed_add_hw(struct device_node *np, struct mtk_eth *eth,
 	mutex_unlock(&hw_lock);
 err_put_device:
 	put_device(&pdev->dev);
+err_of_node_put:
+	of_node_put(np);
 }
 
 void mtk_wed_exit(void)
@@ -1152,6 +1154,7 @@ void mtk_wed_exit(void)
 		hw_list[i] = NULL;
 		debugfs_remove(hw->debugfs_dir);
 		put_device(hw->dev);
+		of_node_put(hw->node);
 		kfree(hw);
 	}
 }
-- 
2.25.1


^ permalink raw reply related	[flat|nested] 8+ messages in thread

* Re: [PATCH net 0/3] net: ethernet: mtk_eth_wed: fixe some leaks
  2022-10-17  3:51 [PATCH net 0/3] net: ethernet: mtk_eth_wed: fixe some leaks Yang Yingliang
                   ` (2 preceding siblings ...)
  2022-10-17  3:51 ` [PATCH net 3/3] net: ethernet: mtk_eth_wed: add missing of_node_put() Yang Yingliang
@ 2022-10-17  8:40 ` patchwork-bot+netdevbpf
  3 siblings, 0 replies; 8+ messages in thread
From: patchwork-bot+netdevbpf @ 2022-10-17  8:40 UTC (permalink / raw)
  To: Yang Yingliang; +Cc: linux-mediatek, netdev, nbd, davem

Hello:

This series was applied to netdev/net.git (master)
by David S. Miller <davem@davemloft.net>:

On Mon, 17 Oct 2022 11:51:53 +0800 you wrote:
> I found some leaks in mtk_eth_soc.c/mtk_wed.c.
> 
>  patch#1 - I found mtk_wed_exit() is never called, I think mtk_wed_exit() need
>            be called in error path or module remove function to free the memory
>            allocated in mtk_wed_add_hw().
> 
>  patch#2 - The device is not put in error path in mtk_wed_add_hw().
> 
> [...]

Here is the summary with links:
  - [net,1/3] net: ethernet: mtk_eth_soc: fix possible memory leak in mtk_probe()
    https://git.kernel.org/netdev/net/c/b3d0d98179d6
  - [net,2/3] net: ethernet: mtk_eth_wed: add missing put_device() in mtk_wed_add_hw()
    https://git.kernel.org/netdev/net/c/9d4f20a476ca
  - [net,3/3] net: ethernet: mtk_eth_wed: add missing of_node_put()
    https://git.kernel.org/netdev/net/c/e0bb4659e235

You are awesome, thank you!
-- 
Deet-doot-dot, I am a bot.
https://korg.docs.kernel.org/patchwork/pwbot.html



^ permalink raw reply	[flat|nested] 8+ messages in thread

* Re: [PATCH net 1/3] net: ethernet: mtk_eth_soc: fix possible memory leak in mtk_probe()
  2022-10-17  3:51 ` [PATCH net 1/3] net: ethernet: mtk_eth_soc: fix possible memory leak in mtk_probe() Yang Yingliang
@ 2022-10-17  9:55   ` AngeloGioacchino Del Regno
  0 siblings, 0 replies; 8+ messages in thread
From: AngeloGioacchino Del Regno @ 2022-10-17  9:55 UTC (permalink / raw)
  To: Yang Yingliang, linux-mediatek, netdev; +Cc: nbd, davem

Il 17/10/22 05:51, Yang Yingliang ha scritto:
> If mtk_wed_add_hw() has been called, mtk_wed_exit() needs be called
> in error path or removing module to free the memory allocated in
> mtk_wed_add_hw().
> 
> Fixes: 804775dfc288 ("net: ethernet: mtk_eth_soc: add support for Wireless Ethernet Dispatch (WED)")
> Signed-off-by: Yang Yingliang <yangyingliang@huawei.com>
> ---
>   drivers/net/ethernet/mediatek/mtk_eth_soc.c | 17 ++++++++++++-----
>   1 file changed, 12 insertions(+), 5 deletions(-)
> 
> diff --git a/drivers/net/ethernet/mediatek/mtk_eth_soc.c b/drivers/net/ethernet/mediatek/mtk_eth_soc.c
> index 4fba7cb0144b..7cd381530aa4 100644
> --- a/drivers/net/ethernet/mediatek/mtk_eth_soc.c
> +++ b/drivers/net/ethernet/mediatek/mtk_eth_soc.c
> @@ -4060,19 +4060,23 @@ static int mtk_probe(struct platform_device *pdev)
>   			eth->irq[i] = platform_get_irq(pdev, i);
>   		if (eth->irq[i] < 0) {
>   			dev_err(&pdev->dev, "no IRQ%d resource found\n", i);
> -			return -ENXIO;
> +			err = -ENXIO;
> +			goto err_wed_exit;
>   		}
>   	}
>   	for (i = 0; i < ARRAY_SIZE(eth->clks); i++) {
>   		eth->clks[i] = devm_clk_get(eth->dev,
>   					    mtk_clks_source_name[i]);
>   		if (IS_ERR(eth->clks[i])) {
> -			if (PTR_ERR(eth->clks[i]) == -EPROBE_DEFER)
> -				return -EPROBE_DEFER;
> +			if (PTR_ERR(eth->clks[i]) == -EPROBE_DEFER) {
> +				err = -EPROBE_DEFER;
> +				goto err_wed_exit;
> +			}
>   			if (eth->soc->required_clks & BIT(i)) {
>   				dev_err(&pdev->dev, "clock %s not found\n",
>   					mtk_clks_source_name[i]);
> -				return -EINVAL;
> +				err = -EINVAL;
> +				goto err_wed_exit;
>   			}
>   			eth->clks[i] = NULL;
>   		}
> @@ -4083,7 +4087,7 @@ static int mtk_probe(struct platform_device *pdev)
>   
>   	err = mtk_hw_init(eth);
>   	if (err)
> -		return err;
> +		goto err_wed_exit;
>   
>   	eth->hwlro = MTK_HAS_CAPS(eth->soc->caps, MTK_HWLRO);
>   
> @@ -4179,6 +4183,8 @@ static int mtk_probe(struct platform_device *pdev)
>   	mtk_free_dev(eth);
>   err_deinit_hw:
>   	mtk_hw_deinit(eth);
> +err_wed_exit:
> +	mtk_wed_exit();

mtk_wed_add_hw() happens *only* if eth->soc->offload_version == true.
To make this clean, mtk_wed_exit() should be called only if mtk_wed_add_hw()
was ever called, so you have to add a check here.


>   
>   	return err;
>   }
> @@ -4198,6 +4204,7 @@ static int mtk_remove(struct platform_device *pdev)
>   		phylink_disconnect_phy(mac->phylink);
>   	}
>   
> +	mtk_wed_exit();

...and here as well.

Regards,
Angelo

>   	mtk_hw_deinit(eth);
>   
>   	netif_napi_del(&eth->tx_napi);



^ permalink raw reply	[flat|nested] 8+ messages in thread

* Re: [PATCH net 3/3] net: ethernet: mtk_eth_wed: add missing of_node_put()
  2022-10-17  3:51 ` [PATCH net 3/3] net: ethernet: mtk_eth_wed: add missing of_node_put() Yang Yingliang
@ 2022-10-17  9:55   ` AngeloGioacchino Del Regno
  0 siblings, 0 replies; 8+ messages in thread
From: AngeloGioacchino Del Regno @ 2022-10-17  9:55 UTC (permalink / raw)
  To: Yang Yingliang, linux-mediatek, netdev; +Cc: nbd, davem

Il 17/10/22 05:51, Yang Yingliang ha scritto:
> The device_node pointer returned by of_parse_phandle() with refcount
> incremented, when finish using it, the refcount need be decreased.
> 
> Fixes: 804775dfc288 ("net: ethernet: mtk_eth_soc: add support for Wireless Ethernet Dispatch (WED)")
> Signed-off-by: Yang Yingliang <yangyingliang@huawei.com>

Reviewed-by: AngeloGioacchino Del Regno <angelogioacchino.delregno@collabora.com>



^ permalink raw reply	[flat|nested] 8+ messages in thread

* Re: [PATCH net 2/3] net: ethernet: mtk_eth_wed: add missing put_device() in mtk_wed_add_hw()
  2022-10-17  3:51 ` [PATCH net 2/3] net: ethernet: mtk_eth_wed: add missing put_device() in mtk_wed_add_hw() Yang Yingliang
@ 2022-10-17  9:55   ` AngeloGioacchino Del Regno
  0 siblings, 0 replies; 8+ messages in thread
From: AngeloGioacchino Del Regno @ 2022-10-17  9:55 UTC (permalink / raw)
  To: Yang Yingliang, linux-mediatek, netdev; +Cc: nbd, davem

Il 17/10/22 05:51, Yang Yingliang ha scritto:
> After calling get_device() in mtk_wed_add_hw(), in error path, put_device()
> needs be called.
> 
> Fixes: 804775dfc288 ("net: ethernet: mtk_eth_soc: add support for Wireless Ethernet Dispatch (WED)")
> Signed-off-by: Yang Yingliang <yangyingliang@huawei.com>

Reviewed-by: AngeloGioacchino Del Regno <angelogioacchino.delregno@collabora.com>



^ permalink raw reply	[flat|nested] 8+ messages in thread

end of thread, other threads:[~2022-10-17  9:55 UTC | newest]

Thread overview: 8+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2022-10-17  3:51 [PATCH net 0/3] net: ethernet: mtk_eth_wed: fixe some leaks Yang Yingliang
2022-10-17  3:51 ` [PATCH net 1/3] net: ethernet: mtk_eth_soc: fix possible memory leak in mtk_probe() Yang Yingliang
2022-10-17  9:55   ` AngeloGioacchino Del Regno
2022-10-17  3:51 ` [PATCH net 2/3] net: ethernet: mtk_eth_wed: add missing put_device() in mtk_wed_add_hw() Yang Yingliang
2022-10-17  9:55   ` AngeloGioacchino Del Regno
2022-10-17  3:51 ` [PATCH net 3/3] net: ethernet: mtk_eth_wed: add missing of_node_put() Yang Yingliang
2022-10-17  9:55   ` AngeloGioacchino Del Regno
2022-10-17  8:40 ` [PATCH net 0/3] net: ethernet: mtk_eth_wed: fixe some leaks patchwork-bot+netdevbpf

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).