drivers/remoteproc/mtk_scp.c | 7 +------ 1 file changed, 1 insertion(+), 6 deletions(-)
Use scoped for_each_available_child_of_node_scoped() to remove manual
of_node_put() calls from early returns.
Signed-off-by: Fei Shao <fshao@chromium.org>
---
drivers/remoteproc/mtk_scp.c | 7 +------
1 file changed, 1 insertion(+), 6 deletions(-)
diff --git a/drivers/remoteproc/mtk_scp.c b/drivers/remoteproc/mtk_scp.c
index 8206a1766481..b123698feb52 100644
--- a/drivers/remoteproc/mtk_scp.c
+++ b/drivers/remoteproc/mtk_scp.c
@@ -1234,7 +1234,6 @@ static int scp_add_multi_core(struct platform_device *pdev,
struct device *dev = &pdev->dev;
struct device_node *np = dev_of_node(dev);
struct platform_device *cpdev;
- struct device_node *child;
struct list_head *scp_list = &scp_cluster->mtk_scp_list;
const struct mtk_scp_of_data **cluster_of_data;
struct mtk_scp *scp, *temp;
@@ -1243,11 +1242,10 @@ static int scp_add_multi_core(struct platform_device *pdev,
cluster_of_data = (const struct mtk_scp_of_data **)of_device_get_match_data(dev);
- for_each_available_child_of_node(np, child) {
+ for_each_available_child_of_node_scoped(np, child) {
if (!cluster_of_data[core_id]) {
ret = -EINVAL;
dev_err(dev, "Not support core %d\n", core_id);
- of_node_put(child);
goto init_fail;
}
@@ -1255,7 +1253,6 @@ static int scp_add_multi_core(struct platform_device *pdev,
if (!cpdev) {
ret = -ENODEV;
dev_err(dev, "Not found platform device for core %d\n", core_id);
- of_node_put(child);
goto init_fail;
}
@@ -1264,14 +1261,12 @@ static int scp_add_multi_core(struct platform_device *pdev,
if (IS_ERR(scp)) {
ret = PTR_ERR(scp);
dev_err(dev, "Failed to initialize core %d rproc\n", core_id);
- of_node_put(child);
goto init_fail;
}
ret = rproc_add(scp->rproc);
if (ret) {
dev_err(dev, "Failed to add rproc of core %d\n", core_id);
- of_node_put(child);
scp_free(scp);
goto init_fail;
}
--
2.51.0.355.g5224444f11-goog
On Mon, 8 Sep 2025 12:43:25 +0800 Fei Shao <fshao@chromium.org> wrote: > Use scoped for_each_available_child_of_node_scoped() to remove manual > of_node_put() calls from early returns. There aren't any early returns here. This runs into some of the stuff that cleanup.h docs suggest we shouldn't do which is combining gotos and __free() magic. I think this case is actually fine despite that but in general worth thinking about the code structure and whether that can be avoided. One option would be to factor out the loop into another function then use and error return from that to call the stuff under the init_free label. Jonathan > > Signed-off-by: Fei Shao <fshao@chromium.org> > --- > > drivers/remoteproc/mtk_scp.c | 7 +------ > 1 file changed, 1 insertion(+), 6 deletions(-) > > diff --git a/drivers/remoteproc/mtk_scp.c b/drivers/remoteproc/mtk_scp.c > index 8206a1766481..b123698feb52 100644 > --- a/drivers/remoteproc/mtk_scp.c > +++ b/drivers/remoteproc/mtk_scp.c > @@ -1234,7 +1234,6 @@ static int scp_add_multi_core(struct platform_device *pdev, > struct device *dev = &pdev->dev; > struct device_node *np = dev_of_node(dev); > struct platform_device *cpdev; > - struct device_node *child; > struct list_head *scp_list = &scp_cluster->mtk_scp_list; > const struct mtk_scp_of_data **cluster_of_data; > struct mtk_scp *scp, *temp; > @@ -1243,11 +1242,10 @@ static int scp_add_multi_core(struct platform_device *pdev, > > cluster_of_data = (const struct mtk_scp_of_data **)of_device_get_match_data(dev); > > - for_each_available_child_of_node(np, child) { > + for_each_available_child_of_node_scoped(np, child) { > if (!cluster_of_data[core_id]) { > ret = -EINVAL; > dev_err(dev, "Not support core %d\n", core_id); > - of_node_put(child); > goto init_fail; > } > > @@ -1255,7 +1253,6 @@ static int scp_add_multi_core(struct platform_device *pdev, > if (!cpdev) { > ret = -ENODEV; > dev_err(dev, "Not found platform device for core %d\n", core_id); > - of_node_put(child); > goto init_fail; > } > > @@ -1264,14 +1261,12 @@ static int scp_add_multi_core(struct platform_device *pdev, > if (IS_ERR(scp)) { > ret = PTR_ERR(scp); > dev_err(dev, "Failed to initialize core %d rproc\n", core_id); > - of_node_put(child); > goto init_fail; > } > > ret = rproc_add(scp->rproc); > if (ret) { > dev_err(dev, "Failed to add rproc of core %d\n", core_id); > - of_node_put(child); > scp_free(scp); > goto init_fail; > }
On Wed, Sep 10, 2025 at 6:55 PM Jonathan Cameron <jonathan.cameron@huawei.com> wrote: > > On Mon, 8 Sep 2025 12:43:25 +0800 > Fei Shao <fshao@chromium.org> wrote: > > > Use scoped for_each_available_child_of_node_scoped() to remove manual > > of_node_put() calls from early returns. > > There aren't any early returns here. > > This runs into some of the stuff that cleanup.h docs suggest we shouldn't > do which is combining gotos and __free() magic. > I think this case is actually fine despite that but in general worth > thinking about the code structure and whether that can be avoided. > > One option would be to factor out the loop into another function then use > and error return from that to call the stuff under the init_free label. Fair point, I can send a v2 with that. Thanks, Fei > > Jonathan >
On 08/09/2025 06:43, Fei Shao wrote: > Use scoped for_each_available_child_of_node_scoped() to remove manual > of_node_put() calls from early returns. > > Signed-off-by: Fei Shao <fshao@chromium.org> Reviewed-by: Matthias Brugger <matthias.bgg@gmail.com> > --- > > drivers/remoteproc/mtk_scp.c | 7 +------ > 1 file changed, 1 insertion(+), 6 deletions(-) > > diff --git a/drivers/remoteproc/mtk_scp.c b/drivers/remoteproc/mtk_scp.c > index 8206a1766481..b123698feb52 100644 > --- a/drivers/remoteproc/mtk_scp.c > +++ b/drivers/remoteproc/mtk_scp.c > @@ -1234,7 +1234,6 @@ static int scp_add_multi_core(struct platform_device *pdev, > struct device *dev = &pdev->dev; > struct device_node *np = dev_of_node(dev); > struct platform_device *cpdev; > - struct device_node *child; > struct list_head *scp_list = &scp_cluster->mtk_scp_list; > const struct mtk_scp_of_data **cluster_of_data; > struct mtk_scp *scp, *temp; > @@ -1243,11 +1242,10 @@ static int scp_add_multi_core(struct platform_device *pdev, > > cluster_of_data = (const struct mtk_scp_of_data **)of_device_get_match_data(dev); > > - for_each_available_child_of_node(np, child) { > + for_each_available_child_of_node_scoped(np, child) { > if (!cluster_of_data[core_id]) { > ret = -EINVAL; > dev_err(dev, "Not support core %d\n", core_id); > - of_node_put(child); > goto init_fail; > } > > @@ -1255,7 +1253,6 @@ static int scp_add_multi_core(struct platform_device *pdev, > if (!cpdev) { > ret = -ENODEV; > dev_err(dev, "Not found platform device for core %d\n", core_id); > - of_node_put(child); > goto init_fail; > } > > @@ -1264,14 +1261,12 @@ static int scp_add_multi_core(struct platform_device *pdev, > if (IS_ERR(scp)) { > ret = PTR_ERR(scp); > dev_err(dev, "Failed to initialize core %d rproc\n", core_id); > - of_node_put(child); > goto init_fail; > } > > ret = rproc_add(scp->rproc); > if (ret) { > dev_err(dev, "Failed to add rproc of core %d\n", core_id); > - of_node_put(child); > scp_free(scp); > goto init_fail; > }
© 2016 - 2025 Red Hat, Inc.