Message ID | 20221029122600.1514280-1-yangyingliang@huawei.com (mailing list archive) |
---|---|
State | Superseded |
Headers | show |
Series | [v2] powerpc/fsl_rio: add missing of_node_put() in fsl_rio_setup() | expand |
Context | Check | Description |
---|---|---|
snowpatch_ozlabs/github-powerpc_ppctests | success | Successfully ran 10 jobs. |
snowpatch_ozlabs/github-powerpc_selftests | success | Successfully ran 10 jobs. |
snowpatch_ozlabs/github-powerpc_sparse | success | Successfully ran 4 jobs. |
snowpatch_ozlabs/github-powerpc_kernel_qemu | success | Successfully ran 23 jobs. |
snowpatch_ozlabs/github-powerpc_clang | success | Successfully ran 6 jobs. |
Le 29/10/2022 à 14:26, Yang Yingliang a écrit : > The of node returned by of_find_compatible_node() or for_each_child_of_node() > with refcount decremented, of_node_put() need be called after using it to avoid > refcount leak. Is that necessary to do of_node_put() so often ? Can't it be done exclusively on the error exit path ? > > Fixes: abc3aeae3aaa ("fsl-rio: Add two ports and rapidio message units support") > Signed-off-by: Yang Yingliang <yangyingliang@huawei.com> > --- > v1 -> v2: > Add fix tag. > v1 patch link: > https://lore.kernel.org/lkml/20220615032137.1878219-1-yangyingliang@huawei.com/ > --- > arch/powerpc/sysdev/fsl_rio.c | 6 ++++++ > 1 file changed, 6 insertions(+) > > diff --git a/arch/powerpc/sysdev/fsl_rio.c b/arch/powerpc/sysdev/fsl_rio.c > index c8f044d62fe2..1b0be4931f18 100644 > --- a/arch/powerpc/sysdev/fsl_rio.c > +++ b/arch/powerpc/sysdev/fsl_rio.c > @@ -553,6 +553,7 @@ int fsl_rio_setup(struct platform_device *dev) > rc = -ENOMEM; > goto err_pw; > } > + of_node_put(np); > range_start = of_read_number(dt_range, aw); > dbell->dbell_regs = (struct rio_dbell_regs *)(rmu_regs_win + > (u32)range_start); > @@ -581,6 +582,7 @@ int fsl_rio_setup(struct platform_device *dev) > rc = -ENOMEM; > goto err; > } > + of_node_put(np); > range_start = of_read_number(dt_range, aw); > pw->pw_regs = (struct rio_pw_regs *)(rmu_regs_win + (u32)range_start); > > @@ -590,6 +592,7 @@ int fsl_rio_setup(struct platform_device *dev) > if (!port_index) { > dev_err(&dev->dev, "Can't get %pOF property 'cell-index'\n", > np); > + of_node_put(np); > continue; > } > > @@ -597,6 +600,7 @@ int fsl_rio_setup(struct platform_device *dev) > if (!dt_range) { > dev_err(&dev->dev, "Can't get %pOF property 'ranges'\n", > np); > + of_node_put(np); > continue; > } > > @@ -619,6 +623,7 @@ int fsl_rio_setup(struct platform_device *dev) > > dev_info(&dev->dev, "%pOF: LAW start 0x%016llx, size 0x%016llx.\n", > np, range_start, range_size); > + of_node_put(np); > > port = kzalloc(sizeof(struct rio_mport), GFP_KERNEL); > if (!port) > @@ -763,6 +768,7 @@ int fsl_rio_setup(struct platform_device *dev) > err_dbell: > iounmap(rmu_regs_win); > rmu_regs_win = NULL; > + of_node_put(np); > err_rmu: > kfree(ops); > err_ops:
On 2022/11/2 21:45, Christophe Leroy wrote: > > Le 29/10/2022 à 14:26, Yang Yingliang a écrit : >> The of node returned by of_find_compatible_node() or for_each_child_of_node() >> with refcount decremented, of_node_put() need be called after using it to avoid >> refcount leak. > Is that necessary to do of_node_put() so often ? Can't it be done > exclusively on the error exit path ? The 'np' is assigned by three different of nodes in this function, in its error and normal path after using, it should be put, so it looks used so often. And I think it's no better way to make it less used. Thanks, Yang > >> Fixes: abc3aeae3aaa ("fsl-rio: Add two ports and rapidio message units support") >> Signed-off-by: Yang Yingliang <yangyingliang@huawei.com> >> --- >> v1 -> v2: >> Add fix tag. >> v1 patch link: >> https://lore.kernel.org/lkml/20220615032137.1878219-1-yangyingliang@huawei.com/ >> --- >> arch/powerpc/sysdev/fsl_rio.c | 6 ++++++ >> 1 file changed, 6 insertions(+) >> >> diff --git a/arch/powerpc/sysdev/fsl_rio.c b/arch/powerpc/sysdev/fsl_rio.c >> index c8f044d62fe2..1b0be4931f18 100644 >> --- a/arch/powerpc/sysdev/fsl_rio.c >> +++ b/arch/powerpc/sysdev/fsl_rio.c >> @@ -553,6 +553,7 @@ int fsl_rio_setup(struct platform_device *dev) >> rc = -ENOMEM; >> goto err_pw; >> } >> + of_node_put(np); >> range_start = of_read_number(dt_range, aw); >> dbell->dbell_regs = (struct rio_dbell_regs *)(rmu_regs_win + >> (u32)range_start); >> @@ -581,6 +582,7 @@ int fsl_rio_setup(struct platform_device *dev) >> rc = -ENOMEM; >> goto err; >> } >> + of_node_put(np); >> range_start = of_read_number(dt_range, aw); >> pw->pw_regs = (struct rio_pw_regs *)(rmu_regs_win + (u32)range_start); >> >> @@ -590,6 +592,7 @@ int fsl_rio_setup(struct platform_device *dev) >> if (!port_index) { >> dev_err(&dev->dev, "Can't get %pOF property 'cell-index'\n", >> np); >> + of_node_put(np); >> continue; >> } >> >> @@ -597,6 +600,7 @@ int fsl_rio_setup(struct platform_device *dev) >> if (!dt_range) { >> dev_err(&dev->dev, "Can't get %pOF property 'ranges'\n", >> np); >> + of_node_put(np); >> continue; >> } >> >> @@ -619,6 +623,7 @@ int fsl_rio_setup(struct platform_device *dev) >> >> dev_info(&dev->dev, "%pOF: LAW start 0x%016llx, size 0x%016llx.\n", >> np, range_start, range_size); >> + of_node_put(np); >> >> port = kzalloc(sizeof(struct rio_mport), GFP_KERNEL); >> if (!port) >> @@ -763,6 +768,7 @@ int fsl_rio_setup(struct platform_device *dev) >> err_dbell: >> iounmap(rmu_regs_win); >> rmu_regs_win = NULL; >> + of_node_put(np); >> err_rmu: >> kfree(ops); >> err_ops:
diff --git a/arch/powerpc/sysdev/fsl_rio.c b/arch/powerpc/sysdev/fsl_rio.c index c8f044d62fe2..1b0be4931f18 100644 --- a/arch/powerpc/sysdev/fsl_rio.c +++ b/arch/powerpc/sysdev/fsl_rio.c @@ -553,6 +553,7 @@ int fsl_rio_setup(struct platform_device *dev) rc = -ENOMEM; goto err_pw; } + of_node_put(np); range_start = of_read_number(dt_range, aw); dbell->dbell_regs = (struct rio_dbell_regs *)(rmu_regs_win + (u32)range_start); @@ -581,6 +582,7 @@ int fsl_rio_setup(struct platform_device *dev) rc = -ENOMEM; goto err; } + of_node_put(np); range_start = of_read_number(dt_range, aw); pw->pw_regs = (struct rio_pw_regs *)(rmu_regs_win + (u32)range_start); @@ -590,6 +592,7 @@ int fsl_rio_setup(struct platform_device *dev) if (!port_index) { dev_err(&dev->dev, "Can't get %pOF property 'cell-index'\n", np); + of_node_put(np); continue; } @@ -597,6 +600,7 @@ int fsl_rio_setup(struct platform_device *dev) if (!dt_range) { dev_err(&dev->dev, "Can't get %pOF property 'ranges'\n", np); + of_node_put(np); continue; } @@ -619,6 +623,7 @@ int fsl_rio_setup(struct platform_device *dev) dev_info(&dev->dev, "%pOF: LAW start 0x%016llx, size 0x%016llx.\n", np, range_start, range_size); + of_node_put(np); port = kzalloc(sizeof(struct rio_mport), GFP_KERNEL); if (!port) @@ -763,6 +768,7 @@ int fsl_rio_setup(struct platform_device *dev) err_dbell: iounmap(rmu_regs_win); rmu_regs_win = NULL; + of_node_put(np); err_rmu: kfree(ops); err_ops:
The of node returned by of_find_compatible_node() or for_each_child_of_node() with refcount decremented, of_node_put() need be called after using it to avoid refcount leak. Fixes: abc3aeae3aaa ("fsl-rio: Add two ports and rapidio message units support") Signed-off-by: Yang Yingliang <yangyingliang@huawei.com> --- v1 -> v2: Add fix tag. v1 patch link: https://lore.kernel.org/lkml/20220615032137.1878219-1-yangyingliang@huawei.com/ --- arch/powerpc/sysdev/fsl_rio.c | 6 ++++++ 1 file changed, 6 insertions(+)