* [PATCH net v2] net: ethernet: ti: am65-cpsw: fix freeing IRQ in am65_cpsw_nuss_remove_tx_chns()
@ 2025-01-16 13:54 Roger Quadros
2025-01-18 0:40 ` Jacob Keller
2025-01-20 10:10 ` patchwork-bot+netdevbpf
0 siblings, 2 replies; 4+ messages in thread
From: Roger Quadros @ 2025-01-16 13:54 UTC (permalink / raw)
To: Andrew Lunn, David S. Miller, Eric Dumazet, Jakub Kicinski,
Paolo Abeni, Grygorii Strashko, Siddharth Vadapalli
Cc: srk, netdev, linux-kernel, Roger Quadros, Simon Horman
When getting the IRQ we use k3_udma_glue_tx_get_irq() which returns
negative error value on error. So not NULL check is not sufficient
to deteremine if IRQ is valid. Check that IRQ is greater then zero
to ensure it is valid.
There is no issue at probe time but at runtime user can invoke
.set_channels which results in the following call chain.
am65_cpsw_set_channels()
am65_cpsw_nuss_update_tx_rx_chns()
am65_cpsw_nuss_remove_tx_chns()
am65_cpsw_nuss_init_tx_chns()
At this point if am65_cpsw_nuss_init_tx_chns() fails due to
k3_udma_glue_tx_get_irq() then tx_chn->irq will be set to a
negative value.
Then, at subsequent .set_channels with higher channel count we
will attempt to free an invalid IRQ in am65_cpsw_nuss_remove_tx_chns()
leading to a kernel warning.
The issue is present in the original commit that introduced this driver,
although there, am65_cpsw_nuss_update_tx_rx_chns() existed as
am65_cpsw_nuss_update_tx_chns().
Fixes: 93a76530316a ("net: ethernet: ti: introduce am65x/j721e gigabit eth subsystem driver")
Signed-off-by: Roger Quadros <rogerq@kernel.org>
Reviewed-by: Simon Horman <horms@kernel.org>
Reviewed-by: Siddharth Vadapalli <s-vadapalli@ti.com>
---
Changes in v2:
- Fixed typo in commit log k3_udma_glue_rx_get_irq->k3_udma_glue_tx_get_irq
- Added more details to commit log
- Added Reviewed-by tags
- Link to v1: https://lore.kernel.org/r/20250114-am65-cpsw-fix-tx-irq-free-v1-1-b2069e6ed185@kernel.org
---
drivers/net/ethernet/ti/am65-cpsw-nuss.c | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/drivers/net/ethernet/ti/am65-cpsw-nuss.c b/drivers/net/ethernet/ti/am65-cpsw-nuss.c
index 5465bf872734..e1de45fb18ae 100644
--- a/drivers/net/ethernet/ti/am65-cpsw-nuss.c
+++ b/drivers/net/ethernet/ti/am65-cpsw-nuss.c
@@ -2248,7 +2248,7 @@ static void am65_cpsw_nuss_remove_tx_chns(struct am65_cpsw_common *common)
for (i = 0; i < common->tx_ch_num; i++) {
struct am65_cpsw_tx_chn *tx_chn = &common->tx_chns[i];
- if (tx_chn->irq)
+ if (tx_chn->irq > 0)
devm_free_irq(dev, tx_chn->irq, tx_chn);
netif_napi_del(&tx_chn->napi_tx);
---
base-commit: 5bc55a333a2f7316b58edc7573e8e893f7acb532
change-id: 20250114-am65-cpsw-fix-tx-irq-free-846ac55ee6e1
Best regards,
--
Roger Quadros <rogerq@kernel.org>
^ permalink raw reply related [flat|nested] 4+ messages in thread
* Re: [PATCH net v2] net: ethernet: ti: am65-cpsw: fix freeing IRQ in am65_cpsw_nuss_remove_tx_chns()
2025-01-16 13:54 [PATCH net v2] net: ethernet: ti: am65-cpsw: fix freeing IRQ in am65_cpsw_nuss_remove_tx_chns() Roger Quadros
@ 2025-01-18 0:40 ` Jacob Keller
2025-01-18 14:49 ` Roger Quadros
2025-01-20 10:10 ` patchwork-bot+netdevbpf
1 sibling, 1 reply; 4+ messages in thread
From: Jacob Keller @ 2025-01-18 0:40 UTC (permalink / raw)
To: Roger Quadros, Andrew Lunn, David S. Miller, Eric Dumazet,
Jakub Kicinski, Paolo Abeni, Grygorii Strashko,
Siddharth Vadapalli
Cc: srk, netdev, linux-kernel, Simon Horman
On 1/16/2025 5:54 AM, Roger Quadros wrote:
> When getting the IRQ we use k3_udma_glue_tx_get_irq() which returns
> negative error value on error. So not NULL check is not sufficient
> to deteremine if IRQ is valid. Check that IRQ is greater then zero
> to ensure it is valid.
>
Using the phrase "NULL check" is a bit odd since the value returned
isn't a pointer. It is correct that checking for 0 is not sufficient
since it could be a negative error value. Given that IRQ numbers are
typically considered like an opaque object, perhaps thinking in terms of
pointers and NULL is common place. Either way, its not worth re-rolling
for a minor phrasing change like this.
Reviewed-by: Jacob Keller <jacob.e.keller@intel.com>
> There is no issue at probe time but at runtime user can invoke
> .set_channels which results in the following call chain.
> am65_cpsw_set_channels()
> am65_cpsw_nuss_update_tx_rx_chns()
> am65_cpsw_nuss_remove_tx_chns()
> am65_cpsw_nuss_init_tx_chns()
>
> At this point if am65_cpsw_nuss_init_tx_chns() fails due to
> k3_udma_glue_tx_get_irq() then tx_chn->irq will be set to a
> negative value.
>
> Then, at subsequent .set_channels with higher channel count we
> will attempt to free an invalid IRQ in am65_cpsw_nuss_remove_tx_chns()
> leading to a kernel warning.
>
> The issue is present in the original commit that introduced this driver,
> although there, am65_cpsw_nuss_update_tx_rx_chns() existed as
> am65_cpsw_nuss_update_tx_chns().
>
> Fixes: 93a76530316a ("net: ethernet: ti: introduce am65x/j721e gigabit eth subsystem driver")
> Signed-off-by: Roger Quadros <rogerq@kernel.org>
> Reviewed-by: Simon Horman <horms@kernel.org>
> Reviewed-by: Siddharth Vadapalli <s-vadapalli@ti.com>
> ---
> Changes in v2:
> - Fixed typo in commit log k3_udma_glue_rx_get_irq->k3_udma_glue_tx_get_irq
> - Added more details to commit log
> - Added Reviewed-by tags
> - Link to v1: https://lore.kernel.org/r/20250114-am65-cpsw-fix-tx-irq-free-v1-1-b2069e6ed185@kernel.org
> ---
> drivers/net/ethernet/ti/am65-cpsw-nuss.c | 2 +-
> 1 file changed, 1 insertion(+), 1 deletion(-)
>
> diff --git a/drivers/net/ethernet/ti/am65-cpsw-nuss.c b/drivers/net/ethernet/ti/am65-cpsw-nuss.c
> index 5465bf872734..e1de45fb18ae 100644
> --- a/drivers/net/ethernet/ti/am65-cpsw-nuss.c
> +++ b/drivers/net/ethernet/ti/am65-cpsw-nuss.c
> @@ -2248,7 +2248,7 @@ static void am65_cpsw_nuss_remove_tx_chns(struct am65_cpsw_common *common)
> for (i = 0; i < common->tx_ch_num; i++) {
> struct am65_cpsw_tx_chn *tx_chn = &common->tx_chns[i];
>
> - if (tx_chn->irq)
> + if (tx_chn->irq > 0)
> devm_free_irq(dev, tx_chn->irq, tx_chn);
>
> netif_napi_del(&tx_chn->napi_tx);
>
> ---
> base-commit: 5bc55a333a2f7316b58edc7573e8e893f7acb532
> change-id: 20250114-am65-cpsw-fix-tx-irq-free-846ac55ee6e1
>
> Best regards,
^ permalink raw reply [flat|nested] 4+ messages in thread
* Re: [PATCH net v2] net: ethernet: ti: am65-cpsw: fix freeing IRQ in am65_cpsw_nuss_remove_tx_chns()
2025-01-18 0:40 ` Jacob Keller
@ 2025-01-18 14:49 ` Roger Quadros
0 siblings, 0 replies; 4+ messages in thread
From: Roger Quadros @ 2025-01-18 14:49 UTC (permalink / raw)
To: Jacob Keller, Andrew Lunn, David S. Miller, Eric Dumazet,
Jakub Kicinski, Paolo Abeni, Grygorii Strashko,
Siddharth Vadapalli
Cc: srk, netdev, linux-kernel, Simon Horman
On 18/01/2025 02:40, Jacob Keller wrote:
>
>
> On 1/16/2025 5:54 AM, Roger Quadros wrote:
>> When getting the IRQ we use k3_udma_glue_tx_get_irq() which returns
>> negative error value on error. So not NULL check is not sufficient
>> to deteremine if IRQ is valid. Check that IRQ is greater then zero
>> to ensure it is valid.
>>
>
> Using the phrase "NULL check" is a bit odd since the value returned
> isn't a pointer. It is correct that checking for 0 is not sufficient
> since it could be a negative error value. Given that IRQ numbers are
> typically considered like an opaque object, perhaps thinking in terms of
> pointers and NULL is common place. Either way, its not worth re-rolling
> for a minor phrasing change like this.
I agree with your view.
>
> Reviewed-by: Jacob Keller <jacob.e.keller@intel.com>
Thanks!
>
>> There is no issue at probe time but at runtime user can invoke
>> .set_channels which results in the following call chain.
>> am65_cpsw_set_channels()
>> am65_cpsw_nuss_update_tx_rx_chns()
>> am65_cpsw_nuss_remove_tx_chns()
>> am65_cpsw_nuss_init_tx_chns()
>>
>> At this point if am65_cpsw_nuss_init_tx_chns() fails due to
>> k3_udma_glue_tx_get_irq() then tx_chn->irq will be set to a
>> negative value.
>>
>> Then, at subsequent .set_channels with higher channel count we
>> will attempt to free an invalid IRQ in am65_cpsw_nuss_remove_tx_chns()
>> leading to a kernel warning.
>>
>> The issue is present in the original commit that introduced this driver,
>> although there, am65_cpsw_nuss_update_tx_rx_chns() existed as
>> am65_cpsw_nuss_update_tx_chns().
>>
>> Fixes: 93a76530316a ("net: ethernet: ti: introduce am65x/j721e gigabit eth subsystem driver")
>> Signed-off-by: Roger Quadros <rogerq@kernel.org>
>> Reviewed-by: Simon Horman <horms@kernel.org>
>> Reviewed-by: Siddharth Vadapalli <s-vadapalli@ti.com>
>> ---
>> Changes in v2:
>> - Fixed typo in commit log k3_udma_glue_rx_get_irq->k3_udma_glue_tx_get_irq
>> - Added more details to commit log
>> - Added Reviewed-by tags
>> - Link to v1: https://lore.kernel.org/r/20250114-am65-cpsw-fix-tx-irq-free-v1-1-b2069e6ed185@kernel.org
>> ---
>> drivers/net/ethernet/ti/am65-cpsw-nuss.c | 2 +-
>> 1 file changed, 1 insertion(+), 1 deletion(-)
>>
>> diff --git a/drivers/net/ethernet/ti/am65-cpsw-nuss.c b/drivers/net/ethernet/ti/am65-cpsw-nuss.c
>> index 5465bf872734..e1de45fb18ae 100644
>> --- a/drivers/net/ethernet/ti/am65-cpsw-nuss.c
>> +++ b/drivers/net/ethernet/ti/am65-cpsw-nuss.c
>> @@ -2248,7 +2248,7 @@ static void am65_cpsw_nuss_remove_tx_chns(struct am65_cpsw_common *common)
>> for (i = 0; i < common->tx_ch_num; i++) {
>> struct am65_cpsw_tx_chn *tx_chn = &common->tx_chns[i];
>>
>> - if (tx_chn->irq)
>> + if (tx_chn->irq > 0)
>> devm_free_irq(dev, tx_chn->irq, tx_chn);
>>
>> netif_napi_del(&tx_chn->napi_tx);
>>
>> ---
>> base-commit: 5bc55a333a2f7316b58edc7573e8e893f7acb532
>> change-id: 20250114-am65-cpsw-fix-tx-irq-free-846ac55ee6e1
>>
>> Best regards,
>
--
cheers,
-roger
^ permalink raw reply [flat|nested] 4+ messages in thread
* Re: [PATCH net v2] net: ethernet: ti: am65-cpsw: fix freeing IRQ in am65_cpsw_nuss_remove_tx_chns()
2025-01-16 13:54 [PATCH net v2] net: ethernet: ti: am65-cpsw: fix freeing IRQ in am65_cpsw_nuss_remove_tx_chns() Roger Quadros
2025-01-18 0:40 ` Jacob Keller
@ 2025-01-20 10:10 ` patchwork-bot+netdevbpf
1 sibling, 0 replies; 4+ messages in thread
From: patchwork-bot+netdevbpf @ 2025-01-20 10:10 UTC (permalink / raw)
To: Roger Quadros
Cc: andrew+netdev, davem, edumazet, kuba, pabeni, grygorii.strashko,
s-vadapalli, srk, netdev, linux-kernel, horms
Hello:
This patch was applied to netdev/net.git (main)
by David S. Miller <davem@davemloft.net>:
On Thu, 16 Jan 2025 15:54:49 +0200 you wrote:
> When getting the IRQ we use k3_udma_glue_tx_get_irq() which returns
> negative error value on error. So not NULL check is not sufficient
> to deteremine if IRQ is valid. Check that IRQ is greater then zero
> to ensure it is valid.
>
> There is no issue at probe time but at runtime user can invoke
> .set_channels which results in the following call chain.
> am65_cpsw_set_channels()
> am65_cpsw_nuss_update_tx_rx_chns()
> am65_cpsw_nuss_remove_tx_chns()
> am65_cpsw_nuss_init_tx_chns()
>
> [...]
Here is the summary with links:
- [net,v2] net: ethernet: ti: am65-cpsw: fix freeing IRQ in am65_cpsw_nuss_remove_tx_chns()
https://git.kernel.org/netdev/net/c/4395a44acb15
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] 4+ messages in thread
end of thread, other threads:[~2025-01-20 10:10 UTC | newest]
Thread overview: 4+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2025-01-16 13:54 [PATCH net v2] net: ethernet: ti: am65-cpsw: fix freeing IRQ in am65_cpsw_nuss_remove_tx_chns() Roger Quadros
2025-01-18 0:40 ` Jacob Keller
2025-01-18 14:49 ` Roger Quadros
2025-01-20 10:10 ` 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