diff mbox series

[net,1/2] net: ethernet: oa_tc6: fix infinite loop error when tx credits becomes 0

Message ID 20241120135142.586845-2-parthiban.veerasooran@microchip.com (mailing list archive)
State New
Delegated to: Netdev Maintainers
Headers show
Series Fixes on the OPEN Alliance TC6 10BASE-T1x MAC-PHY support generic lib | expand

Checks

Context Check Description
netdev/series_format success Posting correctly formatted
netdev/tree_selection success Clearly marked for net
netdev/ynl success Generated files up to date; no warnings/errors; no diff in generated;
netdev/fixes_present success Fixes tag present in non-next series
netdev/header_inline success No static functions without inline keyword in header files
netdev/build_32bit success Errors and warnings before: 3 this patch: 3
netdev/build_tools success No tools touched, skip
netdev/cc_maintainers fail 1 blamed authors not CCed: andrew+netdev@lunn.ch; 1 maintainers not CCed: andrew+netdev@lunn.ch
netdev/build_clang success Errors and warnings before: 3 this patch: 3
netdev/verify_signedoff success Signed-off-by tag matches author and committer
netdev/deprecated_api success None detected
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: 4 this patch: 4
netdev/checkpatch success total: 0 errors, 0 warnings, 0 checks, 11 lines checked
netdev/build_clang_rust success No Rust files in patch. Skipping build
netdev/kdoc success Errors and warnings before: 0 this patch: 0
netdev/source_inline success Was 0 now: 0
netdev/contest success net-next-2024-11-20--15-00 (tests: 789)

Commit Message

Parthiban Veerasooran Nov. 20, 2024, 1:51 p.m. UTC
SPI thread wakes up to perform SPI transfer whenever there is an TX skb
from n/w stack or interrupt from MAC-PHY. Ethernet frame from TX skb is
transferred based on the availability tx credits in the MAC-PHY which is
reported from the previous SPI transfer. Sometimes there is a possibility
that TX skb is available to transmit but there is no tx credits from
MAC-PHY. In this case, there will not be any SPI transfer but the thread
will be running in an endless loop until tx credits available again.

So checking the availability of tx credits along with TX skb will prevent
the above infinite loop. When the tx credits available again that will be
notified through interrupt which will trigger the SPI transfer to get the
available tx credits.

Fixes: 53fbde8ab21e ("net: ethernet: oa_tc6: implement transmit path to transfer tx ethernet frames")
Signed-off-by: Parthiban Veerasooran <parthiban.veerasooran@microchip.com>
---
 drivers/net/ethernet/oa_tc6.c | 5 +++--
 1 file changed, 3 insertions(+), 2 deletions(-)

Comments

Jacob Keller Nov. 20, 2024, 7:54 p.m. UTC | #1
On 11/20/2024 5:51 AM, Parthiban Veerasooran wrote:
> SPI thread wakes up to perform SPI transfer whenever there is an TX skb
> from n/w stack or interrupt from MAC-PHY. Ethernet frame from TX skb is
> transferred based on the availability tx credits in the MAC-PHY which is
> reported from the previous SPI transfer. Sometimes there is a possibility
> that TX skb is available to transmit but there is no tx credits from
> MAC-PHY. In this case, there will not be any SPI transfer but the thread
> will be running in an endless loop until tx credits available again.
> 
> So checking the availability of tx credits along with TX skb will prevent
> the above infinite loop. When the tx credits available again that will be
> notified through interrupt which will trigger the SPI transfer to get the
> available tx credits.
> 
> Fixes: 53fbde8ab21e ("net: ethernet: oa_tc6: implement transmit path to transfer tx ethernet frames")
> Signed-off-by: Parthiban Veerasooran <parthiban.veerasooran@microchip.com>
> ---
>  drivers/net/ethernet/oa_tc6.c | 5 +++--
>  1 file changed, 3 insertions(+), 2 deletions(-)
> 
> diff --git a/drivers/net/ethernet/oa_tc6.c b/drivers/net/ethernet/oa_tc6.c
> index f9c0dcd965c2..4c8b0ca922b7 100644
> --- a/drivers/net/ethernet/oa_tc6.c
> +++ b/drivers/net/ethernet/oa_tc6.c
> @@ -1111,8 +1111,9 @@ static int oa_tc6_spi_thread_handler(void *data)
>  		/* This kthread will be waken up if there is a tx skb or mac-phy
>  		 * interrupt to perform spi transfer with tx chunks.
>  		 */
> -		wait_event_interruptible(tc6->spi_wq, tc6->waiting_tx_skb ||
> -					 tc6->int_flag ||
> +		wait_event_interruptible(tc6->spi_wq, tc6->int_flag ||
> +					 (tc6->waiting_tx_skb &&
> +					 tc6->tx_credits) ||
>  					 kthread_should_stop());
>  

Ok, so previously we check:

waiting_tx_skb || int_flag

Now we check:

int_flag || (waiting_tx_skb && tx_credits) || kthread_should_stop.

We didn't check kthread_should_stop before and this isn't mentioned in
the commit message, (or at least its not clear to me).

Whats the purpose behind that? I guess you want to wake up immediately
when kthread_should_stop() so that we can shutdown the kthread ASAP? Is
the condition "waiting_tx_skb && tx_credits" such that we might
otherwise not wake up, but with just "waiting_tx_skb" we definitely wake
up and stop earlier?

I think that change makes sense but I don't like that it was not called
out in the commit message.

The code seems correct to me otherwise.

>  		if (kthread_should_stop())
Parthiban Veerasooran Nov. 21, 2024, 4:09 a.m. UTC | #2
Hi Jacob Keller,

Thanks for the review.

On 21/11/24 1:24 am, Jacob Keller wrote:
> EXTERNAL EMAIL: Do not click links or open attachments unless you know the content is safe
> 
> On 11/20/2024 5:51 AM, Parthiban Veerasooran wrote:
>> SPI thread wakes up to perform SPI transfer whenever there is an TX skb
>> from n/w stack or interrupt from MAC-PHY. Ethernet frame from TX skb is
>> transferred based on the availability tx credits in the MAC-PHY which is
>> reported from the previous SPI transfer. Sometimes there is a possibility
>> that TX skb is available to transmit but there is no tx credits from
>> MAC-PHY. In this case, there will not be any SPI transfer but the thread
>> will be running in an endless loop until tx credits available again.
>>
>> So checking the availability of tx credits along with TX skb will prevent
>> the above infinite loop. When the tx credits available again that will be
>> notified through interrupt which will trigger the SPI transfer to get the
>> available tx credits.
>>
>> Fixes: 53fbde8ab21e ("net: ethernet: oa_tc6: implement transmit path to transfer tx ethernet frames")
>> Signed-off-by: Parthiban Veerasooran <parthiban.veerasooran@microchip.com>
>> ---
>>   drivers/net/ethernet/oa_tc6.c | 5 +++--
>>   1 file changed, 3 insertions(+), 2 deletions(-)
>>
>> diff --git a/drivers/net/ethernet/oa_tc6.c b/drivers/net/ethernet/oa_tc6.c
>> index f9c0dcd965c2..4c8b0ca922b7 100644
>> --- a/drivers/net/ethernet/oa_tc6.c
>> +++ b/drivers/net/ethernet/oa_tc6.c
>> @@ -1111,8 +1111,9 @@ static int oa_tc6_spi_thread_handler(void *data)
>>                /* This kthread will be waken up if there is a tx skb or mac-phy
>>                 * interrupt to perform spi transfer with tx chunks.
>>                 */
>> -             wait_event_interruptible(tc6->spi_wq, tc6->waiting_tx_skb ||
>> -                                      tc6->int_flag ||
>> +             wait_event_interruptible(tc6->spi_wq, tc6->int_flag ||
>> +                                      (tc6->waiting_tx_skb &&
>> +                                      tc6->tx_credits) ||
>>                                         kthread_should_stop());
>>
> 
> Ok, so previously we check:
> 
> waiting_tx_skb || int_flag
Previously we checked kthread_should_stop also. Previously it was,

waiting_tx_skb || int_flag || kthread_should_stop

Please refer the below link,

https://elixir.bootlin.com/linux/v6.12/source/drivers/net/ethernet/oa_tc6.c#L1114

Now we only added tx_credits with waiting_tx_skb. Hope this clarifies?
> 
> Now we check:
> 
> int_flag || (waiting_tx_skb && tx_credits) || kthread_should_stop.
> 
> We didn't check kthread_should_stop before and this isn't mentioned in
> the commit message, (or at least its not clear to me).
> 
> Whats the purpose behind that? I guess you want to wake up immediately
> when kthread_should_stop() so that we can shutdown the kthread ASAP? Is
> the condition "waiting_tx_skb && tx_credits" such that we might
> otherwise not wake up, but with just "waiting_tx_skb" we definitely wake
> up and stop earlier?
I think there is a misunderstanding here. Hope the above reply clarifies 
this? If not please let me know what do you expect?

Best regards,
Parthiban V
> 
> I think that change makes sense but I don't like that it was not called
> out in the commit message.
> 
> The code seems correct to me otherwise.
> 
>>                if (kthread_should_stop())
>
diff mbox series

Patch

diff --git a/drivers/net/ethernet/oa_tc6.c b/drivers/net/ethernet/oa_tc6.c
index f9c0dcd965c2..4c8b0ca922b7 100644
--- a/drivers/net/ethernet/oa_tc6.c
+++ b/drivers/net/ethernet/oa_tc6.c
@@ -1111,8 +1111,9 @@  static int oa_tc6_spi_thread_handler(void *data)
 		/* This kthread will be waken up if there is a tx skb or mac-phy
 		 * interrupt to perform spi transfer with tx chunks.
 		 */
-		wait_event_interruptible(tc6->spi_wq, tc6->waiting_tx_skb ||
-					 tc6->int_flag ||
+		wait_event_interruptible(tc6->spi_wq, tc6->int_flag ||
+					 (tc6->waiting_tx_skb &&
+					 tc6->tx_credits) ||
 					 kthread_should_stop());
 
 		if (kthread_should_stop())