Re: [PATCH net v2 3/3] net: nixge: fix tx queue handling
From: Zhang Changzhong
Date: Wed Nov 16 2022 - 03:56:08 EST
On 2022/11/16 7:04, Francois Romieu wrote:
> Zhang Changzhong <zhangchangzhong@xxxxxxxxxx> :
>> Currently the driver check for available space at the beginning of
>> nixge_start_xmit(), and when there is not enough space for this packet,
>> it returns NETDEV_TX_OK, which casues packet loss and memory leak.
>>
>> Instead the queue should be stopped after the packet is added to the BD
>> when there may not be enough space for next packet. In addition, the
>> queue should be wakeup only if there is enough space for a packet with
>> max frags.
>>
>> Fixes: 492caffa8a1a ("net: ethernet: nixge: Add support for National Instruments XGE netdev")
>> Signed-off-by: Zhang Changzhong <zhangchangzhong@xxxxxxxxxx>
>> ---
>> drivers/net/ethernet/ni/nixge.c | 54 +++++++++++++++++++++++++++++------------
>> 1 file changed, 38 insertions(+), 16 deletions(-)
>>
>> diff --git a/drivers/net/ethernet/ni/nixge.c b/drivers/net/ethernet/ni/nixge.c
>> index 91b7ebc..3776a03 100644
>> --- a/drivers/net/ethernet/ni/nixge.c
>> +++ b/drivers/net/ethernet/ni/nixge.c
> [...]
>> static netdev_tx_t nixge_start_xmit(struct sk_buff *skb,
>> @@ -518,10 +523,15 @@ static netdev_tx_t nixge_start_xmit(struct sk_buff *skb,
>> cur_p = &priv->tx_bd_v[priv->tx_bd_tail];
>> tx_skb = &priv->tx_skb[priv->tx_bd_tail];
>>
>> - if (nixge_check_tx_bd_space(priv, num_frag + 1)) {
>> - if (!netif_queue_stopped(ndev))
>> - netif_stop_queue(ndev);
>> - return NETDEV_TX_OK;
>> + if (unlikely(nixge_check_tx_bd_space(priv, num_frag + 1))) {
>> + /* Should not happen as last start_xmit call should have
>> + * checked for sufficient space and queue should only be
>> + * woken when sufficient space is available.
>> + */
>
> Almost. IRQ triggering after nixge_start_xmit::netif_stop_queue and
> before nixge_start_xmit::smp_mb may wrongly wake queue.
>
I don't know what you mean by "wronly wake queue". The queue is woken
only when there is sufficient for next packet.
> Call me timorous but I would feel more confortable if this code could
> be tested on real hardware before being fed into -net.
>
I agree with you, hope someone can test and correct it.
Thanks,
Changzhong