diff options
Diffstat (limited to 'net/core/netpoll.c')
-rw-r--r-- | net/core/netpoll.c | 13 |
1 files changed, 11 insertions, 2 deletions
diff --git a/net/core/netpoll.c b/net/core/netpoll.c index 02dc2cbcbe8..06be2431753 100644 --- a/net/core/netpoll.c +++ b/net/core/netpoll.c | |||
@@ -193,6 +193,17 @@ void netpoll_poll_dev(struct net_device *dev) | |||
193 | 193 | ||
194 | poll_napi(dev); | 194 | poll_napi(dev); |
195 | 195 | ||
196 | if (dev->priv_flags & IFF_SLAVE) { | ||
197 | if (dev->npinfo) { | ||
198 | struct net_device *bond_dev = dev->master; | ||
199 | struct sk_buff *skb; | ||
200 | while ((skb = skb_dequeue(&dev->npinfo->arp_tx))) { | ||
201 | skb->dev = bond_dev; | ||
202 | skb_queue_tail(&bond_dev->npinfo->arp_tx, skb); | ||
203 | } | ||
204 | } | ||
205 | } | ||
206 | |||
196 | service_arp_queue(dev->npinfo); | 207 | service_arp_queue(dev->npinfo); |
197 | 208 | ||
198 | zap_completion_queue(); | 209 | zap_completion_queue(); |
@@ -313,9 +324,7 @@ void netpoll_send_skb_on_dev(struct netpoll *np, struct sk_buff *skb, | |||
313 | tries > 0; --tries) { | 324 | tries > 0; --tries) { |
314 | if (__netif_tx_trylock(txq)) { | 325 | if (__netif_tx_trylock(txq)) { |
315 | if (!netif_tx_queue_stopped(txq)) { | 326 | if (!netif_tx_queue_stopped(txq)) { |
316 | dev->priv_flags |= IFF_IN_NETPOLL; | ||
317 | status = ops->ndo_start_xmit(skb, dev); | 327 | status = ops->ndo_start_xmit(skb, dev); |
318 | dev->priv_flags &= ~IFF_IN_NETPOLL; | ||
319 | if (status == NETDEV_TX_OK) | 328 | if (status == NETDEV_TX_OK) |
320 | txq_trans_update(txq); | 329 | txq_trans_update(txq); |
321 | } | 330 | } |