--- linux/net/core/dev.c.orig2 +++ linux/net/core/dev.c @@ -1903,7 +1903,7 @@ static void net_rx_action(struct softirq { struct softnet_data *queue = &__get_cpu_var(softnet_data); unsigned long start_time = jiffies; - int budget = netdev_max_backlog; + int budget = netdev_max_backlog, loops; local_irq_disable(); @@ -1926,7 +1926,10 @@ static void net_rx_action(struct softirq dev = list_entry(queue->poll_list.next, struct net_device, poll_list); - if (dev->quota <= 0 || dev->poll(dev, &budget)) { + loops = 1; + if (dev->quota <= 0 || dev->poll(dev, &loops)) { + if (loops < 1) + budget--; local_irq_disable(); list_del(&dev->poll_list); list_add_tail(&dev->poll_list, &queue->poll_list);