Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

tsnep: Fix TX queue stop/wake for multiple queues

netif_stop_queue() and netif_wake_queue() act on TX queue 0. This is ok
as long as only a single TX queue is supported. But support for multiple
TX queues was introduced with 762031375d5c and I missed to adapt stop
and wake of TX queues.

Use netif_stop_subqueue() and netif_tx_wake_queue() to act on specific
TX queue.

Fixes: 762031375d5c ("tsnep: Support multiple TX/RX queue pairs")
Signed-off-by: Gerhard Engleder <gerhard@engleder-embedded.com>
Link: https://lore.kernel.org/r/20230124191440.56887-1-gerhard@engleder-embedded.com
Signed-off-by: Jakub Kicinski <kuba@kernel.org>

authored by

Gerhard Engleder and committed by
Jakub Kicinski
3d53aaef 6c4ca03b

+9 -6
+9 -6
drivers/net/ethernet/engleder/tsnep_main.c
··· 450 450 /* ring full, shall not happen because queue is stopped if full 451 451 * below 452 452 */ 453 - netif_stop_queue(tx->adapter->netdev); 453 + netif_stop_subqueue(tx->adapter->netdev, tx->queue_index); 454 454 455 455 spin_unlock_irqrestore(&tx->lock, flags); 456 456 ··· 493 493 494 494 if (tsnep_tx_desc_available(tx) < (MAX_SKB_FRAGS + 1)) { 495 495 /* ring can get full with next frame */ 496 - netif_stop_queue(tx->adapter->netdev); 496 + netif_stop_subqueue(tx->adapter->netdev, tx->queue_index); 497 497 } 498 498 499 499 spin_unlock_irqrestore(&tx->lock, flags); ··· 503 503 504 504 static bool tsnep_tx_poll(struct tsnep_tx *tx, int napi_budget) 505 505 { 506 + struct tsnep_tx_entry *entry; 507 + struct netdev_queue *nq; 506 508 unsigned long flags; 507 509 int budget = 128; 508 - struct tsnep_tx_entry *entry; 509 - int count; 510 510 int length; 511 + int count; 512 + 513 + nq = netdev_get_tx_queue(tx->adapter->netdev, tx->queue_index); 511 514 512 515 spin_lock_irqsave(&tx->lock, flags); 513 516 ··· 567 564 } while (likely(budget)); 568 565 569 566 if ((tsnep_tx_desc_available(tx) >= ((MAX_SKB_FRAGS + 1) * 2)) && 570 - netif_queue_stopped(tx->adapter->netdev)) { 571 - netif_wake_queue(tx->adapter->netdev); 567 + netif_tx_queue_stopped(nq)) { 568 + netif_tx_wake_queue(nq); 572 569 } 573 570 574 571 spin_unlock_irqrestore(&tx->lock, flags);