|
@@ -184,10 +184,22 @@ static inline int qdisc_restart(struct net_device *dev)
|
|
|
|
|
|
void __qdisc_run(struct net_device *dev)
|
|
|
{
|
|
|
- do {
|
|
|
- if (!qdisc_restart(dev))
|
|
|
+ unsigned long start_time = jiffies;
|
|
|
+
|
|
|
+ while (qdisc_restart(dev)) {
|
|
|
+ if (netif_queue_stopped(dev))
|
|
|
+ break;
|
|
|
+
|
|
|
+ /*
|
|
|
+ * Postpone processing if
|
|
|
+ * 1. another process needs the CPU;
|
|
|
+ * 2. we've been doing it for too long.
|
|
|
+ */
|
|
|
+ if (need_resched() || jiffies != start_time) {
|
|
|
+ netif_schedule(dev);
|
|
|
break;
|
|
|
- } while (!netif_queue_stopped(dev));
|
|
|
+ }
|
|
|
+ }
|
|
|
|
|
|
clear_bit(__LINK_STATE_QDISC_RUNNING, &dev->state);
|
|
|
}
|