Re: [PATCH net v4] usbnet: fix EVENT_RX_PAUSED race in usbnet_skb_return()

From: Jakub Kicinski

Date: Fri Oct 23 2026 - 17:16:30 EST


On Tue, 20 Oct 2026 18:29:09 +0300 Ömer Mete Kaya wrote:
> struct sk_buff *skb;
> int num = 0;
> + unsigned long flags;

reverse xmas tree ordering please

> local_bh_disable();
> + spin_lock_irqsave(&dev->rxq_pause.lock, flags);
> clear_bit(EVENT_RX_PAUSED, &dev->flags);
> -
> - while ((skb = skb_dequeue(&dev->rxq_pause)) != NULL) {
> + while ((skb = __skb_dequeue(&dev->rxq_pause)) != NULL) {
> + spin_unlock_irqrestore(&dev->rxq_pause.lock, flags);
> usbnet_skb_return(dev, skb);
> + spin_lock_irqsave(&dev->rxq_pause.lock, flags);
> num++;
> }
> -
> + spin_unlock_irqrestore(&dev->rxq_pause.lock, flags);

The retaking of the lock in the loop looks ugly / unnecessary to me

struct sk_buff_head q;
struct sk_buff *skb;
unsigned long flags;
int num = 0;

__skb_queue_head_init(&q);

local_bh_disable();
spin_lock_irqsave(&dev->rxq_pause.lock, flags);
clear_bit(EVENT_RX_PAUSED, &dev->flags);
skb_queue_splice_init(&dev->rxq_pause, &q);
spin_unlock_irqrestore(&dev->rxq_pause.lock, flags);

while ((skb = __skb_dequeue(&q))) {
usbnet_skb_return(dev, skb);
num++;
}
--
pw-bot: cr