* [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(ð->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(ð->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).