diff mbox series

dpaa2-switch: Fix memory leak in dpaa2_switch_acl_entry_add() and dpaa2_switch_acl_entry_remove()

Message ID 20221205061515.115012-1-yuancan@huawei.com (mailing list archive)
State Accepted
Commit 4fad22a1281c500f15b172c9d261eff347ca634b
Delegated to: Netdev Maintainers
Headers show
Series dpaa2-switch: Fix memory leak in dpaa2_switch_acl_entry_add() and dpaa2_switch_acl_entry_remove() | expand

Checks

Context Check Description
netdev/tree_selection success Guessed tree name to be net-next
netdev/fixes_present success Fixes tag not required for -next series
netdev/subject_prefix warning Target tree name not specified in the subject
netdev/cover_letter success Single patches do not need cover letters
netdev/patch_count success Link
netdev/header_inline success No static functions without inline keyword in header files
netdev/build_32bit success Errors and warnings before: 0 this patch: 0
netdev/cc_maintainers success CCed 6 of 6 maintainers
netdev/build_clang success Errors and warnings before: 0 this patch: 0
netdev/module_param success Was 0 now: 0
netdev/verify_signedoff success Signed-off-by tag matches author and committer
netdev/check_selftest success No net selftest shell script
netdev/verify_fixes success Fixes tag looks correct
netdev/build_allmodconfig_warn success Errors and warnings before: 0 this patch: 0
netdev/checkpatch success total: 0 errors, 0 warnings, 0 checks, 28 lines checked
netdev/kdoc success Errors and warnings before: 0 this patch: 0
netdev/source_inline success Was 0 now: 0

Commit Message

Yuan Can Dec. 5, 2022, 6:15 a.m. UTC
The cmd_buff needs to be freed when error happened in
dpaa2_switch_acl_entry_add() and dpaa2_switch_acl_entry_remove().

Fixes: 1110318d83e8 ("dpaa2-switch: add tc flower hardware offload on ingress traffic")
Signed-off-by: Yuan Can <yuancan@huawei.com>
---
 drivers/net/ethernet/freescale/dpaa2/dpaa2-switch-flower.c | 4 ++++
 1 file changed, 4 insertions(+)

Comments

patchwork-bot+netdevbpf@kernel.org Dec. 7, 2022, 11:20 a.m. UTC | #1
Hello:

This patch was applied to netdev/net.git (master)
by Paolo Abeni <pabeni@redhat.com>:

On Mon, 5 Dec 2022 06:15:15 +0000 you wrote:
> The cmd_buff needs to be freed when error happened in
> dpaa2_switch_acl_entry_add() and dpaa2_switch_acl_entry_remove().
> 
> Fixes: 1110318d83e8 ("dpaa2-switch: add tc flower hardware offload on ingress traffic")
> Signed-off-by: Yuan Can <yuancan@huawei.com>
> ---
>  drivers/net/ethernet/freescale/dpaa2/dpaa2-switch-flower.c | 4 ++++
>  1 file changed, 4 insertions(+)

Here is the summary with links:
  - dpaa2-switch: Fix memory leak in dpaa2_switch_acl_entry_add() and dpaa2_switch_acl_entry_remove()
    https://git.kernel.org/netdev/net/c/4fad22a1281c

You are awesome, thank you!
Vladimir Oltean Dec. 7, 2022, 11:55 a.m. UTC | #2
Hi Yuan,

On Mon, Dec 05, 2022 at 06:15:15AM +0000, Yuan Can wrote:
> The cmd_buff needs to be freed when error happened in
> dpaa2_switch_acl_entry_add() and dpaa2_switch_acl_entry_remove().
> 
> Fixes: 1110318d83e8 ("dpaa2-switch: add tc flower hardware offload on ingress traffic")
> Signed-off-by: Yuan Can <yuancan@huawei.com>
> ---
>  drivers/net/ethernet/freescale/dpaa2/dpaa2-switch-flower.c | 4 ++++
>  1 file changed, 4 insertions(+)
> 
> diff --git a/drivers/net/ethernet/freescale/dpaa2/dpaa2-switch-flower.c b/drivers/net/ethernet/freescale/dpaa2/dpaa2-switch-flower.c
> index cacd454ac696..c39b866e2582 100644
> --- a/drivers/net/ethernet/freescale/dpaa2/dpaa2-switch-flower.c
> +++ b/drivers/net/ethernet/freescale/dpaa2/dpaa2-switch-flower.c
> @@ -132,6 +132,7 @@ int dpaa2_switch_acl_entry_add(struct dpaa2_switch_filter_block *filter_block,
>  						 DMA_TO_DEVICE);
>  	if (unlikely(dma_mapping_error(dev, acl_entry_cfg->key_iova))) {
>  		dev_err(dev, "DMA mapping failed\n");
> +		kfree(cmd_buff);
>  		return -EFAULT;
>  	}
>  
> @@ -142,6 +143,7 @@ int dpaa2_switch_acl_entry_add(struct dpaa2_switch_filter_block *filter_block,
>  			 DMA_TO_DEVICE);
>  	if (err) {
>  		dev_err(dev, "dpsw_acl_add_entry() failed %d\n", err);
> +		kfree(cmd_buff);

To reduce the number of kfree() calls, this last one can be put right
before checking for error, and we could remove the kfree(cmd_buff) call at
the very end. I mean that was already the intention, if you look at the
dma_unmap_single() call compared to the error checking. Like this:

	err = dpsw_acl_add_entry(...);

	dma_unmap_single(dev, acl_entry_cfg->key_iova, sizeof(cmd_buff),
			 DMA_TO_DEVICE);
	kfree(cmd_buff);

	if (err) {
		dev_err(dev, "dpsw_acl_add_entry() failed %d\n", err);
		return err;
	}

	return 0;
}

>  		return err;
>  	}
>  
> @@ -172,6 +174,7 @@ dpaa2_switch_acl_entry_remove(struct dpaa2_switch_filter_block *block,
>  						 DMA_TO_DEVICE);
>  	if (unlikely(dma_mapping_error(dev, acl_entry_cfg->key_iova))) {
>  		dev_err(dev, "DMA mapping failed\n");
> +		kfree(cmd_buff);
>  		return -EFAULT;
>  	}
>  
> @@ -182,6 +185,7 @@ dpaa2_switch_acl_entry_remove(struct dpaa2_switch_filter_block *block,
>  			 DMA_TO_DEVICE);
>  	if (err) {
>  		dev_err(dev, "dpsw_acl_remove_entry() failed %d\n", err);
> +		kfree(cmd_buff);

Similar here:

	err = dpsw_acl_remove_entry(ethsw->mc_io, 0, ethsw->dpsw_handle,
				    block->acl_id, acl_entry_cfg);

	dma_unmap_single(dev, acl_entry_cfg->key_iova, sizeof(cmd_buff),
			 DMA_TO_DEVICE);
	kfree(cmd_buff);

	if (err) {
		dev_err(dev, "dpsw_acl_remove_entry() failed %d\n", err);
		return err;
	}

	return 0;
}

>  		return err;
>  	}
>  
> -- 
> 2.17.1
>
Yuan Can Dec. 8, 2022, 1:51 a.m. UTC | #3
在 2022/12/7 19:55, Vladimir Oltean 写道:
> Hi Yuan,
>
> On Mon, Dec 05, 2022 at 06:15:15AM +0000, Yuan Can wrote:
>> The cmd_buff needs to be freed when error happened in
>> dpaa2_switch_acl_entry_add() and dpaa2_switch_acl_entry_remove().
>>
>> Fixes: 1110318d83e8 ("dpaa2-switch: add tc flower hardware offload on ingress traffic")
>> Signed-off-by: Yuan Can <yuancan@huawei.com>
>> ---
>>   drivers/net/ethernet/freescale/dpaa2/dpaa2-switch-flower.c | 4 ++++
>>   1 file changed, 4 insertions(+)
>>
>> diff --git a/drivers/net/ethernet/freescale/dpaa2/dpaa2-switch-flower.c b/drivers/net/ethernet/freescale/dpaa2/dpaa2-switch-flower.c
>> index cacd454ac696..c39b866e2582 100644
>> --- a/drivers/net/ethernet/freescale/dpaa2/dpaa2-switch-flower.c
>> +++ b/drivers/net/ethernet/freescale/dpaa2/dpaa2-switch-flower.c
>> @@ -132,6 +132,7 @@ int dpaa2_switch_acl_entry_add(struct dpaa2_switch_filter_block *filter_block,
>>   						 DMA_TO_DEVICE);
>>   	if (unlikely(dma_mapping_error(dev, acl_entry_cfg->key_iova))) {
>>   		dev_err(dev, "DMA mapping failed\n");
>> +		kfree(cmd_buff);
>>   		return -EFAULT;
>>   	}
>>   
>> @@ -142,6 +143,7 @@ int dpaa2_switch_acl_entry_add(struct dpaa2_switch_filter_block *filter_block,
>>   			 DMA_TO_DEVICE);
>>   	if (err) {
>>   		dev_err(dev, "dpsw_acl_add_entry() failed %d\n", err);
>> +		kfree(cmd_buff);
> To reduce the number of kfree() calls, this last one can be put right
> before checking for error, and we could remove the kfree(cmd_buff) call at
> the very end. I mean that was already the intention, if you look at the
> dma_unmap_single() call compared to the error checking. Like this:
>
> 	err = dpsw_acl_add_entry(...);
>
> 	dma_unmap_single(dev, acl_entry_cfg->key_iova, sizeof(cmd_buff),
> 			 DMA_TO_DEVICE);
> 	kfree(cmd_buff);
>
> 	if (err) {
> 		dev_err(dev, "dpsw_acl_add_entry() failed %d\n", err);
> 		return err;
> 	}
>
> 	return 0;
> }
Nice! Thanks for the suggestion, as the patch has been merged, let me 
send another patch to do this job.
Vladimir Oltean Dec. 8, 2022, 2:20 p.m. UTC | #4
On Thu, Dec 08, 2022 at 09:51:45AM +0800, Yuan Can wrote:
> Nice! Thanks for the suggestion, as the patch has been merged, let me send
> another patch to do this job.

The patch was merged at the same time as I was writing my reply.

Since the patch went to the "net.git" tree where only bug fixes are
accepted, any further rework would have to go to "net-next.git".
A resynchronization (merge net into net-next) takes place weekly, one
should take place later today or tomorrow, I think. So if you're going
to send a follow-up patch, I'd wait until "net-next" contains your
change.

That being said, it's not all that critical to follow up with another
patch. I simply hadn't noticed your patch was merged, but it does the
job as well, just not in the same style as the rest of these 2 functions.
diff mbox series

Patch

diff --git a/drivers/net/ethernet/freescale/dpaa2/dpaa2-switch-flower.c b/drivers/net/ethernet/freescale/dpaa2/dpaa2-switch-flower.c
index cacd454ac696..c39b866e2582 100644
--- a/drivers/net/ethernet/freescale/dpaa2/dpaa2-switch-flower.c
+++ b/drivers/net/ethernet/freescale/dpaa2/dpaa2-switch-flower.c
@@ -132,6 +132,7 @@  int dpaa2_switch_acl_entry_add(struct dpaa2_switch_filter_block *filter_block,
 						 DMA_TO_DEVICE);
 	if (unlikely(dma_mapping_error(dev, acl_entry_cfg->key_iova))) {
 		dev_err(dev, "DMA mapping failed\n");
+		kfree(cmd_buff);
 		return -EFAULT;
 	}
 
@@ -142,6 +143,7 @@  int dpaa2_switch_acl_entry_add(struct dpaa2_switch_filter_block *filter_block,
 			 DMA_TO_DEVICE);
 	if (err) {
 		dev_err(dev, "dpsw_acl_add_entry() failed %d\n", err);
+		kfree(cmd_buff);
 		return err;
 	}
 
@@ -172,6 +174,7 @@  dpaa2_switch_acl_entry_remove(struct dpaa2_switch_filter_block *block,
 						 DMA_TO_DEVICE);
 	if (unlikely(dma_mapping_error(dev, acl_entry_cfg->key_iova))) {
 		dev_err(dev, "DMA mapping failed\n");
+		kfree(cmd_buff);
 		return -EFAULT;
 	}
 
@@ -182,6 +185,7 @@  dpaa2_switch_acl_entry_remove(struct dpaa2_switch_filter_block *block,
 			 DMA_TO_DEVICE);
 	if (err) {
 		dev_err(dev, "dpsw_acl_remove_entry() failed %d\n", err);
+		kfree(cmd_buff);
 		return err;
 	}