Commit da2522df authored by Jinliang Wang's avatar Jinliang Wang Committed by Jakub Kicinski
Browse files

net: mctp: Fix tx queue stall



The tx queue can become permanently stuck in a stopped state due to a
race condition between the URB submission path and its completion
callback.

The URB completion callback can run immediately after usb_submit_urb()
returns, before the submitting function calls netif_stop_queue(). If
this occurs, the queue state management becomes desynchronized, leading
to a stall where the queue is never woken.

Fix this by moving the netif_stop_queue() call to before submitting the
URB. This closes the race window by ensuring the network stack is aware
the queue is stopped before the URB completion can possibly run.

Fixes: 0791c032 ("net: mctp: Add MCTP USB transport driver")
Signed-off-by: default avatarJinliang Wang <jinliangw@google.com>
Acked-by: default avatarJeremy Kerr <jk@codeconstruct.com.au>
Link: https://patch.msgid.link/20251027065530.2045724-1-jinliangw@google.com


Signed-off-by: default avatarJakub Kicinski <kuba@kernel.org>
parent 53110232
Loading
Loading
Loading
Loading
+5 −3
Original line number Diff line number Diff line
@@ -96,11 +96,13 @@ static netdev_tx_t mctp_usb_start_xmit(struct sk_buff *skb,
			  skb->data, skb->len,
			  mctp_usb_out_complete, skb);

	/* Stops TX queue first to prevent race condition with URB complete */
	netif_stop_queue(dev);
	rc = usb_submit_urb(urb, GFP_ATOMIC);
	if (rc)
	if (rc) {
		netif_wake_queue(dev);
		goto err_drop;
	else
		netif_stop_queue(dev);
	}

	return NETDEV_TX_OK;