diff mbox series

[v2] powerpc/fsl_rio: add missing of_node_put() in fsl_rio_setup()

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

Checks

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.

Commit Message

Yang Yingliang Oct. 29, 2022, 12:26 p.m. UTC
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(+)

Comments

Christophe Leroy Nov. 2, 2022, 1:45 p.m. UTC | #1
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:
Yang Yingliang Nov. 2, 2022, 1:57 p.m. UTC | #2
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 mbox series

Patch

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: