diff options
-rw-r--r-- | include/net/sch_generic.h | 8 | ||||
-rw-r--r-- | net/core/link_watch.c | 15 |
2 files changed, 13 insertions, 10 deletions
diff --git a/include/net/sch_generic.h b/include/net/sch_generic.h index 8cfdaebbbab3..bf8f7264a778 100644 --- a/include/net/sch_generic.h +++ b/include/net/sch_generic.h | |||
@@ -242,6 +242,14 @@ static inline bool qdisc_all_tx_empty(const struct net_device *dev) | |||
242 | return (q->q.qlen == 0); | 242 | return (q->q.qlen == 0); |
243 | } | 243 | } |
244 | 244 | ||
245 | /* Are any of the TX qdiscs changing? */ | ||
246 | static inline bool qdisc_tx_changing(struct net_device *dev) | ||
247 | { | ||
248 | struct netdev_queue *txq = &dev->tx_queue; | ||
249 | |||
250 | return (txq->qdisc != txq->qdisc_sleeping); | ||
251 | } | ||
252 | |||
245 | static inline int __qdisc_enqueue_tail(struct sk_buff *skb, struct Qdisc *sch, | 253 | static inline int __qdisc_enqueue_tail(struct sk_buff *skb, struct Qdisc *sch, |
246 | struct sk_buff_head *list) | 254 | struct sk_buff_head *list) |
247 | { | 255 | { |
diff --git a/net/core/link_watch.c b/net/core/link_watch.c index 50218218445b..bf8f7af699d7 100644 --- a/net/core/link_watch.c +++ b/net/core/link_watch.c | |||
@@ -77,12 +77,10 @@ static void rfc2863_policy(struct net_device *dev) | |||
77 | } | 77 | } |
78 | 78 | ||
79 | 79 | ||
80 | static int linkwatch_urgent_event(struct net_device *dev) | 80 | static bool linkwatch_urgent_event(struct net_device *dev) |
81 | { | 81 | { |
82 | struct netdev_queue *txq = &dev->tx_queue; | ||
83 | |||
84 | return netif_running(dev) && netif_carrier_ok(dev) && | 82 | return netif_running(dev) && netif_carrier_ok(dev) && |
85 | txq->qdisc != txq->qdisc_sleeping; | 83 | qdisc_tx_changing(dev); |
86 | } | 84 | } |
87 | 85 | ||
88 | 86 | ||
@@ -182,12 +180,9 @@ static void __linkwatch_run_queue(int urgent_only) | |||
182 | 180 | ||
183 | rfc2863_policy(dev); | 181 | rfc2863_policy(dev); |
184 | if (dev->flags & IFF_UP) { | 182 | if (dev->flags & IFF_UP) { |
185 | if (netif_carrier_ok(dev)) { | 183 | if (netif_carrier_ok(dev)) |
186 | struct netdev_queue *txq = &dev->tx_queue; | ||
187 | |||
188 | WARN_ON(txq->qdisc_sleeping == &noop_qdisc); | ||
189 | dev_activate(dev); | 184 | dev_activate(dev); |
190 | } else | 185 | else |
191 | dev_deactivate(dev); | 186 | dev_deactivate(dev); |
192 | 187 | ||
193 | netdev_state_change(dev); | 188 | netdev_state_change(dev); |
@@ -218,7 +213,7 @@ static void linkwatch_event(struct work_struct *dummy) | |||
218 | 213 | ||
219 | void linkwatch_fire_event(struct net_device *dev) | 214 | void linkwatch_fire_event(struct net_device *dev) |
220 | { | 215 | { |
221 | int urgent = linkwatch_urgent_event(dev); | 216 | bool urgent = linkwatch_urgent_event(dev); |
222 | 217 | ||
223 | if (!test_and_set_bit(__LINK_STATE_LINKWATCH_PENDING, &dev->state)) { | 218 | if (!test_and_set_bit(__LINK_STATE_LINKWATCH_PENDING, &dev->state)) { |
224 | dev_hold(dev); | 219 | dev_hold(dev); |